82 lines
3.2 KiB
C#
82 lines
3.2 KiB
C#
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;
|
||
}
|
||
}
|