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发送到execute_blender_code,并设置VIDEO/OUT。它使用一个一次性场景,不会改动用户的 .blend 文件。在 Windows 上保持OUT路径简短(MAX_PATH)。 scripts/contact_sheet.ps1 -Dir <OUT>→ 4×4 带标签的缩略图。阅读所有缩略图,然后在每次剪辑、碰撞、UI 变化和输入处打开单帧。对于快速机制,在您测量的时刻附近使用STEP = 1。- 决定你要构建的内容:VFX/过场动画、游戏系统或两者兼有(大多数战斗动作兼具两者:一个决定发生什么的系统 + 展示效果的 VFX)。
- 在构建之前编写规格——这是你之后验证的依据:
- 节拍表(VFX):每个节拍一行,包含时间(帧/帧率)、摄像机、每个效果(形状、颜色、纹理、大小、生命周期、数量)、每个角色的姿态、后处理。
- 系统规格(机制):输入、状态和转换、时间(前摇/生效/后摇/冷却以帧为单位)、距离和速度(针对约 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(编辑数据模型)解析。 - 免费模型通常包含后门。 插入 Model 后,列出每个
LuaSourceContainer;只保留需要的,销毁其余部分。 - 作为虚拟角色/敌人的真实化身:在编辑模式下使用
Players:CreateHumanoidModelFromUserId(Players:GetUserIdFromNameAsync(name))。锚定 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 |
阅读 references/blender_vfx.md 了解流程(场景设置、翻页书渲染 + 网格打包、网格导出到 Luau、本地主机上传、EditableMesh 构建器、在时间轴中动画化网格)。
5. 构建
- VFX / 过场动画:一个由时间线驱动的客户端 ModuleScript(事件、摄像机镜头、逐帧更新器、时间线时间延迟、扭曲区域、暂停),并附带清理栈,以及施法者和目标的键控身体。复制
references/engine.md中的骨架。 - 系统:服务器权威——客户端通过 RemoteEvent 发送意图,服务器验证(冷却、状态、范围、速率限制)并应用结果,客户端渲染反馈。文件夹布局和每个系统的配方在
references/systems.md中。 - 两者兼备:服务器决定命中/伤害/状态并触发客户端;每个客户端播放 VFX 模块。将时间信息保存在一个共享配置中,以便机制和视觉效果保持同步。
6. 让动画栩栩如生
静态姿势读作“乏味”。有效的方法:
- 关键帧轨迹,而不是姿势——每个角色数十个关键帧;每个关键帧 = 姿势 + 覆盖 + 进入它的缓动。
- 每次攻击:预期(Quad.In)→ 打击(Exponential.Out,40-70 毫秒)→ 过冲(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、关节变换仅在预模拟阶段写入时渲染、AnimationConstraint 骨架、身体缩放 + 地面夹紧、地形水深、水面倒影中的叠加、网络同步陷阱等。
9. 报告
说明每个节拍/机制现在的效果(带时间戳或按状态),使用了哪些资源(商店 ID、Blender 制作的资源和上传 ID),任何无法匹配的内容及原因,可调参数所在位置(配置模块、Cutscene.Poses/Tracks、TimeWarp),并提醒保存场景(Ctrl+S)。