1
This commit is contained in:
@@ -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() { }
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user