This commit is contained in:
2026-09-30 03:36:44 +08:00
parent 47d6b3586c
commit e7a685a6d1
57 changed files with 1593 additions and 978 deletions
@@ -282,14 +282,6 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
public GameObject autoExitGamePanel; //倒计时面板
public TextMeshProUGUI tmp_ExitDaoJiShi; //里面显示的是这个 n秒后自动关闭
public Button btn_CloseAutoExitGamePanel; //退出游戏按钮
// XJMH 长按炮台扇形切换
[Header("XJMH 炮台长按切换")]
[Tooltip("长按炮台触发扇形切换的阈值(秒)")]
public float turretLongPressThreshold = 0.5f;
/// <summary>是否正在等待长按炮台判定(按下炮台但尚未超过阈值)</summary>
protected bool _isPendingTurretLongPress = false;
/// <summary>炮台扇形切换UI是否已显示</summary>
protected bool _isTurretSwitcherActive = false;
// ⭐ 起飞炮台(FlyTurretData):轻点空白处触发起飞
// 按下时先走正常开火流程,松开时判定为"轻点"(时长短+几乎没移动)才起飞,
@@ -523,8 +515,8 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
{
base.OnHide();
// ⭐ 清理 XJMH 扇形切换UI(如果还在显示)
CleanupTurretSwitcher();
// ⭐ 清理炮台切换面板(如果还在显示)
CleanupTurretPanel();
// ⭐ 解绑长按 img_OpenPT 打开炮台面板的订阅
UnhookOpenPTLongPress();
@@ -561,32 +553,38 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
private Action _openPTLongPressHandler;
/// <summary>
/// 订阅本地座位的 img_OpenPT 长按事件:长按开关炮台面板(subUIManager,与 btn_ChangeTurret 同逻辑)。
/// XJMH 模式没有炮台面板(用扇形切换),不订阅。
/// 订阅本地座位的 img_OpenPT 长按事件:长按触发 OnOpenPTLongPressTriggered(子类可覆写)。
/// </summary>
private void HookOpenPTLongPress(SitPosData sit)
{
// 先解绑旧订阅
UnhookOpenPTLongPress();
if (sit == null || sit.turretControlMode == TurretControlMode.XJMH) return;
if (sit == null) return;
_openPTLongPressHandler = () =>
{
// 与 btn_ChangeTurret 完全相同的开关逻辑:开着就关,没开就打开
var panel = subUIManager.Get<SubUIBase>(UIPanel.TurretPanel);
if (panel != null && panel.gameObject.activeSelf)
subUIManager.Hide(UIPanel.TurretPanel);
else
{
subUIManager.ShowAsync(UIPanel.TurretPanel, (ItemPanelSelect.Turrect, true));
StartCoroutine(CloseSettingList());
}
};
_openPTLongPressHandler = () => OnOpenPTLongPressTriggered();
sit.OnOpenPTLongPress += _openPTLongPressHandler;
_openPTHookedSit = sit;
}
/// <summary>
/// 长按 img_OpenPT 达到阈值触发。
/// Normal 模式:开关炮台面板(subUIManager,与 btn_ChangeTurret 同逻辑)。
/// XJMH 模式:子类覆写为开关 ChangePTPanel。
/// </summary>
protected virtual void OnOpenPTLongPressTriggered()
{
// 与 btn_ChangeTurret 完全相同的开关逻辑:开着就关,没开就打开
var panel = subUIManager.Get<SubUIBase>(UIPanel.TurretPanel);
if (panel != null && panel.gameObject.activeSelf)
subUIManager.Hide(UIPanel.TurretPanel);
else
{
subUIManager.ShowAsync(UIPanel.TurretPanel, (ItemPanelSelect.Turrect, true));
StartCoroutine(CloseSettingList());
}
}
/// <summary>解绑长按 img_OpenPT 的订阅(面板隐藏/重新订阅前调用)</summary>
private void UnhookOpenPTLongPress()
{
@@ -2406,11 +2404,6 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
if (mySitAnim != null && mySitAnim.gameObject.activeSelf)
mySitAnim.gameObject.SetActive(false);
// XJMH 模式:检测是否按在当前炮台上(长按触发扇形切换)
_isPendingTurretLongPress = !isChangingTurret
&& currSitData.turretControlMode == TurretControlMode.XJMH
&& IsTouchOnCurrentTurret(input.position);
if (!isChangingTurret)
{
// ⭐ 起飞炮台(FlyTurretData):
@@ -2421,13 +2414,13 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
{
if (flyTurret.IsFlying)
{
if (!_isPendingTurretLongPress && flyTurret.TakeoffToScreenPos(input.position))
if (flyTurret.TakeoffToScreenPos(input.position))
{
HookFlyTurretUpwardFire(flyTurret);
return;
}
}
else if (!_isPendingTurretLongPress && !currSitData.isDrillActive)
else if (!currSitData.isDrillActive)
{
_flyTapPending = true;
_flyTapTime = Time.time;
@@ -2438,7 +2431,7 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
// ⭐ 本地金币校验:没钱不切换 Attack 状态,也不广播,避免无效请求
if (!HasEnoughGoldToFire(toggle_Three.isOn))
return;
// 按下即进入 Attack:短按→射击,长按超过阈值后切回 Idle 弹扇形
// 按下即进入 Attack:短按→射击,松开后回 Idle
currSitData.ChangeState(TurretState.Attack);
SyncTurretState(TurretState.Attack);
}
@@ -2447,40 +2440,12 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
// 长按
if (input.isPressed)
{
// XJMH 长按炮台判定:超过阈值后弹出扇形切换UI
if (_isPendingTurretLongPress && !_isTurretSwitcherActive)
{
changeTurretTime += Time.deltaTime;
if (changeTurretTime >= turretLongPressThreshold)
{
_isPendingTurretLongPress = false;
_isTurretSwitcherActive = true;
// 扇形切换弹出时切回 Idle,停止射击动画
currSitData.ChangeState(TurretState.Idle);
SyncTurretState(TurretState.Idle);
OnTurretSwitcherShow(input.position);
}
}
if (_isTurretSwitcherActive)
{
OnTurretSwitcherUpdate(input.position);
return;
}
if (isChangingTurret)
{
HandleChangeTurretHold();
return;
}
// XJMH 待判定长按:不旋转(手指在炮台上旋转无意义),但仍允许开火(短按=射击)
if (_isPendingTurretLongPress)
{
TryFire();
return;
}
// ⭐ 起飞炮台:飞行/悬停期间手指按住不旋转不开火(炮口固定朝上,子弹自行向上发射)
if (currSitData.currentTurret is FlyTurretData flyHold && flyHold.IsFlying)
return;
@@ -2506,23 +2471,6 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
// 松开
if (input.wasReleasedThisFrame)
{
// XJMH 扇形切换释放:根据滑动位置选择炮台
if (_isTurretSwitcherActive)
{
_isTurretSwitcherActive = false;
_isPendingTurretLongPress = false;
changeTurretTime = 0;
OnTurretSwitcherHide(input.position);
return;
}
// XJMH 短按炮台释放(未触发长按)→ 正常回到 Idle
if (_isPendingTurretLongPress)
{
_isPendingTurretLongPress = false;
changeTurretTime = 0;
}
if (isChangingTurret)
{
isChangingTurret = false;
@@ -2592,39 +2540,10 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
isChangingTurret = false;
}
// ==================== XJMH 炮台扇形切换 ====================
// ==================== 炮台切换面板清理(子类扩展) ====================
/// <summary>
/// 检测触摸点是否在当前炮台的 RectTransform 范围内(XJMH 长按切换用)。
/// </summary>
protected bool IsTouchOnCurrentTurret(Vector2 screenPos)
{
if (currSitData == null || currSitData.currentTurret == null) return false;
RectTransform rt = currSitData.currentTurret.GetComponent<RectTransform>();
if (rt == null) return false;
Canvas canvas = UIManager.Instance != null && UIManager.Instance.uiRoot != null
? UIManager.Instance.uiRoot.GetComponent<Canvas>()
: null;
Camera cam = canvas != null && canvas.renderMode != RenderMode.ScreenSpaceOverlay ? canvas.worldCamera : null;
return RectTransformUtility.RectangleContainsScreenPoint(rt, screenPos, cam);
}
/// <summary>长按炮台达到阈值后弹出扇形切换UI(子类覆写实现具体UI)。</summary>
protected virtual void OnTurretSwitcherShow(Vector2 pressPos) { }
/// <summary>扇形切换UI显示期间,手指滑动时更新高亮(子类覆写)。</summary>
protected virtual void OnTurretSwitcherUpdate(Vector2 currentPos) { }
/// <summary>手指松开,关闭扇形切换UI并根据滑动位置切换炮台(子类覆写)。</summary>
protected virtual void OnTurretSwitcherHide(Vector2 releasePos) { }
/// <summary>清理扇形切换UI状态(面板隐藏时调用)</summary>
protected virtual void CleanupTurretSwitcher()
{
_isTurretSwitcherActive = false;
_isPendingTurretLongPress = false;
changeTurretTime = 0;
}
/// <summary>面板隐藏时清理炮台切换面板(子类覆写)。</summary>
protected virtual void CleanupTurretPanel() { }