1
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
// ==================== 激光起点/命中特效(三发+锁定) ====================
|
||||
|
||||
Reference in New Issue
Block a user