diff --git a/Assets/Framework/Tool/BeijingTimeManager.cs b/Assets/Framework/Tool/BeijingTimeManager.cs index 487221674..8597da0d9 100644 --- a/Assets/Framework/Tool/BeijingTimeManager.cs +++ b/Assets/Framework/Tool/BeijingTimeManager.cs @@ -1,18 +1,17 @@ -using System; +using System; using UnityEngine; using System.Collections; using UnityEngine.Networking; using Newtonsoft.Json.Linq; /// -/// 北京时间管理器 - 获取一次后持续自增 +/// 北京时间管理器 - 同步时记录服务器时间与本地系统时间的差值,获取时返回本地时间+差值 /// public class BeijingTimeManager : MonoSingleton { [Header("时间状态")] [SerializeField] private bool _isTimeSynced = false; - [SerializeField] private DateTime _currentBeijingTime; - [SerializeField] private float _timeSinceLastSync; + [SerializeField] private TimeSpan _serverTimeOffset; // 服务器时间 - 本地系统时间 /// /// 获取当前北京时间 @@ -23,7 +22,7 @@ public class BeijingTimeManager : MonoSingleton { if (_isTimeSynced) { - return _currentBeijingTime.AddSeconds(_timeSinceLastSync); + return DateTime.Now + _serverTimeOffset; } return DateTime.Now; // 未同步时返回本地时间 } @@ -63,14 +62,6 @@ public class BeijingTimeManager : MonoSingleton SyncBeijingTime(); } - private void Update() - { - if (_isTimeSynced) - { - _timeSinceLastSync += Time.deltaTime; - } - } - /// /// 同步北京时间 /// @@ -112,16 +103,16 @@ public class BeijingTimeManager : MonoSingleton if (url.Contains("timeapi.io")) { - + string timeStr = json["dateTime"]?.ToString(); Debug.Log(timeStr); if (!string.IsNullOrEmpty(timeStr)) { - _currentBeijingTime = DateTime.Parse(timeStr); - _timeSinceLastSync = 0; + DateTime serverTime = DateTime.Parse(timeStr); + _serverTimeOffset = serverTime - DateTime.Now; _isTimeSynced = true; - Debug.Log($"北京时间同步成功:{_currentBeijingTime:yyyy-MM-dd HH:mm:ss}"); - OnTimeSynced?.Invoke(_currentBeijingTime); + Debug.Log($"北京时间同步成功:{CurrentBeijingTime:yyyy-MM-dd HH:mm:ss},偏移量:{_serverTimeOffset.TotalSeconds:F1}s"); + OnTimeSynced?.Invoke(CurrentBeijingTime); yield break; } } @@ -133,13 +124,13 @@ public class BeijingTimeManager : MonoSingleton if (!string.IsNullOrEmpty(timeStr)) { - _currentBeijingTime = DateTimeOffset.Parse(timeStr) + DateTime serverTime = DateTimeOffset.Parse(timeStr) .ToOffset(TimeSpan.FromHours(8)) .DateTime; - _timeSinceLastSync = 0; + _serverTimeOffset = serverTime - DateTime.Now; _isTimeSynced = true; - Debug.Log($"北京时间同步成功:{_currentBeijingTime:yyyy-MM-dd HH:mm:ss}"); - OnTimeSynced?.Invoke(_currentBeijingTime); + Debug.Log($"北京时间同步成功:{CurrentBeijingTime:yyyy-MM-dd HH:mm:ss},偏移量:{_serverTimeOffset.TotalSeconds:F1}s"); + OnTimeSynced?.Invoke(CurrentBeijingTime); yield break; } } @@ -150,11 +141,11 @@ public class BeijingTimeManager : MonoSingleton if (!string.IsNullOrEmpty(timeStr)) { - _currentBeijingTime = DateTime.ParseExact(timeStr, "yyyy-MM-dd HH:mm:ss", null); - _timeSinceLastSync = 0; + DateTime serverTime = DateTime.ParseExact(timeStr, "yyyy-MM-dd HH:mm:ss", null); + _serverTimeOffset = serverTime - DateTime.Now; _isTimeSynced = true; - Debug.Log($"北京时间同步成功:{_currentBeijingTime:yyyy-MM-dd HH:mm:ss}"); - OnTimeSynced?.Invoke(_currentBeijingTime); + Debug.Log($"北京时间同步成功:{CurrentBeijingTime:yyyy-MM-dd HH:mm:ss},偏移量:{_serverTimeOffset.TotalSeconds:F1}s"); + OnTimeSynced?.Invoke(CurrentBeijingTime); yield break; } } @@ -169,7 +160,7 @@ public class BeijingTimeManager : MonoSingleton } Debug.LogError("所有时间服务器都失败了,使用本地时间"); - _currentBeijingTime = DateTime.Now; + _serverTimeOffset = TimeSpan.Zero; _isTimeSynced = false; } diff --git a/Assets/MyGame/Scripts/Characters/Monster/MonsterContral.cs b/Assets/MyGame/Scripts/Characters/Monster/MonsterContral.cs index a27db58fc..d259107b5 100644 --- a/Assets/MyGame/Scripts/Characters/Monster/MonsterContral.cs +++ b/Assets/MyGame/Scripts/Characters/Monster/MonsterContral.cs @@ -140,11 +140,11 @@ public class MonsterContral : MonoBehaviour // ================================================================ // Unity 生命周期 // ================================================================ - + public bool baseMmove; public virtual void Awake() { LoadHitEffect(); - + baseMmove = isMove; } public async void LoadHitEffect() { @@ -158,11 +158,14 @@ public class MonsterContral : MonoBehaviour } public virtual void OnEnable() { - // ⭐ 重置 isMove=true:池回收的鱼重新生成时,必须恢复移动状态。 - // 之前被注释掉导致:冰冻时 FreezeAllFish 设 isMove=false → 鱼被回收 → - // 重新生成后 isMove 残留 false → 鱼永远不动(一直在中间不会游动)。 - // 冰冻中重新激活的鱼,FreezeAllFish 会立即覆盖为 false,安全。 - isMove = true; + // ⭐ 用 baseMmove 恢复 isMove:Awake 时记录预制体原始 isMove 状态。 + // - 普通鱼预制体 isMove=true → 池回收后恢复 true,正常游动 + // (之前被注释导致:冰冻时 FreezeAllFish 设 isMove=false → 鱼回收 → + // 重新生成后残留 false → 鱼永远不动) + // - 爆奖 Boss 预制体 isMove=false → 恢复 false,固定在 (0,0,0) 播放动画 + // (金龙/雷龙/玉龙等不走路径,直到爆奖结束销毁) + // - 冰冻中重新激活的鱼,末尾会覆盖为 false,安全 + isMove = baseMmove; fishenum = (FishTypeEnum)monsterData.fishTypeConfig.fishType; uirootRect = UIManager.Instance.uiRoot.GetComponent(); mainCamera = Camera.main; @@ -170,7 +173,7 @@ public class MonsterContral : MonoBehaviour InitAnimList(); ChangeState(CharacterStateType.move); - // ⭐ 同步冰冻特效状态:池回收的鱼 bingDongEffect 可能残留激活状态, + // ⭐ 同步冰冻特效状态:池回收的鱼 bingDongEffect 可能残留激活状态, // 重新生成时会显示白色冰冻蒙皮。根据当前是否冰冻中决定显隐 bool frozen = CreateFishManager.Instance != null && CreateFishManager.Instance.isFrozen; SetFreezeEffect(frozen); diff --git a/Assets/MyGame/Scripts/Manager/GameManager.cs b/Assets/MyGame/Scripts/Manager/GameManager.cs index 134071f79..03d7d04f6 100644 --- a/Assets/MyGame/Scripts/Manager/GameManager.cs +++ b/Assets/MyGame/Scripts/Manager/GameManager.cs @@ -204,6 +204,9 @@ public class GameManager : MonoSingleton _ => 60 }; + // ⭐ 防止手机屏幕自动黑屏休眠 + Screen.sleepTimeout = SleepTimeout.NeverSleep; + AudioResourcesData audioResourcesData = new AudioResourcesData(); InItLoad(); //TurretResourcesData turretResourcesData = new TurretResourcesData(); diff --git a/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs b/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs index c4cf7d54a..1d41fc8f5 100644 --- a/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs +++ b/Assets/MyGame/aa/UI/Game/GameMainPanel_FishBase.cs @@ -1509,7 +1509,8 @@ public class GameMainPanel_FishBase : GameMainPanel_Base CrossPlatformInput input = GetInput(); if (!toggle_Lock.isOn) return; - if (!input.wasPressedThisFrame && !input.wasReleasedThisFrame) return; + //if (!input.wasPressedThisFrame && !input.wasReleasedThisFrame) return; + if (!input.wasPressedThisFrame) return; if (IsPointerOverUI(input.position)) return; // 射线从相机出发,指向鼠标点击点