using UnityEngine;
using System.Collections.Generic;
using Vampirefall.DecisionSystem;
using Vampirefall.DecisionSystem.Performance;
using System.Linq; // for Select
// 假设 AggroAgent 已经像之前示例一样被重构了
public partial class AggroAgent : MonoBehaviour, IDecisionRequester
{
// ... 其他 AggroAgent 字段和方法 ...
// IDecisionRequester 接口实现
public bool IsActive => gameObject.activeInHierarchy && _currentTarget != null && _currentTarget.IsAlive; // 怪物存活且有目标
public int Priority => (int)(Vector3.Distance(transform.position, _currentTarget.Position)); // 优先处理近距离目标
void OnEnable() {
// 注册到调度器
DecisionScheduler.Instance?.RegisterRequester(this);
}
void OnDisable() {
// 从调度器注销
DecisionScheduler.Instance?.UnregisterRequester(this);
}
// 将原先的 FindBestTarget 逻辑放入 PerformDecision
public void PerformDecision(DecisionContext sharedContext)
{
// 1. 获取所有潜在候选人 (使用空间划分,下一节讨论)
List<IAggroTargetRefactored> allTargets = GameManager.GetAllAggroTargetsInRadius(transform.position, aggroRange);
// 2. 准备决策上下文 (填充当前请求者的特定数据)
sharedContext.Origin = transform.position;
sharedContext.Source = gameObject;
sharedContext.Set("AggroThreatTable", _threatTable); // 将自身的仇恨表放入上下文供ThreatScorer使用
// 3. 执行决策
IAggroTargetRefactored newTarget = _decisionEngine.SelectBest(allTargets, sharedContext);
// 4. 切换目标逻辑
if (newTarget != null && ShouldSwitchTarget(newTarget, _currentTarget))
{
_currentTarget = newTarget;
// TODO: 通知 NavMeshAgent 新目标
}
else if (newTarget == null && _currentTarget != null && !_currentTarget.IsAlive)
{
_currentTarget = null; // 当前目标死亡
}
}
// Note: 原来的 Update 方法只需要处理移动/攻击动画,不再需要 FindBestTarget()
}