This commit is contained in:
2026-07-29 00:31:59 +08:00
parent f4aef59114
commit 8d04198f5b
4 changed files with 106 additions and 52 deletions
@@ -187,32 +187,40 @@ namespace Assets.MyGame.Scripts.Net
case GameType.JQQD:
break;
case GameType.defaultPanel:
UIManager.Instance.Get<GameMainPanel_FishBase>(UIPanel.MainGamePanelDefault).currSitData.goldNum = gold;
UpdateLocalPlayerGold(UIPanel.MainGamePanelDefault, gold);
break;
case GameType.FLZY:
UIManager.Instance.Get<GameMainPanel_FishBase>(UIPanel.MainGamePanelFLZY).currSitData.goldNum = gold;
UpdateLocalPlayerGold(UIPanel.MainGamePanelFLZY, gold);
break;
case GameType.YYSC:
UIManager.Instance.Get<GameMainPanel_FishBase>(UIPanel.MainGamePanelYYSC).currSitData.goldNum = gold;
UpdateLocalPlayerGold(UIPanel.MainGamePanelYYSC, gold);
break;
case GameType.ZGXQ:
break;
case GameType.XJMH:
UIManager.Instance.Get<GameMainPanel_FishBase>(UIPanel.MainGamePanelXJMH).currSitData.goldNum = gold;
UpdateLocalPlayerGold(UIPanel.MainGamePanelXJMH, gold);
break;
case GameType.HHWK:
UIManager.Instance.Get<GameMainPanel_FishBase>(UIPanel.MainGamePanelHHWK).currSitData.goldNum = gold;
UpdateLocalPlayerGold(UIPanel.MainGamePanelHHWK, gold);
break;
default:
break;
}
}
/// <summary>
/// 后端推送 SyncPlayerGold 时同步本地玩家金币(底层值 + UI 显示)。
/// 之前只更新 goldNum 不刷新 tMP_GoldNum.text,导致 UI 显示和后端 authoritative 值不同步,
/// 后续杀鱼累加基于修正值但 UI 显示旧值,差距越拉越大。
/// </summary>
private static void UpdateLocalPlayerGold(UIPanel panelType, long gold)
{
var panel = UIManager.Instance.Get<GameMainPanel_FishBase>(panelType);
if (panel == null || panel.currSitData == null) return;
panel.currSitData.goldNum = gold;
if (panel.currSitData.tMP_GoldNum != null)
panel.currSitData.tMP_GoldNum.text = gold.ToString();
}
public static void GetRoomInfoResult(string msg)
{
//GameManager.Instance.StartGame();RoomChangeResponse
@@ -4,6 +4,7 @@ using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using static UnityEngine.AddressableAssets.Addressables;
[Serializable]
@@ -31,6 +32,9 @@ public class TurretResourcesData
private static Dictionary<int, GameObject> turretPrefabDic; // id → prefab
private static Dictionary<int, Sprite> turretSpriteDic; // id → sprite
// ---- 保留的 AA Handle(不释放,避免 Build 下资源被卸载)----
private static readonly List<AsyncOperationHandle> _loadedHandles = new List<AsyncOperationHandle>();
static TurretResourcesData()
{
Init();
@@ -93,18 +97,27 @@ public class TurretResourcesData
/// <summary>
/// 加载炮台相关 Addressables 资源(PT + Default 标签交集)。
/// 注意:Handle 必须保留,不能 Release,否则 Build 下资源会被立即卸载,
/// 字典中存的就是已销毁对象的引用(Editor 下因 AssetDatabase 模式不会暴露此问题)。
/// </summary>
public static async Task LoadTurretAssetsData()
{
turretPrefabDic = new Dictionary<int, GameObject>();
turretSpriteDic = new Dictionary<int, Sprite>();
// 清理上一轮残留的 Handle
foreach (var h in _loadedHandles)
{
if (h.IsValid()) Addressables.Release(h);
}
_loadedHandles.Clear();
var labels = new List<string> { turret_AALabel, defaultSubLabel };
Debug.Log("[TurretResourcesData] 开始预下载炮台资源依赖 (PT + Default)...");
var depHandle = Addressables.DownloadDependenciesAsync(labels, MergeMode.Intersection);
await depHandle.Task;
Addressables.Release(depHandle);
Addressables.Release(depHandle); // 预下载 Handle 可以立即释放,只影响下载缓存
Debug.Log("[TurretResourcesData] 炮台依赖资源预下载完成!");
// ---- 加载炮台 Prefab ----
@@ -118,7 +131,8 @@ public class TurretResourcesData
}, MergeMode.Intersection);
await prefabHandle.Task;
Addressables.Release(prefabHandle);
// 不释放!保留 Handle 以保持资源存活
_loadedHandles.Add(prefabHandle);
Debug.Log($"[TurretResourcesData] 炮台 Prefab 加载完成,共 {turretPrefabDic.Count} 个");
// ---- 加载炮台 Sprite ----
@@ -132,7 +146,8 @@ public class TurretResourcesData
}, MergeMode.Intersection);
await spriteHandle.Task;
Addressables.Release(spriteHandle);
// 不释放!保留 Handle 以保持资源存活
_loadedHandles.Add(spriteHandle);
Debug.Log($"[TurretResourcesData] 炮台 Sprite 加载完成,共 {turretSpriteDic.Count} 个");
Debug.Log("[TurretResourcesData] 所有炮台资源加载完毕!");
@@ -140,44 +155,25 @@ public class TurretResourcesData
/// <summary>
/// 卸载炮台 Addressables 资源。
/// 释放 LoadTurretAssetsData 中保留的所有 Handle。
/// </summary>
public static async Task UnLoadTurretAssetsData()
public static Task UnLoadTurretAssetsData()
{
var labels = new List<string> { turret_AALabel, defaultSubLabel };
// 卸载 Prefab
var prefabHandle = Addressables.LoadAssetsAsync<GameObject>(labels, null, MergeMode.Intersection);
await prefabHandle.Task;
if (prefabHandle.Result != null)
foreach (var h in _loadedHandles)
{
foreach (var prefab in prefabHandle.Result)
if (h.IsValid())
{
if (turretPrefabPathDic.TryGetValue(prefab.name, out int id))
{
if (turretPrefabDic != null && turretPrefabDic.Remove(id))
Debug.Log($"[TurretResourcesData] 卸载 Prefab: {prefab.name} (ID={id})");
}
Addressables.Release(h);
Debug.Log($"[TurretResourcesData] 释放 Handle: {h.DebugName}");
}
}
Addressables.Release(prefabHandle);
_loadedHandles.Clear();
// 卸载 Sprite
var spriteHandle = Addressables.LoadAssetsAsync<Sprite>(labels, null, MergeMode.Intersection);
await spriteHandle.Task;
if (spriteHandle.Result != null)
{
foreach (var sprite in spriteHandle.Result)
{
if (turretSpritePathDic.TryGetValue(sprite.name, out int id))
{
if (turretSpriteDic != null && turretSpriteDic.Remove(id))
Debug.Log($"[TurretResourcesData] 卸载 Sprite: {sprite.name} (ID={id})");
}
}
}
Addressables.Release(spriteHandle);
turretPrefabDic?.Clear();
turretSpriteDic?.Clear();
Debug.Log($"[TurretResourcesData] 卸载完成,剩余 Prefab: {turretPrefabDic?.Count ?? 0}, Sprite: {turretSpriteDic?.Count ?? 0}");
return Task.CompletedTask;
}
// ==================== 查询接口 ====================