Roblox: 参照動画の内容を再現する
ユーザーの基準は 「動画と全く同じ」 です。創作エフェクトやメカニクス、硬いアニメーション、動画にない装飾は拒否されます。ここでの全ては、参照動画に忠実に、それに照らして検証することに重点を置いています。記憶ではなく、参照を基にしてください。
ツール: Roblox Studio MCP (execute_luau, search_asset, insert_asset, upload_image, screen_capture, start_stop_play, user_keyboard_input, user_mouse_input, get_console_output, multi_edit)、Blender MCP (execute_blender_code — フレーム抽出とVFX作成)、PowerShell/Bash。
0. 基本ルール
- 動画に表示されているものだけを再現します。曖昧な場合は、さらにフレームを確認します。それでも不明な場合は、質問してください。自分のアイデアで穴埋めしないでください。
- テクスチャ/画像: 自分で描かないでください。まず Creator Store を使用します。近いものが何もない場合は、参照からBlenderでアセットを作成し(§4)、その旨をユーザーに伝えてください。
- デフォルトのトリガーはキー押下です(指定がない場合は確認してください)。
- リクエストのない余計な演出(回転、漫画的なひっくり返り)は禁止です。ユーザーが明示的に嫌がっています。
- メカニクス、感触、エフェクトはコピーしますが、別のゲームのブランド名、名前、UIアート、流用アセットはコピーせず、既存のゲーム全体を複製しないでください。別のゲームと同一のゲームを作るよう依頼された場合は、表示されている特定のメカニクス/エフェクトを再現し、その旨を伝えてください。
1. フレームを抽出して研究する
- Blender 経由でフレームをレンダリングします(ffmpeg は通常ありません):
scripts/extract_frames.pyをVIDEO/OUTを設定してexecute_blender_codeに送信します。使い捨てシーンを使用し、ユーザーの .blend ファイルには触れません。Windows ではOUTを短く保ちます(MAX_PATH)。 scripts/contact_sheet.ps1 -Dir <OUT>→ 4×4 のラベル付きシート。すべてのシートを読み、カット、インパクト、UI変更、入力があるたびに単一フレームを開きます。高速なメカニクスの場合は、測定したい瞬間の周辺でSTEP = 1を使用します。- 何を構築するか決定します: VFX/カットシーン、ゲームプレイシステム、または 両方(ほとんどの戦闘技は両方です。何が起こるかを決定するシステムと、それを表示するVFX)。
- 構築前に仕様を書きます。後で照合する基準となります。
- ビートシート(VFX): 拍ごとに1行、時間(フレーム/fps)、カメラ、すべてのエフェクト(形状、色、テクスチャ、サイズ、寿命、数)、各キャラクターのポーズ、ポストプロセッシングを含めます。
- システム仕様(メカニクス): 入力、状態と遷移、タイミング(予備/アクティブ/リカバリ/クールダウンをフレーム単位で)、距離と速度(約5スタッドのR15ボディに対して測定)、画面上の数字、UIとそのアニメーション、他のプレイヤーから見えるもの。
references/systems.mdを参照してください。
2. プレイスを調査する
search_game_tree と Lighting、StarterPlayer、ReplicatedStorage、ServerScriptService の簡単なダンプを使用します。ユーザーの既存のフレームワーク(戦闘モジュール、リモート、データストア、UIキット)を並行して構築するのではなく再利用し、コードスタイルに合わせます。
3. Creator Store からのアセット
search_asset(スコープcreator_store、priceFilter: free)を各要素に対して3~5の言い回しで使用します。候補を視覚的に比較します:scripts/asset_sheet.ps1はラベル付きサムネイルシートを生成し、参照フレームと並べて読むことができます。- Decal アセットID は画像ID ではありません。パーティクル/GUI で使用する前に、
game:GetObjects("rbxassetid://"..id)[1].Texture(Edit datamodel)で解決してください。 - フリーモデルにはバックドアが含まれていることがよくあります。 Model を挿入した後、すべての
LuaSourceContainerをリストアップし、必要なものだけを残して残りは破棄します。 - 実際のアバターをダミー/敵として使用する:
Players:CreateHumanoidModelFromUserId(Players:GetUserIdFromNameAsync(name))が Edit から動作します。HRP を固定し、足を床に置き、Animate 以外のスクリプトを削除します。
4. Blender で VFX を構築するタイミング
デフォルトでは Roblox ネイティブエフェクト(パーティクル、ビーム、トレイル、パーツ、GUI)を使用します。安価で調整可能、ライブレンダリングされます。参照がネイティブではうまく近似できないものを示している場合に Blender に移行します。
| 参照が示すもの | Blender 出力 | Roblox への取り込み方法 |
|---|---|---|
| 厚みのある3Dスラッシュ三日月、ツイストスパイラル、衝撃波ドーム、スパイク、深みのある地面の亀裂 | UV付きメッシュ(+ グラデーション/ノイズテクスチャ) | エクスポートデータから構築された EditableMesh、または 3D Importer |
| 手描き/アニメ調の煙、火、爆発、エネルギーバースト、インパクトフレーム | レンダリングされたフリップブックスプライトシート(透明PNG) | upload_image → ParticleEmitter フリップブック / ImageLabel |
| 複雑なテクスチャ(ノイズトレイル、グラデーションランプ、スワールマップ) | レンダリングされたPNG | upload_image → Beam/Trail/Texture |
パイプライン(シーン設定、フリップブックレンダリング + グリッドパッキング、メッシュの Luau へのエクスポート、localhost アップロード、EditableMesh ビルダー、タイムラインでのメッシュアニメーション)については references/blender_vfx.md を参照してください。
5. 構築する
- VFX / カットシーン: タイムライン(イベント、カメラショット、フレームごとのアップデータ、タイムライン時間遅延、ワープゾーン、ポーズ)とクリーンアップスタック、およびキャスターとターゲットのキーフレームボディによって駆動される1つのクライアント ModuleScript。
references/engine.mdの骨格をコピーします。 - システム: サーバー権限モデル。クライアントは RemoteEvent を介して意図を送信し、サーバーが検証(クールダウン、状態、範囲、レート制限)して結果を適用し、クライアントがフィードバックをレンダリングします。フォルダレイアウトとシステムごとのレシピは
references/systems.mdにあります。 - 両方: サーバーがヒット/ダメージ/状態を決定してクライアントに発火します。各クライアントが VFX モジュールを再生します。タイミングは共有設定に保持し、メカニクスとビジュアルが同期したままになるようにします。
6. 生き生きとしたアニメーション
静止ポーズは「ブン」と読まれます。効果的な方法:
- ポーズではなくキーフレームトラック — キャラクターあたり数十のキー。各キー = ポーズ + オーバーライド + イージング でその状態に入る。
- すべての攻撃: 予備動作 (Quad.In) → ストライク (Exponential.Out、40~70ms) → オーバーシュート (Quad) → 落ち着き (Sine.InOut)。ターゲットへのすべてのヒット: 反動キー + 減衰するシェイクインパルス。
- フレームごとに付加的な生命を追加: 呼吸、すべての関節のゆっくりとしたノイズドリフト、ヒットシェイク、震え。
- ターゲットにパフォーマンスを与える(驚き、反動、よろめき、倒れ込み: 膝、手、側面)。動画にない限り宙返りは禁止。
- ストーリービートを動画のカットに合わせます。ペースについて尋ね、
TimeWarpゾーンを使用してセクションを遅くします。
7. 参照と照合する
- プレイテスト。タイムライン:
PauseAtでステップし、各ビートを対応する参照フレームと並べてスクリーンショットします。システム:user_keyboard_input/user_mouse_inputで入力をドライブし、ClientとServerの両方のデータモデルから状態を読み取り、仕様に対してタイミング(os.clock)と距離を測定します。印象ではなく数値で。 - デバッグカメラは
Enum.RenderPriority.Last.Valueで。ポーズ中はパーティクルをクリア/ビームとGUIを無効にしてボディを表示します。 execute_luauは独自のVMで実行されます:requireは別のモジュールインスタンスを与えます。モジュールフィールドではなく、ゲーム状態(属性、アンカー、CameraType)を監視します。- 実際の入力で終了し、クリーンアップ/復元とクリーンな
get_console_outputを確認します。
8. 落とし穴
構築前に references/gotchas.md を読んでください — 不可視の1セグメントビーム、暗いハローフレア、DepthOfField のぼかし、Expo と Exponential の違い、PreSimulation で書き込まれたときのみレンダリングされるジョイントトランスフォーム、AnimationConstraint リグ、ボディサイズスケーリング + フロアクランプ、地形の水深、水面に反射するオーバーレイ、ネットワークの落とし穴など。
9. レポート
各ビート/メカニクスが現在何を行っているか(タイムスタンプまたは状態ごと)、使用されたアセット(ストアID、Blenderで作成されたアセットとそのアップロードID)、一致させることができなかったものとその理由、調整可能なパラメータの場所(設定モジュール、Cutscene.Poses/Tracks、TimeWarp)、およびプレイスを保存する(Ctrl+S)ように促すメッセージ。