This commit is contained in:
2026-09-06 19:49:25 +08:00
parent 0887d61c5e
commit c2279de46b
13 changed files with 643 additions and 121 deletions
+36 -3
View File
@@ -141,6 +141,10 @@ public class SitPosData : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
private readonly List<GameObject> _laserStartFx = new List<GameObject>();
/// <summary>激光命中特效实例(与 _laserFx 一一对应,世界空间 Z=-50 层,跟随锁定目标)</summary>
private readonly List<GameObject> _laserHitFx = new List<GameObject>();
/// <summary>激光准备等待剩余秒数:锁定刚建立时读 ZhanShenTurretData.laserFXDelay,>0 期间激光及特效隐藏(等准备动画播完)</summary>
private float _laserPrepWait;
/// <summary>上一帧是否有锁定点(检测锁定建立沿,触发准备等待)</summary>
private bool _laserLockActive;
/// <summary>预制体形态激光的基准缩放(重建时取自 laserPrefab.transform.localScale)</summary>
private Vector3 _laserFxBaseScale = Vector3.one;
/// <summary>预制体形态激光的角度偏移:激光预制体自带的 Z 轴旋转(重建时缓存,绕世界 Z 叠加在计算朝向上)</summary>
@@ -429,17 +433,33 @@ public class SitPosData : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
}
}
// ⭐ 准备动画等待:锁定刚建立时读 ZhanShenTurretData.laserFXDelay,等待期间激光及全部特效
// (光束/起点球/起点特效/命中特效)先不显示,等战神摆姿势动画播完再出现;锁定丢失后重新锁定会重新等待
bool lockActive = _laserTargets.Count > 0;
if (lockActive && !_laserLockActive)
{
var zsDelay = currentZhanShenData as ZhanShenTurretData;
_laserPrepWait = zsDelay != null ? zsDelay.laserFXDelay : 0f;
}
_laserLockActive = lockActive;
if (_laserPrepWait > 0f)
{
_laserPrepWait -= Time.deltaTime;
lockActive = false; // 等待期间当作未锁定:激光和特效全部隐藏
}
// ⭐ 散射激光使用中就激活左右起点父对象显示起点球:
// isScatterLaserOn=三发+锁定开着(面板每帧刷新,本地座位);锁定点>1=三发目标已凑满(远程/bot座位)
// 两个条件满足其一即激活——散射模式开着但目标不足时也要显示起点球
UpdateJGFXParentsActive(currentZhanShenData != null && (_laserTargets.Count > 1 || isScatterLaserOn));
UpdateJGFXParentsActive(lockActive && (_laserTargets.Count > 1 || isScatterLaserOn));
#if UNITY_EDITOR
DebugJGFXState();
#endif
// 没有锁定点:隐藏所有激光
if (_laserTargets.Count == 0)
// 没有锁定点(或准备动画等待中):隐藏所有激光
if (!lockActive)
{
HideZhanShenLasers();
return;
@@ -452,6 +472,15 @@ public class SitPosData : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
UpdateZhanShenLaserLine();
}
/// <summary>
/// 战神 loop 动画开始通知(TurretData 转发:ZhanShenLaserLoopSMB 状态机行为 / 剪辑动画事件):
/// 立即放行激光及全部特效显示(提前结束 laserFXDelay 等待;未在等待中则无副作用)。
/// </summary>
public void NotifyZhanShenLaserLoopAnim()
{
_laserPrepWait = 0f;
}
/// <summary>隐藏全部战神激光(两种形态都处理)</summary>
private void HideZhanShenLasers()
{
@@ -613,6 +642,10 @@ public class SitPosData : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
// 起点/命中特效一并销毁
ClearZhanShenLaserPointFx();
// 准备动画等待状态复位(下次锁定重新计时)
_laserPrepWait = 0f;
_laserLockActive = false;
}
// ==================== 激光起点/命中特效(三发+锁定) ====================
@@ -492,6 +492,25 @@ public class TurretData : MonoBehaviour
&& sit.monCotl_Lock_Position.gameObject.activeInHierarchy;
}
/// <summary>
/// 战神激光 loop 动画开始通知(ZhanShenLaserLoopSMB 状态机行为 / 剪辑动画事件殊途同归):
/// 通知座位立即显示激光及全部特效(提前结束 laserFXDelay 等待)。
/// </summary>
public void NotifyZhanShenLaserLoopAnim()
{
setPosData?.NotifyZhanShenLaserLoopAnim();
}
/// <summary>
/// AnimationEvent 接收器:在激光 loop 动画剪辑的第 0 帧配动画事件、函数名填 ZhanShenLaserLoopBegin。
/// ⭐ 前提:Animator 挂在和本组件同一个物体上(动画事件只发给 Animator 所在物体的脚本);
/// Animator 在子物体上时改用 ZhanShenLaserLoopSMB(Add Behaviour 到 Animator 的 loop 状态)。
/// </summary>
public void ZhanShenLaserLoopBegin()
{
NotifyZhanShenLaserLoopAnim();
}
/// <summary>按参数实际类型写数值(Int/Bool/Float 通吃)</summary>
private void SetNumericParam(string paramName, AnimatorControllerParameterType type, int value)
{
@@ -0,0 +1,17 @@
using UnityEngine;
/// <summary>
/// 战神激光 loop 状态通知(Animator 状态机行为)。
/// 用法:打开战神的 Animator Controller → 选中激光循环(loop)状态 → Inspector 底部
/// Add Behaviour → ZhanShenLaserLoopSMB。状态进入(=准备动画播完、loop 开始)时
/// 自动通知座位显示激光及全部特效(提前结束 laserFXDelay 等待)。
/// 无需改动画剪辑、不要求 Animator 挂在特定物体上(向上找 TurretData)。
/// </summary>
public class ZhanShenLaserLoopSMB : StateMachineBehaviour
{
public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
// 战神实例上的 TurretData(向上查找,Animator 挂根/子物体都能找到)→ 通知座位
animator.GetComponentInParent<TurretData>()?.NotifyZhanShenLaserLoopAnim();
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b6551d6a3f7dc3d4ab810f5f45455de9
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: