实操工作坊:三个小时做出可玩的片段
附录 A · 动手

实操工作坊:三个小时做出可玩的片段

三个小项目,把前面所有系统串起来:一扇需要钥匙的门、一张能读的纸条、一段会记住你选择的对话。每个都给出节点顺序与验证方法。

跟着做 3 个项目 含验证步骤

读到这里,你已经知道每个零件是干什么的了。但“知道”和“做过”是两件事。 这一页给三个递进的小项目,每个都能在 40 分钟内做完,做完你就真正拥有了一套可复用的做法。

做之前:建一个自己的文件夹

在内容浏览器里新建 MyGame 文件夹,所有你自己的蓝图都放这里。 永远不要直接修改 StoryFramework 目录下的原始资产—— 下次更新框架时,你的改动会被覆盖,而且很难排查。

项目一:一扇需要钥匙的门

用到的系统:交互(Has Item)→ 背包(消耗道具)→ 通知(告诉玩家发生了什么)→ 音效。

准备素材

  • 一个门框 + 一扇门的静态网格(引擎自带 Cube 也行,先跑通逻辑再换美术);
  • 一个钥匙道具(用第 1 章做的 BP_MyFirstItem 复制一份,改名 BP_Key);

做门

  1. 新建蓝图 父类选 InteractableBase_BP,命名 BP_Door,放进 MyGame。
  2. 添加门的网格 在组件面板加一个 Static Mesh 组件(门扇),把碰撞设为 BlockAll。 父类自带的那个网格可以留空或删掉。
  3. 设置交互数据 细节面板 → Interaction Data: Object Name = “上锁的门”; Primary Interaction Method = Has Item; Inventory Items 加一条:名称填钥匙的 Object Name(必须一字不差),数量 1; Consume Items 勾上(开门消耗钥匙); Prompt Item Data 可选,填了玩家就能看到“需要:钥匙”的图标。
  4. 写逻辑 打开事件图表,添加 Event Interacted With,接 Switch on String:
    • Found 分支 → 播放开门音效 → 用 时间轴(Timeline)把门旋转 90° → 播放“门开了”的提示;
    • Not Found 分支 → 播放“锁住了”的音效 → 弹一个通知“需要一把钥匙”。
  5. 让门永久打开 开门后把交互方式设为 None(或给门加 SoftLocked 标签),避免玩家反复“开”同一扇门。

验证

操作预期
没有钥匙时看向门提示里显示“需要:钥匙”
没有钥匙时按交互播放锁住音效 + 弹出通知,门不动
拿到钥匙后按交互钥匙从背包消失,门旋转打开
再次看向门没有提示(已锁死交互)

项目二:一张能读的纸条

用到的系统:交互(Inspect / Readable)→ 日志(记录线索)→ 任务更新。

做纸条

  1. 新建蓝图 父类 InteractableBase_BP,命名 BP_Note。网格用一张薄薄的平面(Plane)。
  2. 配置为可阅读 交互数据里: Object Name = “实验记录”; Primary Interaction Method = Inspect; Inspect Method = Readable(只看文字)或 3D Inspect + Readable(既能看到纸、又能翻页); Readable Text Pages = 把正文按页填进去,每页一段; Readable Text Color 按背景纸色调整,保证对比度。
  3. 读完记进日志 在 Event Interacted With 里调用 Inventory Manager 的 Add Journal Entry, 填条目名(与纸条同名方便对应)、描述、一个模型(可以就用这张纸的网格)、以及距镜头距离。
  4. 顺便推进任务 如果这张纸条是任务线索:调 Edit Consequential Tags 打标记 ReadNote, 再用 Edit Target Main Task in Queue 把任务标题改成“已找到记录,回去汇报”。
一个体验细节

玩家读完之后,纸条还留在地上(因为不是拾取)。这符合直觉:你读过它,但它不会消失。 如果剧情需要“把纸条带走”,再加一个 Inspect + Can Item be Picked Up when Inspecting 勾选即可。

验证

  • 看向纸条 → 提示出现 → 按键 → 进入阅读界面;
  • 多页时能翻页,最后一页能正常退出;
  • 打开日志 → 出现新条目 → 能 3D 查看;
  • 右上角任务文字已更新。

项目三:会记住你选择的对话

用到的系统:对话(数据表)→ 剧情标记 → 回忆录 → 故事选择。

目标

一个 NPC 问你“要不要打开闸门”。选“打开” → 世界变亮、回忆录多一条、之后这个 NPC 会说不同的话; 选“不打开” → 另一条分支。这就是最小可用的“选择有后果”。

  1. 复制一个示例 NPC 找到示例里任意 NPCInteractableBase 的子类,复制到自己文件夹,改名 BP_NPC_Keeper。 这样 ID、对话资产、镜头都配好了,你只改内容。
  2. 写第一段对话 在它的对话数据表里,{initial} 那段:字幕写“闸门后面很危险,你确定要开吗?”, 选项两条:「打开闸门」/「先不了」。
  3. 给选项打标记 给「打开闸门」这个选项加 Con Tag = OpenedGate; 给「先不了」加 DeclinedGate。这一步不需要写任何蓝图。
  4. 做后果(世界变化) 在关卡蓝图里绑定 On Dialogue Reply,Switch on String 匹配“打开闸门”: 调用相机管理器的 Look At Target Once 看向闸门 → 播放开门动画 → 调 Inventory Manager 的 Edit Consequential Tags 再打一个标记 GateOpen(给后续剧情用)。
  5. 做后果(回忆录) 在 MemoirEntry_DT 加一行:Target Consequential Tag = GateOpen, 填描述与配图。玩家打开闸门后,回忆录自动多一条。
  6. 做后果(下次见面) 在同一张对话表里再加一段对话,SelectOnReply = OpenedGate, 字幕写“你终究还是开了它。”—— 玩家第二次和 NPC 说话,就会自动进入这段。
  7. (进阶)用 Story Choice 替代普通选项 如果你想让这个决定更有“仪式感”:把上面第 2 步的选项换成一次 CreateStoryChoice 调用,配上镜头机位和 15 秒倒计时,选择后画面淡出再淡入。

验证

操作预期
第一次对话选“打开”镜头转向闸门、动画播放、回忆录出现新条目
再次对话NPC 直接说“你终究还是开了它”
重开一局选“先不了”没有回忆录、NPC 台词不同、闸门没开
存档后读档标记仍在,NPC 仍记得你的选择
别忘了测“坏路径”

叙事游戏 80% 的 Bug 出在“玩家不按套路玩”: 对话中途存档、选择后立刻退出、重复和 NPC 说话、先做任务后接任务。 每做完一个分支,就用最笨的方式乱点一遍。这比事后修 Bug 便宜得多。

做完这三个,你就掌握了

能力来源
用交互数据配置物体,而不写代码项目一
用剧情标记把“做过的事”变成“世界的变化”项目三
把交互、背包、日志、任务串成一条流程项目一 + 二
设计有后果的分支,并让它被记住项目三
用触发器与字幕做演出项目二 + 第三章触发器

接下来就是“堆内容”的阶段了:更多的房间、更多的道具、更多的对话。 SF 已经把地基打好了,剩下的工作量取决于你的故事有多大。

回头查速查表 →

本页由官方英文文档(visualonecompany.gitbook.io)整理、翻译并重排,并补充了第三方教程(Jay Versluis)与面向 UE 新手的解释性内容。产品版权归 VisualOne Projects 所有;本手册为学习用途的非官方中文资料,与作者无隶属关系。

如有疑问,官方支持渠道:Discord 社区 · Fab 商店页