This commit is contained in:
2026-09-28 20:19:27 +08:00
parent d396870d37
commit 106c48cf82
12 changed files with 154 additions and 15 deletions
@@ -443,6 +443,9 @@ public class CreateFishManager : MonoSingleton<CreateFishManager>
/// <summary>进入房间:初始化生成系统并绑定游戏面板。</summary>
public void EnterRoom(GameTypeEnum gameType)
{
// ⭐ 复位残留冰冻状态:冰冻中切房时旧面板倒计时未走完就销毁,
// 不会触发 UnfreezeAllFish → isFrozen 残留 true → 新房间 OnFishSpawn 全部被拦,不出鱼
ResetFreezeState();
InitSpawnSystem(gameType);
BindCurrentGamePanel();
EnsureBJEffectRoot();
@@ -1344,6 +1347,9 @@ public class CreateFishManager : MonoSingleton<CreateFishManager>
{
//await Task.Delay(2000);
// ⭐ 退房复位冰冻状态:冰冻中退房时旧面板倒计时未走完就销毁,
// 不会触发 UnfreezeAllFish → isFrozen 残留 true → 污染下一个房间不出鱼
ResetFreezeState();
spawnList = null;
spawnDic = null;
// ⭐ 退房清理排队中的出鱼事件,防止旧房间残留鱼泄进下一个房间
@@ -2333,6 +2339,23 @@ public class CreateFishManager : MonoSingleton<CreateFishManager>
}
#region 冰冻技能
/// <summary>
/// 复位冰冻状态(退房/进房时调用):
/// 清除 isFrozen 与冰冻记录,并停掉所有出鱼协程。
/// ⭐ 若不复位:冰冻中切换房间时,旧面板的 15s 解冻倒计时随面板一起销毁,
/// 永远不会调用 UnfreezeAllFish → isFrozen 残留 true →
/// 新房间 OnFishSpawn 第一行 `if (isFrozen) return;` 把服务端所有出鱼全部拦掉 → 新房间不出鱼。
/// ⭐ StopAllCoroutines:分帧出鱼协程里的 `while (isFrozen) yield return null;` 会一直挂起,
/// 解冻复位后会继续把旧房间排队的鱼生成到新房间,必须一并停掉。
/// </summary>
public void ResetFreezeState()
{
isFrozen = false;
frozenFishStates.Clear();
frozenFishIsMoves.Clear();
StopAllCoroutines();
}
/// <summary>
/// 冰冻:记录所有鱼当前状态并强制切到 Idle(暂停移动+动画)
/// </summary>
@@ -158,6 +158,10 @@ public class SitPosData : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
private const float LaserFXWaitFallback = 2f;
/// <summary>上一帧是否有锁定点(检测锁定建立沿,触发准备等待)</summary>
private bool _laserLockActive;
/// <summary>激光循环音效是否正在播放(跟随激光实际显示状态起停,避免每帧重复触发)</summary>
private bool _laserSoundOn;
/// <summary>激光循环音效当前播放速度(1=正常,2=狂暴2倍速),用于边沿比较避免每帧重复调用</summary>
private float _laserSoundPitch = 1f;
/// <summary>预制体形态激光的基准缩放(重建时取自 laserPrefab.transform.localScale)</summary>
private Vector3 _laserFxBaseScale = Vector3.one;
/// <summary>预制体形态激光的角度偏移:激光预制体自带的 Z 轴旋转(重建时缓存,绕世界 Z 叠加在计算朝向上)</summary>
@@ -478,6 +482,9 @@ public class SitPosData : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
// 两个条件满足其一即激活——散射模式开着但目标不足时也要显示起点球
UpdateJGFXParentsActive(lockActive && (_laserTargets.Count > 1 || isScatterLaserOn));
// ⭐ 激光循环音效:跟随"激光实际显示"状态起停(激光音效很长,逐发播会重叠,改为循环)
UpdateZhanShenLaserSound(lockActive);
#if UNITY_EDITOR
DebugJGFXState();
#endif
@@ -505,6 +512,43 @@ public class SitPosData : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
_laserPrepWait = 0f;
}
/// <summary>
/// 激光循环音效:跟随"激光实际显示"状态起停(仅本地座位,且战神配置了 laserAudio 才播)。
/// ⭐ 用 AudioManager.PlayFXLoop 走专用循环 AudioSource——激光音效很长,逐发 PlayOneShot 会重叠;
/// 起停走状态边沿,锁定期间不重复触发;激光消失/清战神/座位禁用时由 DestroyZhanShenLaser 停止。
/// ⭐ 狂暴(暴走道具,开火速度翻倍)时同步把激光音效提到 2 倍速。
/// </summary>
private void UpdateZhanShenLaserSound(bool laserVisible)
{
var zsData = currentZhanShenData as ZhanShenTurretData;
bool shouldPlay = laserVisible && this == localPlayerSit && zsData != null && zsData.laserAudio != null;
if (!shouldPlay)
{
// 激光消失/非本地/未配置音效:停止循环(仅本座位在播时才停,避免误停他人座位)
if (_laserSoundOn)
{
_laserSoundOn = false;
AudioManager.Instance.StopFXLoop();
}
return;
}
// ⭐ 狂暴:激光音效同步 2 倍速(与开火速度翻倍一致)
float pitch = IsFrenzyNow() ? 2f : 1f;
if (_laserSoundOn && Mathf.Approximately(pitch, _laserSoundPitch)) return; // 已在播且速度未变 → 无需处理
_laserSoundOn = true;
_laserSoundPitch = pitch;
AudioManager.Instance.PlayFXLoop(zsData.laserAudio, pitch); // 已在播同一条时只变速,不重头播
}
/// <summary>本地座位当前是否狂暴(开火速度翻倍):狂暴标志由面板 SetFrenzy 维护在炮台/战神数据上</summary>
private bool IsFrenzyNow()
{
if (currentZhanShenData != null && currentZhanShenData.isFrenzy) return true;
return currentTurret != null && currentTurret.isFrenzy;
}
/// <summary>隐藏全部战神激光(两种形态都处理)</summary>
private void HideZhanShenLasers()
{
@@ -670,6 +714,12 @@ public class SitPosData : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
// 准备动画等待状态复位(下次锁定重新计时)
_laserPrepWait = 0f;
_laserLockActive = false;
// 激光循环音效停止(仅本座位在播时才停,避免误停他人座位)
if (_laserSoundOn)
{
_laserSoundOn = false;
AudioManager.Instance.StopFXLoop();
}
}
// ==================== 激光起点/命中特效(三发+锁定) ====================