This commit is contained in:
2026-09-02 16:27:35 +08:00
parent e85459257a
commit 63b1eb772e
6 changed files with 2304 additions and 7 deletions
@@ -205,6 +205,15 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
/// <summary>炮台扇形切换UI是否已显示</summary>
protected bool _isTurretSwitcherActive = false;
// ⭐ 起飞炮台(FlyTurretData):轻点空白处触发起飞
// 按下时先走正常开火流程,松开时判定为"轻点"(时长短+几乎没移动)才起飞,
// 保证按住扫射的普通开火完全不受影响
private bool _flyTapPending = false; // 本次按下待判定轻点
private float _flyTapTime; // 按下时刻
private Vector2 _flyTapPos; // 按下位置
private const float flyTapMaxDuration = 0.25f; // 轻点判定:按下到松开最大时长(秒)
private const float flyTapMaxMove = 40f; // 轻点判定:最大移动距离(像素)
int bulletCount = 0;
public GameObject boardCast_Boss;
@@ -1042,6 +1051,28 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
if (!isChangingTurret)
{
// ⭐ 起飞炮台(FlyTurretData):
// 飞行/悬停中 → 点击空白处=改目标(点到哪飞到哪),立即响应;
// 未起飞 → 仅记录轻点判定,继续走下方正常开火流程(松开时判定轻点才起飞),
// 保证平时按住扫射/自动开火与普通炮台完全一致
if (currSitData.currentTurret is FlyTurretData flyTurret)
{
if (flyTurret.IsFlying)
{
if (!_isPendingTurretLongPress && flyTurret.TakeoffToScreenPos(input.position))
{
HookFlyTurretUpwardFire(flyTurret);
return;
}
}
else if (!_isPendingTurretLongPress && !currSitData.isDrillActive)
{
_flyTapPending = true;
_flyTapTime = Time.time;
_flyTapPos = input.position;
}
}
// ⭐ 本地金币校验:没钱不切换 Attack 状态,也不广播,避免无效请求
if (!HasEnoughGoldToFire(toggle_Three.isOn))
return;
@@ -1088,6 +1119,10 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
return;
}
// ⭐ 起飞炮台:飞行/悬停期间手指按住不旋转不开火(炮口固定朝上,子弹自行向上发射)
if (currSitData.currentTurret is FlyTurretData flyHold && flyHold.IsFlying)
return;
// 锁定模式:不手动旋转/开火,交给 HandleAutoRotate + HandleAutoFire
// ⭐ 特殊鱼爆奖期间例外:自动锁定已禁用,玩家点击仍可手动旋转炮台瞄准发射方向
if (toggle_Lock.isOn && !(currSitData != null && currSitData.isDrillActive)) return;
@@ -1127,6 +1162,22 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
return;
}
// ⭐ 起飞炮台:轻点空白处=起飞(按下时已正常开火,松开时判定轻点→触发起飞)
// 长按/拖动扫射时此判定不通过,正常走下方 Idle,普通开火完全不受影响
if (_flyTapPending)
{
_flyTapPending = false;
if (currSitData.currentTurret is FlyTurretData flyTap
&& !flyTap.IsFlying
&& Time.time - _flyTapTime <= flyTapMaxDuration
&& Vector2.Distance(input.position, _flyTapPos) <= flyTapMaxMove
&& flyTap.TakeoffToScreenPos(input.position))
{
HookFlyTurretUpwardFire(flyTap);
return; // 起飞:跳过下方 Idle 切换,避免打断起飞动画
}
}
currSitData.ChangeState(TurretState.Idle);
SyncTurretState(TurretState.Idle);
}
@@ -1323,6 +1374,9 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
// ⭐ 特殊鱼爆奖(钻头/激光)期间禁用自动旋转:锁定跟随/自动扫射都让位,炮台方向只由玩家点击控制
if (currSitData != null && currSitData.isDrillActive) return;
// ⭐ 起飞炮台:飞行/悬停期间禁用自动旋转(炮口固定朝上)
if (currSitData != null && currSitData.currentTurret is FlyTurretData flyAuto && flyAuto.IsFlying) return;
// 锁定模式优先
if (toggle_Lock.isOn && currSitData.isLock)
{
@@ -1425,6 +1479,9 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
// ⭐ 特殊鱼炮台(钻头)活动期间禁用普通开火,点击只发射钻头
if (currSitData != null && currSitData.isDrillActive) return;
// ⭐ 起飞炮台:飞行/悬停期间禁用普通开火(此时由悬停逻辑自动向上发射);平时正常开火
if (currSitData != null && currSitData.currentTurret is FlyTurretData flyFire && flyFire.IsFlying) return;
clickTime += Time.deltaTime;
if (clickTime < attackTime) return;
@@ -1450,6 +1507,32 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
//FireBullet(currSitData, angle, isSanShe, isDouble, isLock);
SyncFire(angle, isSanShe, isDouble, isLock);
}
// ==================== 起飞炮台(FlyTurretData) ====================
/// <summary>给起飞炮台挂上向上开火回调(每次起飞前刷新,防止切炮台后回调丢失/错位)</summary>
private void HookFlyTurretUpwardFire(FlyTurretData flyTurret)
{
if (flyTurret == null) return;
flyTurret.onUpwardFire = OnFlyTurretUpwardFire;
}
/// <summary>
/// 起飞炮台悬停时的向上开火:angle=0(正上方,aim-90约定)。
/// 校验与普通开火一致(金币/子弹上限/退出倒计时),子弹照常走服务端同步链路。
/// 不广播 TurretState:SyncFire 每 0.4 秒一发已带全部信息,逐发状态广播会刷屏网络。
/// </summary>
private void OnFlyTurretUpwardFire()
{
if (currSitData == null || _isLeavingCountdown) return;
if (currSitData.isDrillActive) return;
if (!HasEnoughGoldToFire(false)) return;
if (IsBulletLimitReached(currSitData.user)) return;
// 0° = 正上方;起飞炮台不支持三连
SyncFire(0f, false, toggle_Shuang != null && toggle_Shuang.isOn, false);
}
/// <summary>战神激光命中延迟(秒):不开实体子弹,开火后延迟此时间直接发 KillFish 给后端(模拟弹道飞行)</summary>
[Tooltip("战神激光命中延迟(秒):不开实体子弹,开火后延迟此时间直接发 KillFish 给后端")]
public float laserHitDelay = 0.2f;
@@ -1688,6 +1771,9 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
// ⭐ 特殊鱼炮台(钻头)活动期间禁用普通自动开火
if (currSitData.isDrillActive) return;
// ⭐ 起飞炮台:飞行/悬停期间暂停自动开火(此时由悬停逻辑自动向上发射),平时正常自动开火
if (currSitData.currentTurret is FlyTurretData flyAutoFire && flyAutoFire.IsFlying) return;
bool needAutoFire = toggle_SkillAuto.isOn || (toggle_Lock.isOn && currSitData.isLock && currSitData.lockFX.gameObject.activeSelf);
if (!needAutoFire)
{