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) ====================