满值时由 BossResource 直接调 UseBossSkill 是绕过决策层执行, 违反「AI 只决策、能力负责实现」。现在只维护数值并暴露 IsFull, AI 图挂 When(x => x.Boss.ResourceFull) 边进专属招态。 顺带解除对即将删除的 BossSkillSO 的依赖。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
82 lines
3.3 KiB
C#
82 lines
3.3 KiB
C#
using UnityEngine;
|
|
using BaseGames.Enemies;
|
|
|
|
namespace BaseGames.Boss
|
|
{
|
|
/// <summary>
|
|
/// Boss 自身资源(如愤怒值)运行时组件。
|
|
/// 根据 <see cref="BossResourceConfigSO"/> 配置:
|
|
/// - 每帧以 <see cref="BossResourceConfigSO.passiveRate"/> 自动积累或消耗。
|
|
/// - 受击时增加 <see cref="BossResourceConfigSO.onTakeDamageGain"/>。
|
|
/// - 技能使用时增加 <see cref="BossResourceConfigSO.onSkillUseGain"/>。
|
|
/// - 满值时 <see cref="IsFull"/> 为真,由 AI 图的条件边决定放什么招(决策不在本组件)。
|
|
/// </summary>
|
|
public sealed class BossResource : MonoBehaviour
|
|
{
|
|
[SerializeField] private BossResourceConfigSO _config;
|
|
[SerializeField] private BossBase _boss;
|
|
|
|
private float _currentValue;
|
|
|
|
/// <summary>当前资源值(0 ~ config.maxValue)。</summary>
|
|
public float CurrentValue => _currentValue;
|
|
|
|
/// <summary>当前资源值归一化(0~1)。</summary>
|
|
public float NormalizedValue => _config != null && _config.maxValue > 0f
|
|
? _currentValue / _config.maxValue : 0f;
|
|
|
|
/// <summary>资源是否已达上限(供 AI 图条件边判定"可放大招")。</summary>
|
|
public bool IsFull => _config != null && _config.maxValue > 0f
|
|
&& _currentValue >= _config.maxValue;
|
|
|
|
private void Awake()
|
|
{
|
|
if (_boss == null) _boss = GetComponentInParent<BossBase>();
|
|
if (_config == null)
|
|
{
|
|
Debug.LogError("[BossResource] 未配置 BossResourceConfigSO。", this);
|
|
enabled = false;
|
|
return;
|
|
}
|
|
_currentValue = _config.startValue;
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if (_config == null || !_boss.IsAlive) return;
|
|
|
|
if (_config.passiveRate != 0f)
|
|
AddValue(_config.passiveRate * Time.deltaTime);
|
|
}
|
|
|
|
// ── 外部触发 ──────────────────────────────────────────────────────────
|
|
|
|
/// <summary>Boss 受击时调用。由 BossBase.TakeDamage 覆写钩子触发。</summary>
|
|
public void OnBossTakeDamage()
|
|
{
|
|
if (_config == null) return;
|
|
AddValue(_config.onTakeDamageGain);
|
|
}
|
|
|
|
/// <summary>Boss 使用技能时调用。由使用了资源的能力触发(Boss 的招在自己的 EnemyAbilityBase 里调用)。</summary>
|
|
public void OnBossUseSkill()
|
|
{
|
|
if (_config == null) return;
|
|
AddValue(_config.onSkillUseGain);
|
|
}
|
|
|
|
/// <summary>直接设置资源值(外部强制赋值)。</summary>
|
|
public void SetValue(float value)
|
|
{
|
|
_currentValue = Mathf.Clamp(value, 0f, _config != null ? _config.maxValue : float.MaxValue);
|
|
}
|
|
|
|
// ── 内部 ──────────────────────────────────────────────────────────────
|
|
|
|
private void AddValue(float delta)
|
|
{
|
|
_currentValue = Mathf.Clamp(_currentValue + delta, 0f, _config.maxValue);
|
|
}
|
|
}
|
|
}
|