From c1c5f05d3f91ef14b0c39f59f15924c129b30eac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A3=AE2003?= <2384017988@qq.com> Date: Mon, 12 Oct 2026 16:03:34 +0800 Subject: [PATCH] 1 --- Assets/Art/FengLei/Boss/7005/7005_1.playable | 162 +++++++++++++++++- Assets/MyGame/Scenes/UIScene.unity | 4 +- Assets/MyGame/Scripts/Turret/FlyTurretData.cs | 36 ++++ Assets/MyGame/Scripts/Turret/TurretData.cs | 13 ++ .../aa/UI/Game/GameMainPanel_FishBase.cs | 5 + 5 files changed, 210 insertions(+), 10 deletions(-) diff --git a/Assets/Art/FengLei/Boss/7005/7005_1.playable b/Assets/Art/FengLei/Boss/7005/7005_1.playable index f499a2867..8ae7726a5 100644 --- a/Assets/Art/FengLei/Boss/7005/7005_1.playable +++ b/Assets/Art/FengLei/Boss/7005/7005_1.playable @@ -2171,7 +2171,25 @@ MonoBehaviour: m_RotationOrder: 4 m_MixOutCurve: serializedVersion: 2 - m_Curve: [] + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 m_PreInfinity: 2 m_PostInfinity: 2 m_RotationOrder: 4 @@ -2231,7 +2249,25 @@ MonoBehaviour: m_BlendOutDuration: 0 m_MixInCurve: serializedVersion: 2 - m_Curve: [] + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 m_PreInfinity: 2 m_PostInfinity: 2 m_RotationOrder: 4 @@ -2336,7 +2372,25 @@ MonoBehaviour: m_RotationOrder: 4 m_MixOutCurve: serializedVersion: 2 - m_Curve: [] + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 m_PreInfinity: 2 m_PostInfinity: 2 m_RotationOrder: 4 @@ -2528,7 +2582,25 @@ MonoBehaviour: m_BlendOutDuration: 0 m_MixInCurve: serializedVersion: 2 - m_Curve: [] + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 m_PreInfinity: 2 m_PostInfinity: 2 m_RotationOrder: 4 @@ -2594,13 +2666,49 @@ MonoBehaviour: m_BlendOutDuration: 1.3333333333333286 m_MixInCurve: serializedVersion: 2 - m_Curve: [] + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 m_PreInfinity: 2 m_PostInfinity: 2 m_RotationOrder: 4 m_MixOutCurve: serializedVersion: 2 - m_Curve: [] + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 m_PreInfinity: 2 m_PostInfinity: 2 m_RotationOrder: 4 @@ -2627,13 +2735,49 @@ MonoBehaviour: m_BlendOutDuration: 1.3166666666666345 m_MixInCurve: serializedVersion: 2 - m_Curve: [] + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 m_PreInfinity: 2 m_PostInfinity: 2 m_RotationOrder: 4 m_MixOutCurve: serializedVersion: 2 - m_Curve: [] + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 m_PreInfinity: 2 m_PostInfinity: 2 m_RotationOrder: 4 @@ -2714,7 +2858,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 15c38f6fa1940124db1ab7f6fe7268d1, type: 3} m_Name: Signal Emitter m_EditorClassIdentifier: - m_Time: 117.93333333333335 + m_Time: 120.30000000000004 m_Retroactive: 0 m_EmitOnce: 0 m_Asset: {fileID: 11400000, guid: aca498d52b11314418047bc8d6c097ae, type: 2} diff --git a/Assets/MyGame/Scenes/UIScene.unity b/Assets/MyGame/Scenes/UIScene.unity index 625bee7da..d6a99dafe 100644 --- a/Assets/MyGame/Scenes/UIScene.unity +++ b/Assets/MyGame/Scenes/UIScene.unity @@ -3876,9 +3876,11 @@ MonoBehaviour: m_EditorClassIdentifier: config: {fileID: 11400000, guid: f2f67348a5eb9f3449b426fec5d2fd12, type: 2} uiRoot: {fileID: 1096182889} - obj_JiaZaiZhong: {fileID: 0} + obj_JiaZaiZhong: {fileID: 4264627302849353753, guid: 021ede141bc7c4e47bcf4fabed7681d6, + type: 3} loadPanel: {fileID: 2258378551980177528, guid: 953c7fd5628fa1d418bac4e4aa6c8ea4, type: 3} + jiaZaiZhongDelay: 0.1 BoardPanelParefab: {fileID: 2654078965480511721, guid: aff715af8514eca42972496e4c2232c3, type: 3} BoardPanelParefabGongGao: {fileID: 2654078965480511721, guid: 5b9fb25eac1f838459fe9492f6c8a242, diff --git a/Assets/MyGame/Scripts/Turret/FlyTurretData.cs b/Assets/MyGame/Scripts/Turret/FlyTurretData.cs index f2691dea0..4a15fa842 100644 --- a/Assets/MyGame/Scripts/Turret/FlyTurretData.cs +++ b/Assets/MyGame/Scripts/Turret/FlyTurretData.cs @@ -278,9 +278,45 @@ public class FlyTurretData : TurretData // 飞行/悬停期间拦截状态动画(Attack/Idle 切换不打断起飞动画) if (IsFlying) return; + if (newState == TurretState.Attack) + { + // ⭐ XJMH 原版射击动画(Battery:Shoot):**每发** SetAnimation(0,"shot",false)——从头重播(连射时 + // 直接打断重放=原版"播放一半直接重新放")、非循环播完停住。 + // 基类是"进入状态播一次 + 循环播放",连射不重播 → 这里每次 Attack 都重播。 + // 首次进入先走基类同步状态(基类循环版动画同帧被下面重播覆盖,玩家不可见) + if (CurrState != TurretState.Attack) + base.ChangeState(newState); + PlayShotAnim(); + return; + } + base.ChangeState(newState); } + /// ⚠ 覆写:XJMH 停火不打断最后一发(原版最后一发播完自动切待机=定格在尾帧,见基类说明) + protected override bool KeepPoseOnEmptyIdleAnim => true; + + /// 同一帧内去重:自动开火"状态切换 + 手动发射"两条入口可能同帧都调本方法 + private int _lastShotFrame = -1; + + /// + /// 播放一发射击动画(原版 Battery:Shoot → gunSkeleton SetAnimation(0,"shot",false)): + /// ⭐ 每发从头重播(连射时打断当前播放重新开始);非循环,播完停在尾帧等下一发。 + /// 手动按住扫射的每发(不经过 ChangeState)由 GameMainPanel 在发射后调用;飞行中不播(原版 isPlaneState 时跳过)。 + /// + public void PlayShotAnim() + { + if (IsFlying) return; + if (_lastShotFrame == Time.frameCount) return; // 同一帧重复调用只播一次 + _lastShotFrame = Time.frameCount; + + if (skeletonAnimation == null || skeletonAnimation.AnimationState == null) return; + string anim = string.IsNullOrEmpty(attackAnim) ? "shot" : attackAnim; + if (!HasSpineAnim(skeletonAnimation, anim)) return; + + skeletonAnimation.AnimationState.SetAnimation(0, anim, false); // 每发从头(替换轨道=打断重放) + } + // ==================== XJMH 进房入场动画(原版 Battery:EnterAction,进入房间时本地座位播一次) ==================== // 原版链路(PW_Data.InitPlayer 收到自己"大飞机信息"): // GC.BatteryMgr.PlayEnterAction(chairId, PW_Data.EnterAction) —— 首次 false 播完整动画+声音, diff --git a/Assets/MyGame/Scripts/Turret/TurretData.cs b/Assets/MyGame/Scripts/Turret/TurretData.cs index c1cc8e376..700993788 100644 --- a/Assets/MyGame/Scripts/Turret/TurretData.cs +++ b/Assets/MyGame/Scripts/Turret/TurretData.cs @@ -303,6 +303,10 @@ public class TurretData : MonoBehaviour PlayState(newState); } + /// Idle 且没有配置待机动画时,是否保留当前姿态(不清轨道)。默认 false=清轨道(旧行为); + /// XJMH(FlyTurretData)覆写 true:停火不打断射击动画,最后一发播完自然停住(原版行为)。 + protected virtual bool KeepPoseOnEmptyIdleAnim => false; + /// /// 播放"出现动画":各 SkeletonGraphic 上配置的 Spine startingAnimation(炮台容器/炮体上配的是 out、trans 等)。 /// ⭐ Spine 只在 Awake(第一次激活)应用一次 startingAnimation,而 OnEnable 的 PlayState(Idle) @@ -419,6 +423,15 @@ public class TurretData : MonoBehaviour // 而 idleAnim 为空正好走这个分支,出现动画一帧就被清掉。 if (Time.time < _appearAnimHoldUntil) return; + // ⭐ XJMH:停火不打断最后一发——射击动画还在播时先不清轨道,让它播完自然停住 + // (原版 Battery:Shoot 每发 SetAnimation(0,"shot",false),停止开火后不再重播、自然播完) + if (KeepPoseOnEmptyIdleAnim && !string.IsNullOrEmpty(attackAnim)) + { + var cur = skeletonAnimation.AnimationState.GetCurrent(0); + if (cur != null && !cur.IsComplete && cur.Animation != null && cur.Animation.Name == attackAnim) + return; + } + skeletonAnimation.AnimationState.ClearTrack(0); skeletonAnimation.AnimationState.SetEmptyAnimation(0, 0f); return; diff --git a/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs b/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs index 20bd378a8..f90f778e2 100644 --- a/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs +++ b/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs @@ -3582,6 +3582,11 @@ public class GameMainPanel_FishBase : GameMainPanel_Base //FireBullet(currSitData, angle, isSanShe, isDouble, isLock); SyncFire(angle, isSanShe, isDouble, isLock); + + // ⭐ XJMH 起飞炮台:手动按住扫射的**每发**也重播射击动画(原版 Battery:Shoot 每发重播)。 + // 自动开火路径每发会走 ChangeState(Attack)(内部已重播),这里兜住手动路径(同帧自动去重) + if (currSitData != null && currSitData.currentTurret is FlyTurretData flyShot) + flyShot.PlayShotAnim(); } // ==================== 起飞炮台(FlyTurretData) ====================