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