From 63b1eb772e444661c849a1d69c23cb0e5b65d567 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=A3=AE2003?= <2384017988@qq.com>
Date: Wed, 2 Sep 2026 16:27:35 +0800
Subject: [PATCH] 1
---
Assets/MyGame/Scripts/Turret/FlyTurretData.cs | 277 +++
.../Scripts/Turret/FlyTurretData.cs.meta | 11 +
Assets/MyGame/Scripts/Turret/TurretData.cs | 4 +-
.../MyGame/aa/Game/FLZY/BOSS/ZDX/1595.prefab | 4 +-
.../aa/UI/Game/GameMainPanel_FishBase.cs | 86 +
.../aa/UI/Game/XJMH/GameMainPanelXJMH.prefab | 1929 ++++++++++++++++-
6 files changed, 2304 insertions(+), 7 deletions(-)
create mode 100644 Assets/MyGame/Scripts/Turret/FlyTurretData.cs
create mode 100644 Assets/MyGame/Scripts/Turret/FlyTurretData.cs.meta
diff --git a/Assets/MyGame/Scripts/Turret/FlyTurretData.cs b/Assets/MyGame/Scripts/Turret/FlyTurretData.cs
new file mode 100644
index 000000000..9e7e4ab41
--- /dev/null
+++ b/Assets/MyGame/Scripts/Turret/FlyTurretData.cs
@@ -0,0 +1,277 @@
+using System;
+using UnityEngine;
+
+///
+/// 起飞炮台(TurretData 子类):
+/// 平时是一门正常炮台(照常手动瞄准开火/自动开火/锁定瞄准);
+/// 额外支持起飞模式:轻点空白处 → 炮台飞到该点(点到哪飞到哪)→ 到达后持续向上发射子弹,
+/// upFireDuration 到时自动降落回原位恢复正常开火;起飞时播放特殊 spine 动画
+/// (takeoffAnim 播一次,flyLoopAnim 循环衔接)。
+/// 交互判定在 GameMainPanel_FishBase.HandleInput(轻点=按下短+几乎没移动;按住扫射不触发起飞)。
+/// 挂在 XJMH 座位炮台(xjmhTurretList 中的子对象)上即可,无需改预制体结构。
+/// 注意:不要在本类定义 Awake/OnEnable,会隐藏基类的同名私有初始化逻辑。
+///
+public class FlyTurretData : TurretData
+{
+ [Header("起飞(点哪飞哪)")]
+ [Tooltip("起飞特殊 spine 动画名(起飞时播一次;为空则直接播飞行循环动画)")]
+ public string takeoffAnim;
+ [Tooltip("飞行/悬停循环 spine 动画名(为空则起飞动画播完后循环自身)")]
+ public string flyLoopAnim;
+ [Tooltip("飞行到目标点的时长(秒)")]
+ public float flyDuration = 0.6f;
+ [Tooltip("飞行插值:0=匀速 1=平滑缓入缓出")]
+ [Range(0f, 1f)]
+ public float flySmooth = 1f;
+ [Tooltip("目标点距画布边缘的最小内边距(画布本地单位),防止炮台飞出屏幕")]
+ public float edgePadding = 60f;
+
+ [Header("向上发射子弹")]
+ [Tooltip("向上开火间隔(秒)")]
+ public float upFireInterval = 0.4f;
+ [Tooltip("向上开火总时长(秒),<=0 表示一直开火(手动点击别处可改变目标)")]
+ public float upFireDuration = 0f;
+ [Tooltip("到达目标点后延迟多久开始向上开火(秒),通常等起飞动画收尾")]
+ public float upFireDelay = 0f;
+
+ /// 向上开火回调:由 GameMainPanel_FishBase 注入(走服务端同步链路 SyncFire)
+ [NonSerialized] public Action onUpwardFire;
+
+ /// 是否处于飞行/悬停状态(含飞回降落途中)
+ public bool IsFlying { get; private set; }
+
+ private RectTransform _rect;
+ private RectTransform _parentRect;
+ private RectTransform _canvasRect;
+ private Camera _uiCam;
+
+ private Vector2 _originAnchoredPos; // 首次起飞前的原位(降落飞回这里)
+ private Vector2 _flyFrom;
+ private Vector2 _flyTo;
+ private float _flyTimer;
+ private bool _returning; // true=正在飞回原位降落
+
+ private float _fireDelayTimer;
+ private float _fireTimer;
+ private float _fireTotalTimer;
+ private bool _firing;
+
+ /// 懒加载引用(不用 Awake,避免隐藏基类私有 Awake)
+ private void EnsureRefs()
+ {
+ if (_rect != null) return;
+
+ _rect = GetComponent();
+ _parentRect = transform.parent as RectTransform;
+
+ Canvas canvas = null;
+ if (UIManager.Instance != null && UIManager.Instance.uiRoot != null)
+ canvas = UIManager.Instance.uiRoot.GetComponent