任务不是一条数组,而是一张状态图
简单任务可以是“接取、完成、领奖”。项目复杂后,任务会有前置条件、分支对话、收集目标、击败目标、区域触发、限时阶段、奖励选择、后续任务。用一条数组或几个布尔值很快会不够。Godot 项目可以用 Resource 表达任务节点,用编辑器工具或 GraphEdit 做任务图编辑。
任务图的重点不是做一个花哨编辑器,而是让任务结构可视、可校验、可迁移。策划能看懂流程,程序能在运行时可靠执行,QA 能知道卡在哪个节点。
flowchart TD
A[QuestGraphResource] --> B[开始节点]
B --> C[条件节点]
C --> D{条件满足?}
D -->|否| E[等待事件]
D -->|是| F[目标节点]
F --> G[奖励节点]
G --> H[结束/后续任务]
I[运行时 QuestState] --> C
I --> F
I --> G
Resource 描述结构,State 描述进度
QuestGraphResource 应该是只读结构:节点 ID、节点类型、连接关系、条件配置、目标配置、奖励配置、文本 key。玩家当前进度不写在 Resource 里,而是写在 QuestState:当前激活节点、目标计数、是否已领奖、已选择分支。
这个分离非常重要。任务配置随版本发布,玩家进度随存档变化。配置更新后,旧存档仍然能找到节点 ID;若节点被删除,需要迁移或兼容规则。不要把运行时状态写回任务资源。
节点 ID 要稳定。GraphEdit 里的位置可以变,文本可以改,节点 ID 不能随便重生成。任务存档和日志都依赖它。
条件和目标要可组合
任务条件可能是等级、道具、前置任务、时间、区域、对话选择。目标可能是收集、击杀、探索、交互、通关。每种条件和目标都可以做成 Resource,运行时由 QuestSystem 解释。
条件组合需要 AND、OR、NOT 或组节点。不要只支持简单列表,否则策划会用脚本绕开。组合也要可视化,让人能看懂为什么任务不可接。
目标节点要订阅事件。击杀事件、拾取事件、进入区域事件、对话完成事件都进入任务系统,由任务系统更新 QuestState。任务节点不应该直接挂在怪物脚本上,否则内容耦合严重。
GraphEdit 可以先做轻量版
Godot 的 GraphEdit 可以用来做任务图工具。初版不必支持所有高级操作,只要能创建节点、连接节点、编辑节点属性、校验错误、导出 Resource,就已经很有价值。
编辑器工具要显示错误:开始节点缺失、节点不可达、奖励节点没有奖励、条件引用不存在道具、连接形成非法循环、文本 key 缺失。错误能点击定位到节点。这样任务问题在内容阶段解决,而不是运行时才发现。
Graph 位置只是编辑器信息,可以保存在 Resource 中用于下次打开。运行时不需要它。
奖励和事务边界
任务奖励不要由 UI 直接发。任务系统确认任务完成后,奖励节点生成奖励请求,单机项目更新本地背包,联网项目请求服务端确认。客户端 UI 只展示可领取和领取结果。
奖励选择节点要记录玩家选择。选择后如果请求失败,状态要回滚或保持待确认。不要让玩家本地选了奖励,服务端没确认,重进后状态不一致。
任务完成事件也可能触发新任务、解锁区域、播放剧情。任务图可以表达这些动作,但执行要有顺序和错误处理。复杂副作用最好交给领域服务,而不是 Graph 节点直接操作场景。
调试任务状态
任务 bug 很难靠肉眼看。调试面板应显示当前任务、激活节点、节点条件结果、目标计数、最近事件、奖励状态。玩家说任务卡住时,测试打开面板就能知道是缺事件、条件不满足还是配置断链。
还可以提供强制推进工具,但只在测试环境启用。推进工具要记录日志,避免污染真实存档。
小结
Godot 任务系统可以用 Resource 表达任务图,用 QuestState 表达玩家进度,用事件驱动目标更新,用 GraphEdit 工具提高内容生产质量。关键是把结构、状态和副作用拆开。任务越复杂,越需要图和校验,而不是让脚本里堆 if。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
我会给任务图工具加一个“模拟玩家状态”面板,输入等级、道具、前置任务后,直接高亮当前可走路径。策划能在编辑器里验证条件,比进游戏跑完整流程快得多。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。