任务系统¶
DataTable 驱动 · 父类统一管理 · AI 辅助开发。
这个系统是怎么来的¶
这套任务系统的蓝图逻辑我没有手写——我把需求描述给网页版 DeepSeek,它直接生成了蓝图连线方案,我照着连的。
所以不要觉得"我不会写复杂的任务系统",现在的 AI 完全能帮你写。你只需要理解系统怎么跑和参数怎么填,逻辑让 AI 来。
运行方式¶
一句话概括:玩家点击仪器 → 任务管理器查表校验 → 通过就播动画 → 推进到下一步。
展开来讲:
- 关卡开始,
BP_TaskManager1读取DT_Tasks数据表,拿到所有步骤 - 界面显示当前步骤的提示文字
- 玩家点击场景里的仪器 → 仪器通知任务管理器"我被点了,我的 ID 是 XX"
- 任务管理器查当前步骤的 DataTable 行,看玩家点的仪器 ID 是否匹配
- 匹配 → 步骤完成 → 播关卡序列动画 → 推进到下一步
- 不匹配 → 忽略,或者弹提示
- 如果是多步任务(需要依次点多个仪器),任务管理器内部计次,全部点完才推进
- 序列播完 → 自动进入下一步,刷新 UI 提示
- 所有步骤完成 → 实验结束
构建思路:父类统一 + DataTable 驱动¶
10 种实验仪器(烧杯、试管、酒精灯……),如果每个写一份点击逻辑,10 份代码,改一处要改 10 遍。
所以做了一个仪器父类 BP_LabEquipmentBase,通用逻辑全写里面——点击检测、部件映射、通知任务管理器、播放音效。10 个子类只需要配几个参数(模型、ID、名称),逻辑一行不用写。
任务流程同理——步骤顺序、目标仪器、关联的序列动画,全放 DT_Tasks 数据表里。改流程不用动蓝图,改表就行。
数据表参数说明¶
DT_Tasks 的每一行就是一个实验步骤,字段如下:
| 字段 | 类型 | 怎么填 |
|---|---|---|
StepNumber |
整数 | 步骤编号,显示用,填 1、2、3…… |
juti_TaskDescription |
文本 | 就是口语化描述 |
Title |
文本 | 总步骤如:第一步:取样 |
jian_TaskDescription |
文本 | 具体要点击哪个仪器的描述 |
TargetEquipmentID |
整数 | 需点击仪器整体或特定部件时才填,如果是多部点击后播放动画就填0 |
TargetEquipmentIDs |
整数数组 | 多步操作时才填,按填写ID顺序点击触发 |
TargetPartID |
整数 | 需要点击仪器的特定部件时才填,填 0 表示不区分部件 |
TargetSequence |
关卡序列 | 点击后播放的关卡序列 |
bIsCompleted |
布尔 | 是否已经完成该步骤,是则跳过该步骤 |
bIsMultiStep |
布尔 | 多步判断,是则需要填写TargetEquipmentIDs |
CurrentClickIndex |
整数 | 都是填0,不用管,基本不用了,这是旧版本的产物 |
OperationName |
文本 | 悬浮正确仪器的黄色小字 |
UI_Widget |
控件 | 点击特定仪器需要一个控件显示对应内容,为空则无 |
image |
纹理2D | 下一个步骤需要点击的仪器的缩略图 |
sound |
音效基础 | 下一个步骤需要播放的步骤语音 |
zhi_yin |
布尔 | 点击对应仪器后是否显示地下的蓝色箭头 |
duobu_image |
整数映射纹理2D | 多步下下一个需要点击的仪器缩略图 |
OnTaskCompleted? |
布尔 | 是否播放右上角提示动画 |
TaskCompleted |
文本 | 提示动画文本的内容 |
仪器子类怎么配置¶
模仿别的仪器配置就好了,替换原来模型,填写唯一的ID,仪器名字,子部件也是复制已经配置好的(所有子部件命名规范:ID*100+1、2、3、4等)
序列管理器¶
BP_SequenceManager 负责播关卡序列动画。任务管理器说"播这个序列",它就创建序列播放器,播完回调任务管理器说"完了",任务管理器推进下一步。
UI 面板¶
WBP_TaskPanel 负责显示提示文字和按钮。任务管理器调函数刷新文本,UI 本身不参与逻辑。
按钮: - 返回 → 回退一步,重置完成状态 - 操作 → 与点击效果一致
踩过的坑¶
早期试过在蓝图里直接建一个结构体数组填实验步骤,编辑器崩了几次后数据全丢。后来换成 DataTable 驱动——数据存在表格资产里,编辑器崩了表还在。改流程也不用开蓝图,直接改表就行。