Files
zeling_v2/Assets/Scripts/Quest/QuestObjectiveSO.cs
2026-05-13 09:19:54 +08:00

82 lines
3.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using UnityEngine;
using BaseGames.Player;
namespace BaseGames.Quest
{
/// <summary>
/// 任务目标基类(抽象,架构 22_QuestChallengeModule §3
/// 所有具体目标类型均继承此类,通过多态实现零代码扩展。
/// 每种目标在事件驱动下由 QuestManager 调用 EvaluateCompletion()。
/// </summary>
public abstract class QuestObjectiveSO : ScriptableObject
{
[Header("标识")]
public string objectiveId;
[TextArea(1, 4)]
public string displayTextKey; // 本地化 key通过 LocalizationManager.Get(displayTextKey, "Quest") 显示)
public bool IsOptional; // 可选目标(完成加奖励但不阻塞任务)
/// <summary>根据当前进度判断目标是否完成。</summary>
public abstract bool EvaluateCompletion(QuestObjectiveState state);
}
// ── 运行时目标进度状态(由 QuestManager 管理,不继承 SO────────────────
public class QuestObjectiveState
{
public bool completed = false;
public int progressCount = 0;
}
// ── 具体目标类型 ────────────────────────────────────────────────────────
/// <summary>与指定 NPC 对话后完成。</summary>
[CreateAssetMenu(menuName = "Quest/Objective/TalkToNPC")]
public class TalkToNPCObjective : QuestObjectiveSO
{
public string targetNpcId;
public override bool EvaluateCompletion(QuestObjectiveState s) => s.progressCount >= 1;
}
/// <summary>击败指定 ID 的敌人若干次。</summary>
[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;
}
/// <summary>收集指定 ID 的物品若干件。</summary>
[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;
}
/// <summary>到达指定场景/区域标记点后完成。</summary>
[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;
}
/// <summary>使用指定能力若干次后完成。</summary>
[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;
}
}