using UnityEngine; using BaseGames.Player; namespace BaseGames.Quest { /// /// 任务目标基类(抽象,架构 22_QuestChallengeModule §3)。 /// 所有具体目标类型均继承此类,通过多态实现零代码扩展。 /// 每种目标在事件驱动下由 QuestManager 调用 EvaluateCompletion()。 /// public abstract class QuestObjectiveSO : ScriptableObject { [Header("标识")] public string objectiveId; [TextArea(1, 4)] public string displayTextKey; // 本地化 key(通过 LocalizationManager.Get(displayTextKey, "Quest") 显示) public bool IsOptional; // 可选目标(完成加奖励但不阻塞任务) /// 根据当前进度判断目标是否完成。 public abstract bool EvaluateCompletion(QuestObjectiveState state); } // ── 运行时目标进度状态(由 QuestManager 管理,不继承 SO)──────────────── public class QuestObjectiveState { public bool completed = false; public int progressCount = 0; } // ── 具体目标类型 ──────────────────────────────────────────────────────── /// 与指定 NPC 对话后完成。 [CreateAssetMenu(menuName = "Quest/Objective/TalkToNPC")] public class TalkToNPCObjective : QuestObjectiveSO { public string targetNpcId; public override bool EvaluateCompletion(QuestObjectiveState s) => s.progressCount >= 1; } /// 击败指定 ID 的敌人若干次。 [CreateAssetMenu(menuName = "Quest/Objective/Defeat")] public class DefeatEnemyObjective : QuestObjectiveSO { public string targetEnemyId; [Min(1)] public int defeatCount = 1; public override bool EvaluateCompletion(QuestObjectiveState s) => s.progressCount >= defeatCount; } /// 收集指定 ID 的物品若干件。 [CreateAssetMenu(menuName = "Quest/Objective/Collect")] public class CollectItemObjective : QuestObjectiveSO { public string itemId; [Min(1)] public int collectCount = 1; public override bool EvaluateCompletion(QuestObjectiveState s) => s.progressCount >= collectCount; } /// 到达指定场景/区域标记点后完成。 [CreateAssetMenu(menuName = "Quest/Objective/Reach")] public class ReachAreaObjective : QuestObjectiveSO { public string sceneName; // 需到达的场景 public string markerTag; // 场景内的目标标记 Tag(预留) public override bool EvaluateCompletion(QuestObjectiveState s) => s.progressCount >= 1; } /// 使用指定能力若干次后完成。 [CreateAssetMenu(menuName = "Quest/Objective/UseSkill")] public class UseSkillObjective : QuestObjectiveSO { public AbilityType requiredAbility; [Min(1)] public int useCount = 1; public override bool EvaluateCompletion(QuestObjectiveState s) => s.progressCount >= useCount; } }