NPC 日程的价值和风险
生活模拟、叙事冒险、经营和 RPG 常需要 NPC 日程:早上在店里,晚上回家,任务后换位置,节日时出现特殊对话。日程能提升世界感,但也会带来大量问题:玩家找不到 NPC,任务提交点消失,读档后 NPC 位置错误,时间跳转漏触发事件。
个人项目做 NPC 日程,要先控制范围。不是所有 NPC 都需要完整生活模拟。关键 NPC 有日程,普通 NPC 使用固定点或简单状态,往往更稳。
时间系统
先定义时间如何推进:
| 模式 | 适合 |
|---|---|
| 实时分钟 | 生活模拟、农场 |
| 场景切换推进 | 叙事冒险 |
| 回合或天数 | 策略经营 |
| 剧情阶段 | 线性剧情 |
时间系统要和存档、任务、商店营业、NPC 位置连接。不要让各系统自己维护时间。统一世界时间能减少混乱。
日程表结构
NPC 日程可以用表:
| npc_id | 时间 | 地点 | 行为 | 条件 |
|---|---|---|---|---|
npc_mira | 08:00 | bakery | 工作 | 默认 |
npc_mira | 18:00 | plaza | 散步 | 任务未完成 |
npc_mira | 20:00 | home | 休息 | 默认 |
npc_mira | any | factory_gate | 等待玩家 | quest.factory.active |
任务条件优先级通常高于普通日程。否则玩家接了任务,NPC 却按日程回家,会让任务卡住。
位置切换
NPC 位置切换可以真实行走,也可以离屏瞬移。个人项目不一定要模拟完整路径。关键是玩家看到时合理,且任务不被阻断。
策略:
- 玩家同场景时,NPC 按路径移动。
- 玩家不在场景时,只更新目标位置。
- 关键任务 NPC 在任务期间固定或有地图提示。
- 找不到 NPC 时,日志和地图给出线索。
不要为了模拟真实生活,让玩家在大地图里到处找提交 NPC。生活感要服务体验。
世界状态
NPC 日程常和世界状态绑定:节日、天气、剧情阶段、商店开关、区域解锁。世界状态要集中管理,不要散落在 NPC 脚本。
| 状态 | 影响 |
|---|---|
day | NPC 日程、商店库存 |
weather | 对话、场景视觉 |
festival_active | NPC 聚集点 |
factory_repaired | 新路线和对话 |
ending_route | 后期 NPC 状态 |
状态变化要写日志,方便排查。
对话和日程
同一个 NPC 在不同时间和任务阶段可能有不同台词。对话条件应读取日程和任务状态。比如在店里对话是购买,在广场对话是闲聊,在任务地点对话是推进任务。
UI 也要告诉玩家当前 NPC 是否营业、是否可提交任务、是否只是普通对话。不要让玩家反复点击才知道。
存档恢复
存档要保存世界时间、世界状态、关键 NPC 特殊状态。普通 NPC 可以根据时间表重新计算位置;关键事件中的 NPC 需要保存具体状态。读档时先恢复世界时间,再根据日程和任务计算 NPC。
如果玩家在 NPC 移动途中保存,读档后可以让 NPC 出现在最近合理点,而不是精确恢复每一帧。稳定比绝对真实更重要。
离屏模拟
离屏 NPC 不需要完整 AI。可以只更新日程状态和目标位置,等玩家进入场景再生成。这样省性能,也减少奇怪物理碰撞。
但离屏事件要谨慎。比如 NPC 自动完成某任务、商店自动刷新、敌人自动攻击 NPC,都可能让玩家错过内容。个人项目应减少离屏复杂事件,除非它是核心玩法。
玩家找不到 NPC 怎么办
如果 NPC 会移动,就要提供线索:地图标记、任务日志、询问其他 NPC、固定营业时间。没有线索的移动 NPC 会让玩家挫败。
任务日志可以写“米拉白天在面包店,傍晚会去广场”,比只写“找米拉”更友好。
QA 清单
| 测试 | 检查 |
|---|---|
| 时间推进 | NPC 位置变化正确 |
| 任务期间 | 关键 NPC 不消失 |
| 读档 | 时间和位置恢复 |
| 场景切换 | NPC 不重复生成 |
| 节日状态 | 日程覆盖正确 |
| 商店营业 | UI 和交互一致 |
| 地图提示 | 能找到移动 NPC |
最终检查清单
- 时间系统统一,不由各系统各自维护。
- NPC 日程表包含时间、地点、行为和条件。
- 任务条件优先级高于普通日程。
- 离屏 NPC 简化模拟。
- 世界状态集中管理并写日志。
- 存档恢复时间、状态和关键 NPC。
- 移动 NPC 有地图或任务线索。
- QA 覆盖任务、读档和场景切换。
NPC 日程能增强世界感,但过度模拟会拖垮个人项目。更实际的做法是让关键 NPC 有可信变化,让任务和玩家路径保持稳定。
日程冲突处理
NPC 可能同时满足多个日程条件:普通营业、节日活动、任务等待、剧情过场。必须有优先级。通常主线任务高于支线,支线高于节日,节日高于普通日程。优先级不清会导致 NPC 出现在错误地点。
| 优先级 | 状态 |
|---|---|
| 1 | 主线任务关键位置 |
| 2 | 当前支线提交点 |
| 3 | 剧情或节日事件 |
| 4 | 特殊天气或临时事件 |
| 5 | 普通日程 |
每次世界状态变化后,可以重新计算 NPC 目标位置,并写日志。这样任务反馈中“NPC 不见了”的问题更容易查。
地图提示和玩家体验
移动 NPC 必须给玩家足够线索。地图标记不一定要实时显示精确位置,可以显示常去地点或当前区域。任务日志也可以写“白天在店里,晚上回家”。如果项目强调探索,可以减少标记,但关键任务 NPC 不应完全无提示。
玩家找 NPC 的时间应该服务世界感,而不是变成无意义奔跑。测试时记录玩家找关键 NPC 用了多久,如果普遍超过预期,就要增加线索。
日程和商店库存
商店 NPC 有日程时,营业状态、库存刷新和对话要同步。不要出现 NPC 不在店里但商店还能打开,或 NPC 在店里却显示打烊。库存刷新也要依赖统一时间系统,而不是每次打开 UI 随机刷新。
读档后尤其要检查:时间、NPC 位置、商店库存、已购买状态是否一致。
简化是合理选择
如果某个 NPC 的移动不会带来玩法价值,就让他固定在一个可信位置。不是每个角色都需要完整日程。个人项目把复杂度集中在少数关键 NPC 上,反而能做出更稳定的体验。
时间跳转和睡眠
如果游戏支持睡觉、等待或快速跳到第二天,NPC 日程要能批量更新。时间跳转不是把时钟改掉就结束,还要刷新商店、事件、天气、NPC 位置和任务计时。跳转前后要有稳定点,避免 NPC 正在过场或任务提交中被强行移动。
跳转测试要覆盖:任务进行中睡觉、节日前一天睡觉、商店库存刷新、NPC 从室外回家。生活模拟类游戏尤其需要这类测试。
事件只触发一次
世界状态变化常触发一次性事件:节日开始、桥修好、NPC 搬家、商店开张。这些事件要有已触发标记,不能因为读档或时间反复跳转重复发奖励、重复播放过场。
一次性事件也要写日志。玩家反馈“节日过场重复播放”时,开发者能检查标记是否保存。
NPC 缺席的设计
NPC 不在原地时,要让场景有合理反馈。店门口可以有牌子写营业时间,任务 NPC 可以留下纸条或地图标记。玩家看到原因后,会觉得世界有规则;没有反馈时,只会觉得 NPC 丢了。
日程系统的性能边界
NPC 数量多时,不要每个 NPC 每帧计算完整日程。可以在时间变化、场景进入、任务状态变化时重新计算。远处 NPC 只保留状态摘要,玩家进入场景时再实例化。这样能减少 CPU 压力,也能减少离屏行为 bug。
关键 NPC 和背景 NPC 可以使用不同系统。关键 NPC 走完整日程,背景 NPC 使用简单刷点和文本。把两类混在一起,会让系统过重。
玩家等待的设计
如果玩家需要等到某个时间见 NPC,要提供等待、睡觉或跳时段功能。否则日程系统会变成现实时间阻碍。等待功能也要触发世界状态刷新,并保存日志。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。