2026-09-06 19:49:25 +08:00
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 战神激光 loop 状态通知(Animator 状态机行为)。
|
2026-09-08 17:34:49 +08:00
|
|
|
/// 用法:打开战神的 Animator Controller → 选中激光状态(Fire1) → Inspector 底部
|
|
|
|
|
/// Add Behaviour → ZhanShenLaserLoopSMB。
|
2026-09-10 01:07:35 +08:00
|
|
|
/// ⭐ 通知时机 = 过渡(Fire0→Fire1 crossfade)播放完成之后 + prepPortion 比例处:
|
|
|
|
|
/// prepPortion=0 即"过渡完成后立即放行激光特效"(提前结束 laserFXDelay 兜底等待)。
|
|
|
|
|
/// 注意 OnStateEnter 在过渡开始瞬间就会触发(此时 crossfade 尚未播完),不能在那里通知;
|
|
|
|
|
/// 若动画带准备段,可把 prepPortion 设为准备段占一圈的比例(从过渡完成起算)。
|
|
|
|
|
/// 重新进入状态(停火再开火 / Fire0-Fire1 切换)会重新等待并通知。
|
2026-09-06 19:49:25 +08:00
|
|
|
/// </summary>
|
|
|
|
|
public class ZhanShenLaserLoopSMB : StateMachineBehaviour
|
|
|
|
|
{
|
2026-09-10 01:07:35 +08:00
|
|
|
[Tooltip("0=过渡完成后立即显示(默认);若动画带准备段,填准备段占一圈的比例(从过渡完成起算)")]
|
2026-09-08 17:34:49 +08:00
|
|
|
[Range(0f, 1f)]
|
|
|
|
|
public float prepPortion = 0f;
|
|
|
|
|
|
|
|
|
|
private bool _notified;
|
|
|
|
|
|
2026-09-06 19:49:25 +08:00
|
|
|
public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
|
2026-09-08 17:34:49 +08:00
|
|
|
{
|
2026-09-10 01:07:35 +08:00
|
|
|
// ⭐ OnStateEnter 在过渡(crossfade)开始瞬间就触发,此时状态画面还没完全切过来,不能在这里通知;
|
|
|
|
|
// 只重置等待标记,统一交给 OnStateUpdate 等"过渡播完 + prepPortion"后再通知
|
|
|
|
|
_notified = false;
|
2026-09-08 17:34:49 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
|
|
|
|
|
{
|
2026-09-10 01:07:35 +08:00
|
|
|
if (_notified) return;
|
|
|
|
|
if (animator.IsInTransition(layerIndex)) return; // 过渡没播完不触发(Fire0→Fire1 crossfade 期间)
|
|
|
|
|
if (stateInfo.normalizedTime < prepPortion) return;
|
2026-09-08 17:34:49 +08:00
|
|
|
_notified = true;
|
|
|
|
|
NotifyLaserLoopBegin(animator);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void NotifyLaserLoopBegin(Animator animator)
|
2026-09-06 19:49:25 +08:00
|
|
|
{
|
|
|
|
|
// 战神实例上的 TurretData(向上查找,Animator 挂根/子物体都能找到)→ 通知座位
|
|
|
|
|
animator.GetComponentInParent<TurretData>()?.NotifyZhanShenLaserLoopAnim();
|
|
|
|
|
}
|
|
|
|
|
}
|