Project AS Developer Doc Help

3.5 任务系统(QuestSystem)

任务系统负责引导玩家推进游戏主线、分支剧情、派系决策、探索与成长进程,支持多种任务类型及动态生成机制,并与资源、居民、设施、派系、剧情等模块深度联动。

3.5.1 任务数据结构设计(任务链、奖励、阶段)

任务以 ScriptableObject 格式存储并组织为任务链。

[CreateAssetMenu(fileName = "QuestConfig", menuName = "Configs/Quest")] public class QuestConfig : ScriptableObject { public string questId; public string title; public string description; public QuestType type; public List<QuestCondition> conditions; public List<QuestReward> rewards; public List<string> nextQuestIds; // 后续任务 ID(由系统动态加载) public FactionType exclusiveTo; // 仅对某派系可见(可空) public string triggerEventId; public string unlockFacilityId; public int factionSupportBonus; } public enum QuestType { Mainline, Side, Daily, Exploration, Faction } [System.Serializable] public class QuestCondition { public QuestConditionType conditionType; public string targetId; public int targetValue; } public enum QuestConditionType { AccumulateResource, BuildFacility, AssignResident, TriggerEvent, ResearchTech, ReachFactionRatio } [System.Serializable] public class QuestReward { public ResourceType resource; public int amount; public string unlockTargetId; }

3.5.2 动态任务生成机制与触发条件

任务系统应支持策划预设与运行时动态生成共存:

来源

类型

触发条件

主线任务

预设

游戏初始化或完成前置任务

支线任务

半预设

特定居民行为、设施建成等条件

派系任务

动态生成

居民派系比例变化 / 特定派系成立

探索任务

动态生成

探索队返回时生成特殊目标

日常任务

全动态

随时间周期刷新,基于当前局势(如缺水)

动态任务生成使用任务模板 + 当前游戏状态参数自动实例化。

public class QuestTemplate { public QuestType type; public Func<bool> triggerCondition; public Func<QuestConfig> generateInstance; }

每 Tick 或每 Day,可在 QuestManager.Tick() 中检查模板触发。

3.5.3 与剧情系统、派系系统的联动

任务系统是剧情推进与派系冲突的载体核心:

  • 剧情绑定任务 :特定主线任务完成后触发剧情动画 / 日志 / 分支抉择

  • 派系推进任务 :不同派系任务完成度可提升其支持率并推动信仰变化

  • 互斥任务处理 :某些任务存在“只能完成一方”的机制 → 影响结局走向

  • 任务触发事件 :任务完成或失败时触发事件推送或状态变化

3.5.4 任务状态管理

每个任务在运行时绑定状态对象:

public class QuestState { public QuestConfig config; public bool isActive; public bool isCompleted; public bool isFailed; public Dictionary<string, int> progress; }

任务状态应支持存档与恢复。

3.5.5 任务完成回调机制设计

为实现系统解耦与灵活扩展,任务完成时应提供统一的响应机制,主要包括两种方式:

方式一:事件发布机制(推荐)

public class QuestCompletedEvent { public string questId; public QuestType type; public FactionType? relatedFaction; }

在任务完成逻辑中发布:

EventBus.Publish(new QuestCompletedEvent { questId = config.questId, type = config.type, relatedFaction = config.exclusiveTo });

由其他系统(如 NarrativeSystem、FactionSystem)订阅并响应。

方式二:配置式回调字段执行

void HandleQuestComplete(QuestConfig cfg) { if (!string.IsNullOrEmpty(cfg.triggerEventId)) NarrativeSystem.TriggerEvent(cfg.triggerEventId); if (!string.IsNullOrEmpty(cfg.unlockFacilityId)) FacilitySystem.Unlock(cfg.unlockFacilityId); if (cfg.factionSupportBonus != 0) FactionSystem.ApplyBonus(cfg.exclusiveTo, cfg.factionSupportBonus); }

3.5.6 扩展建议

  • 任务追踪 UI 模块 :玩家可选择追踪的任务在 UI 显示进度

  • 任务提示系统 :当条件已达成但任务未领取时推送提醒

  • 任务奖励延时解锁机制 :如需要建造某设施后才能领取奖励

  • 新游戏+影响因子 :已完成的部分任务可影响下轮开局解锁

14 七月 2025