diff --git a/Assets/MyGame/Scripts/Turret/SitPosData.cs b/Assets/MyGame/Scripts/Turret/SitPosData.cs index 1cfcf4ab6..8a1b37cc9 100644 --- a/Assets/MyGame/Scripts/Turret/SitPosData.cs +++ b/Assets/MyGame/Scripts/Turret/SitPosData.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using TMPro; using UnityEngine; +using UnityEngine.EventSystems; using UnityEngine.UI; /// 炮台控制模式 @@ -14,8 +15,18 @@ public enum TurretControlMode XJMH = 1 } -public class SitPosData : MonoBehaviour +public class SitPosData : MonoBehaviour, IPointerDownHandler, IPointerUpHandler { + [Tooltip("长按判定时间(秒):按住 img_OpenPT 超过此时间触发 OnOpenPTLongPress")] + public float openPTLongPressTime = 0.5f; + public Image img_OpenPT; + + /// 长按 img_OpenPT 触发一次(GameMainPanel 订阅后用它开关炮台面板,仅本地玩家座位有意义) + public event Action OnOpenPTLongPress; + + private bool _openPTPressing; + private float _openPTPressTimer; + public bool IsBaoJiangingActive; public Transform obj_BaoJiangZhongPanelPosition; @@ -294,6 +305,39 @@ public class SitPosData : MonoBehaviour private void Update() { UpdateZhanShenLaser(); + + // ⭐ 长按 img_OpenPT 计时:到达阈值触发一次(提前松手不触发) + if (_openPTPressing) + { + _openPTPressTimer += Time.deltaTime; + if (_openPTPressTimer >= openPTLongPressTime) + { + _openPTPressing = false; + _openPTPressTimer = 0f; + OnOpenPTLongPress?.Invoke(); + } + } + } + + // ==================== 长按 img_OpenPT(打开炮台面板) ==================== + + /// 按下:命中 img_OpenPT(或其子对象)才开始长按计时(其他区域不响应) + public void OnPointerDown(PointerEventData eventData) + { + if (img_OpenPT == null) return; + var hit = eventData.pointerCurrentRaycast.gameObject; + if (hit == null) return; + if (hit != img_OpenPT.gameObject && !hit.transform.IsChildOf(img_OpenPT.transform)) return; + + _openPTPressing = true; + _openPTPressTimer = 0f; + } + + /// 松开:取消长按计时(未达阈值不触发) + public void OnPointerUp(PointerEventData eventData) + { + _openPTPressing = false; + _openPTPressTimer = 0f; } // ==================== 战神激光(锁定时显示) ==================== diff --git a/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs b/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs index eb93743f8..4f658b11e 100644 --- a/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs +++ b/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs @@ -278,7 +278,8 @@ public class GameMainPanel_FishBase : GameMainPanel_Base if (item.posID == roomJoinNotice.position) { currSitData = item; - + // ⭐ 长按本地座位的 img_OpenPT 开关炮台面板(与 btn_ChangeTurret 同逻辑) + HookOpenPTLongPress(currSitData); } else { @@ -415,6 +416,9 @@ public class GameMainPanel_FishBase : GameMainPanel_Base // ⭐ 清理 XJMH 扇形切换UI(如果还在显示) CleanupTurretSwitcher(); + // ⭐ 解绑长按 img_OpenPT 打开炮台面板的订阅 + UnhookOpenPTLongPress(); + UnLoadResources(); // 场景可能未加载或已卸载,做保护避免重复卸载报错 var scene = SceneManager.GetSceneByName(sceneName); @@ -432,6 +436,51 @@ public class GameMainPanel_FishBase : GameMainPanel_Base } #endregion + #region 长按 img_OpenPT 开关炮台面板 + + /// 已订阅长按事件的座位(换座位/重进房间时先解绑避免重复订阅) + private SitPosData _openPTHookedSit; + /// 缓存的长按处理器(解绑用) + private Action _openPTLongPressHandler; + + /// + /// 订阅本地座位的 img_OpenPT 长按事件:长按开关炮台面板(subUIManager,与 btn_ChangeTurret 同逻辑)。 + /// XJMH 模式没有炮台面板(用扇形切换),不订阅。 + /// + private void HookOpenPTLongPress(SitPosData sit) + { + // 先解绑旧订阅 + UnhookOpenPTLongPress(); + + if (sit == null || sit.turretControlMode == TurretControlMode.XJMH) return; + + _openPTLongPressHandler = () => + { + // 与 btn_ChangeTurret 完全相同的开关逻辑:开着就关,没开就打开 + var panel = subUIManager.Get(UIPanel.TurretPanel); + if (panel != null && panel.gameObject.activeSelf) + subUIManager.Hide(UIPanel.TurretPanel); + else + { + subUIManager.ShowAsync(UIPanel.TurretPanel, (ItemPanelSelect.Turrect, true)); + StartCoroutine(CloseSettingList()); + } + }; + sit.OnOpenPTLongPress += _openPTLongPressHandler; + _openPTHookedSit = sit; + } + + /// 解绑长按 img_OpenPT 的订阅(面板隐藏/重新订阅前调用) + private void UnhookOpenPTLongPress() + { + if (_openPTHookedSit != null && _openPTLongPressHandler != null) + _openPTHookedSit.OnOpenPTLongPress -= _openPTLongPressHandler; + _openPTHookedSit = null; + _openPTLongPressHandler = null; + } + + #endregion + #region 生命周期 private float baseAttackTime; diff --git a/Assets/MyGame/aa/UI/Game/左下.prefab b/Assets/MyGame/aa/UI/Game/左下.prefab index 499c84d18..fa20ebadf 100644 --- a/Assets/MyGame/aa/UI/Game/左下.prefab +++ b/Assets/MyGame/aa/UI/Game/左下.prefab @@ -739,6 +739,81 @@ MonoBehaviour: y: 0 width: 1 height: 1 +--- !u!1 &2018068718678918123 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 743621258860174113} + - component: {fileID: 5020678746128137213} + - component: {fileID: 1043577480745425357} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &743621258860174113 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2018068718678918123} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2732244402854446462} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 80.221466} + m_SizeDelta: {x: 210.2, y: 123.8501} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5020678746128137213 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2018068718678918123} + m_CullTransparentMesh: 1 +--- !u!114 &1043577480745425357 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2018068718678918123} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 --- !u!1 &2025156255710582528 GameObject: m_ObjectHideFlags: 0 @@ -1244,7 +1319,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Color: {r: 1, g: 1, b: 1, a: 0.6745098} m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -2132,6 +2207,7 @@ RectTransform: - {fileID: 5516422369603436267} - {fileID: 1688708463719695129} - {fileID: 332937045809476598} + - {fileID: 743621258860174113} m_Father: {fileID: 8303575886087428388} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0} @@ -2780,6 +2856,8 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 16cfaab69e1fa404dbb8432276bd7537, type: 3} m_Name: m_EditorClassIdentifier: + openPTLongPressTime: 0.5 + img_OpenPT: {fileID: 1043577480745425357} IsBaoJiangingActive: 0 obj_BaoJiangZhongPanelPosition: {fileID: 6515038176716052403} user: @@ -4249,6 +4327,21 @@ PrefabInstance: propertyPath: m_Name value: gun_barrel_14901_multy objectReference: {fileID: 0} + - target: {fileID: 2826291771310781170, guid: 3a10d8f351e3d52489bceee1b4740337, + type: 3} + propertyPath: m_LocalScale.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2826291771310781170, guid: 3a10d8f351e3d52489bceee1b4740337, + type: 3} + propertyPath: m_LocalScale.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2826291771310781170, guid: 3a10d8f351e3d52489bceee1b4740337, + type: 3} + propertyPath: m_LocalScale.z + value: 0 + objectReference: {fileID: 0} - target: {fileID: 3658765242434420830, guid: 3a10d8f351e3d52489bceee1b4740337, type: 3} propertyPath: m_SortingLayer diff --git a/Assets/MyGame/aa/UI/Home/UIHomeMain.cs b/Assets/MyGame/aa/UI/Home/UIHomeMain.cs index 1a00afd2b..e7a7fb5a6 100644 --- a/Assets/MyGame/aa/UI/Home/UIHomeMain.cs +++ b/Assets/MyGame/aa/UI/Home/UIHomeMain.cs @@ -176,7 +176,7 @@ public class UIHomeMain : UIBase APIRequestList.GetRankingRewardConfig(cfg => { Debug.Log($"[排行榜入口] isEnabled={cfg.isEnabled} isMaintaining={cfg.isMaintaining}"); - if (!cfg.isMaintaining) + if (cfg.isMaintaining|| !cfg.isEnabled) { // 排行榜维护中:弹提示弹窗(点确认关闭),不打开界面 UIManager.Instance.ShowTiShi(string.IsNullOrEmpty(cfg.maintainingMessage) ? "维护中..." : cfg.maintainingMessage);