实操工作坊:三个小时做出可玩的片段
三个小项目,把前面所有系统串起来:一扇需要钥匙的门、一张能读的纸条、一段会记住你选择的对话。每个都给出节点顺序与验证方法。
读到这里,你已经知道每个零件是干什么的了。但“知道”和“做过”是两件事。 这一页给三个递进的小项目,每个都能在 40 分钟内做完,做完你就真正拥有了一套可复用的做法。
在内容浏览器里新建 MyGame 文件夹,所有你自己的蓝图都放这里。
永远不要直接修改 StoryFramework 目录下的原始资产——
下次更新框架时,你的改动会被覆盖,而且很难排查。
项目一:一扇需要钥匙的门
用到的系统:交互(Has Item)→ 背包(消耗道具)→ 通知(告诉玩家发生了什么)→ 音效。
准备素材
- 一个门框 + 一扇门的静态网格(引擎自带 Cube 也行,先跑通逻辑再换美术);
- 一个钥匙道具(用第 1 章做的
BP_MyFirstItem复制一份,改名BP_Key);
做门
-
新建蓝图
父类选
InteractableBase_BP,命名BP_Door,放进MyGame。 -
添加门的网格
在组件面板加一个
Static Mesh组件(门扇),把碰撞设为BlockAll。 父类自带的那个网格可以留空或删掉。 -
设置交互数据
细节面板 →
Interaction Data:Object Name= “上锁的门”;Primary Interaction Method=Has Item;Inventory Items加一条:名称填钥匙的Object Name(必须一字不差),数量 1;Consume Items勾上(开门消耗钥匙);Prompt Item Data可选,填了玩家就能看到“需要:钥匙”的图标。 -
写逻辑
打开事件图表,添加
Event Interacted With,接Switch on String:Found分支 → 播放开门音效 → 用 时间轴(Timeline)把门旋转 90° → 播放“门开了”的提示;Not Found分支 → 播放“锁住了”的音效 → 弹一个通知“需要一把钥匙”。
-
让门永久打开
开门后把交互方式设为
None(或给门加SoftLocked标签),避免玩家反复“开”同一扇门。
验证
| 操作 | 预期 |
|---|---|
| 没有钥匙时看向门 | 提示里显示“需要:钥匙” |
| 没有钥匙时按交互 | 播放锁住音效 + 弹出通知,门不动 |
| 拿到钥匙后按交互 | 钥匙从背包消失,门旋转打开 |
| 再次看向门 | 没有提示(已锁死交互) |
项目二:一张能读的纸条
用到的系统:交互(Inspect / Readable)→ 日志(记录线索)→ 任务更新。
做纸条
-
新建蓝图
父类
InteractableBase_BP,命名BP_Note。网格用一张薄薄的平面(Plane)。 -
配置为可阅读
交互数据里:
Object Name= “实验记录”;Primary Interaction Method=Inspect;Inspect Method=Readable(只看文字)或3D Inspect + Readable(既能看到纸、又能翻页);Readable Text Pages= 把正文按页填进去,每页一段;Readable Text Color按背景纸色调整,保证对比度。 -
读完记进日志
在
Event Interacted With里调用 Inventory Manager 的Add Journal Entry, 填条目名(与纸条同名方便对应)、描述、一个模型(可以就用这张纸的网格)、以及距镜头距离。 -
顺便推进任务
如果这张纸条是任务线索:调
Edit Consequential Tags打标记ReadNote, 再用Edit Target Main Task in Queue把任务标题改成“已找到记录,回去汇报”。
玩家读完之后,纸条还留在地上(因为不是拾取)。这符合直觉:你读过它,但它不会消失。
如果剧情需要“把纸条带走”,再加一个 Inspect + Can Item be Picked Up when Inspecting 勾选即可。
验证
- 看向纸条 → 提示出现 → 按键 → 进入阅读界面;
- 多页时能翻页,最后一页能正常退出;
- 打开日志 → 出现新条目 → 能 3D 查看;
- 右上角任务文字已更新。
项目三:会记住你选择的对话
用到的系统:对话(数据表)→ 剧情标记 → 回忆录 → 故事选择。
目标
一个 NPC 问你“要不要打开闸门”。选“打开” → 世界变亮、回忆录多一条、之后这个 NPC 会说不同的话; 选“不打开” → 另一条分支。这就是最小可用的“选择有后果”。
-
复制一个示例 NPC
找到示例里任意
NPCInteractableBase的子类,复制到自己文件夹,改名BP_NPC_Keeper。 这样 ID、对话资产、镜头都配好了,你只改内容。 -
写第一段对话
在它的对话数据表里,
{initial}那段:字幕写“闸门后面很危险,你确定要开吗?”, 选项两条:「打开闸门」/「先不了」。 -
给选项打标记
给「打开闸门」这个选项加
Con Tag=OpenedGate; 给「先不了」加DeclinedGate。这一步不需要写任何蓝图。 -
做后果(世界变化)
在关卡蓝图里绑定
On Dialogue Reply,Switch on String匹配“打开闸门”: 调用相机管理器的Look At Target Once看向闸门 → 播放开门动画 → 调 Inventory Manager 的Edit Consequential Tags再打一个标记GateOpen(给后续剧情用)。 -
做后果(回忆录)
在
MemoirEntry_DT加一行:Target Consequential Tag=GateOpen, 填描述与配图。玩家打开闸门后,回忆录自动多一条。 -
做后果(下次见面)
在同一张对话表里再加一段对话,
SelectOnReply=OpenedGate, 字幕写“你终究还是开了它。”—— 玩家第二次和 NPC 说话,就会自动进入这段。 -
(进阶)用 Story Choice 替代普通选项
如果你想让这个决定更有“仪式感”:把上面第 2 步的选项换成一次
CreateStoryChoice调用,配上镜头机位和 15 秒倒计时,选择后画面淡出再淡入。
验证
| 操作 | 预期 |
|---|---|
| 第一次对话选“打开” | 镜头转向闸门、动画播放、回忆录出现新条目 |
| 再次对话 | NPC 直接说“你终究还是开了它” |
| 重开一局选“先不了” | 没有回忆录、NPC 台词不同、闸门没开 |
| 存档后读档 | 标记仍在,NPC 仍记得你的选择 |
叙事游戏 80% 的 Bug 出在“玩家不按套路玩”: 对话中途存档、选择后立刻退出、重复和 NPC 说话、先做任务后接任务。 每做完一个分支,就用最笨的方式乱点一遍。这比事后修 Bug 便宜得多。
做完这三个,你就掌握了
| 能力 | 来源 |
|---|---|
| 用交互数据配置物体,而不写代码 | 项目一 |
| 用剧情标记把“做过的事”变成“世界的变化” | 项目三 |
| 把交互、背包、日志、任务串成一条流程 | 项目一 + 二 |
| 设计有后果的分支,并让它被记住 | 项目三 |
| 用触发器与字幕做演出 | 项目二 + 第三章触发器 |
接下来就是“堆内容”的阶段了:更多的房间、更多的道具、更多的对话。 SF 已经把地基打好了,剩下的工作量取决于你的故事有多大。