feat(enemy): BossPhaseAbilityGate——阶段即换招池
按阶段启停能力组件,被禁用的招经 CanUse 自动退出选招候选, 阶段门不需要碰选招器。取代 BossSkillSO.availablePhaseIndices。 EnterPhase 先换池后广播;OnSpawn 回阶段 0(对象池复用)。
This commit is contained in:
@@ -25,6 +25,10 @@ namespace BaseGames.Enemies
|
||||
[Header("资源组件(可选)")]
|
||||
[SerializeField] private BossResource _bossResource;
|
||||
|
||||
[Header("阶段招池门(可选)")]
|
||||
[Tooltip("按阶段启用 / 禁用能力组件;未挂载则所有能力全阶段可用")]
|
||||
[SerializeField] private BossPhaseAbilityGate _phaseGate;
|
||||
|
||||
[Header("玩家反制事件(可选)")]
|
||||
[Tooltip("订阅此频道以响应玩家弹反成功事件")]
|
||||
[SerializeField] private ParryInfoEventChannelSO _onParrySuccess;
|
||||
@@ -60,6 +64,7 @@ namespace BaseGames.Enemies
|
||||
// includeInactive:true 确保禁用状态的子组件也能被发现(如分阶段按需启用的执行器)
|
||||
if (_skillExecutor == null) _skillExecutor = GetComponentInChildren<BossSkillExecutor>(true);
|
||||
if (_bossResource == null) _bossResource = GetComponentInChildren<BossResource>(true);
|
||||
if (_phaseGate == null) _phaseGate = GetComponentInChildren<BossPhaseAbilityGate>(true);
|
||||
}
|
||||
|
||||
protected override void OnEnable()
|
||||
@@ -78,7 +83,7 @@ namespace BaseGames.Enemies
|
||||
/// </summary>
|
||||
public string LastUsedSkillId { get; private set; }
|
||||
|
||||
// ── 技能执行(BD Task 调用入口)─────────────────────────────────────
|
||||
// ── 技能执行(决策层调用入口)───────────────────────────────────────
|
||||
|
||||
/// <summary>
|
||||
/// 通过技能 ID 执行 Boss 技能。
|
||||
@@ -186,6 +191,8 @@ namespace BaseGames.Enemies
|
||||
LastUsedSkillId = null; // 新阶段重置权重惩罚,防止跨阶段漂移
|
||||
// 新阶段换招池,上一阶段的防重复记忆不应跨阶段影响选招
|
||||
AttackSelector?.ResetRepeatMemory();
|
||||
// 阶段 = 换招池:先换池,再广播阶段事件,保证订阅方看到的是新池
|
||||
_phaseGate?.ApplyPhase(phase);
|
||||
_onBossPhaseChanged?.Raise(new BossPhaseEvent
|
||||
{
|
||||
BossId = _bossId,
|
||||
@@ -195,7 +202,7 @@ namespace BaseGames.Enemies
|
||||
|
||||
/// <summary>
|
||||
/// 启动阶段过渡演出:无敌帧 + 可选定格时间,结束后自动调用 <see cref="EnterPhase"/>。
|
||||
/// BD_BossPhaseTransition 检查 <see cref="IsPhaseTransitioning"/> 来等待过渡完成。
|
||||
/// 决策层检查 <see cref="IsPhaseTransitioning"/> 来等待过渡完成。
|
||||
/// </summary>
|
||||
/// <param name="targetPhase">过渡目标阶段索引。</param>
|
||||
/// <param name="invincibleDuration">无敌帧持续时间(秒)。</param>
|
||||
@@ -205,7 +212,7 @@ namespace BaseGames.Enemies
|
||||
{
|
||||
Debug.LogWarning(
|
||||
$"[BossBase] '{_bossId}' 已在阶段过渡中(当前阶段 {_currentPhase})," +
|
||||
$"忽略跳转至阶段 {targetPhase} 的请求。请检查行为树逻辑是否重复触发阶段切换。",
|
||||
$"忽略跳转至阶段 {targetPhase} 的请求。请检查决策层逻辑是否重复触发阶段切换。",
|
||||
this);
|
||||
return;
|
||||
}
|
||||
@@ -363,6 +370,7 @@ namespace BaseGames.Enemies
|
||||
base.OnSpawn();
|
||||
LastUsedSkillId = null;
|
||||
_currentPhase = 0;
|
||||
_phaseGate?.ApplyPhase(0); // 对象池复用:回到阶段 0 的启用集
|
||||
_skillExecutor?.ResetAllCooldowns();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user