This commit is contained in:
2026-10-09 20:20:14 +08:00
parent 6769b7f31c
commit 3a985587bf
2725 changed files with 81963 additions and 8143 deletions
@@ -86,7 +86,12 @@ public class FishResourcesData
// 引用归零后鱼包真正从内存卸载 —— 依次进所有玩法不再累加内存。
private static readonly List<AsyncOperationHandle> _fishHandles = new List<AsyncOperationHandle>();
public static async Task LoadFishAssetsData()
/// <summary>
/// 加载当前玩法的鱼资源(prefab / 死亡Spine / 图鉴Sprite)。
/// onProgress:整体进度回调 0~1(prefab 0~0.62 / spine 0.62~0.81 / sprite 0.81~1,按各段实际 PercentComplete 细分),
/// 供进房进度条使用;不传则行为与原来一致。
/// </summary>
public static async Task LoadFishAssetsData(Action<float> onProgress = null)
{
// 清空对象池
Pool.Instance.Clear();
@@ -117,7 +122,7 @@ public class FishResourcesData
Addressables.Release(depHandle);
Debug.Log("依赖资源预下载完成!");
// ---------------- 2. 加载 Prefab ----------------
// ---------------- 2. 加载 Prefab(0 ~ 0.62,最重的一段) ----------------
var prefabKeys = new List<string> { prefabFish_AALabel, GameManager.Instance.gameData.currGameType.ToString() };
var prefabHandle = Addressables.LoadAssetsAsync<GameObject>(prefabKeys, prefab =>
{
@@ -135,12 +140,12 @@ public class FishResourcesData
}
}, MergeMode.Intersection);
await prefabHandle.Task;
await AwaitWithProgress(prefabHandle, 0f, 0.62f, onProgress);
// ⭐ 不再立即 Release:保存句柄保持包存活,离房时统一卸载
_fishHandles.Add(prefabHandle);
Debug.Log($"Prefab 加载完成,共 {fishPrefabDic.Count} 个");
// ---------------- 3. 加载死亡 Spine 动效 ----------------
// ---------------- 3. 加载死亡 Spine 动效(0.62 ~ 0.81) ----------------
// 注意:某些游戏类型下 Addressables 中 "DieSpine"+"游戏类型" 两个 label 可能没有交集资源,
// 会抛 InvalidKeyException。这里用 try-catch 容错,避免单个资源类型加载失败阻塞整体流程。
try
@@ -154,16 +159,17 @@ public class FishResourcesData
}
}, MergeMode.Intersection);
await dieHandle.Task;
await AwaitWithProgress(dieHandle, 0.62f, 0.81f, onProgress);
_fishHandles.Add(dieHandle);
Debug.Log($"死亡 Spine 加载完成,共 {diePrefabDic.Count} 个");
}
catch (Exception e)
{
onProgress?.Invoke(0.81f);
Debug.LogWarning($"[FishResourcesData] 死亡 Spine 加载失败(游戏类型={GameManager.Instance.gameData.currGameType}),跳过此项: {e.Message}");
}
// ---------------- 4. 加载鱼 Sprite ----------------
// ---------------- 4. 加载鱼 Sprite(0.81 ~ 1) ----------------
try
{
var spriteKeys = new List<string> { Sprite_AALabel, GameManager.Instance.gameData.currGameType.ToString() };
@@ -175,18 +181,39 @@ public class FishResourcesData
}
}, MergeMode.Intersection);
await spriteHandle.Task;
await AwaitWithProgress(spriteHandle, 0.81f, 1f, onProgress);
_fishHandles.Add(spriteHandle);
Debug.Log($"Sprite 加载完成,共 {fishResourcesSpritesDic.Count} 个");
}
catch (Exception e)
{
onProgress?.Invoke(1f);
Debug.LogWarning($"[FishResourcesData] Sprite 加载失败(游戏类型={GameManager.Instance.gameData.currGameType}),跳过此项: {e.Message}");
}
onProgress?.Invoke(1f);
Debug.Log("所有鱼资源加载完毕!");
}
/// <summary>
/// 等待句柄完成并按其 PercentComplete 映射到 [from, to] 区间上报进度。
/// 50ms 轮询(进度条 20fps 刷新足够),完成后兜底上报 to。
/// </summary>
private static async Task AwaitWithProgress(AsyncOperationHandle handle, float from, float to, Action<float> onProgress)
{
if (onProgress == null)
{
await handle.Task;
return;
}
while (!handle.IsDone)
{
onProgress(Mathf.Lerp(from, to, handle.PercentComplete));
await Task.Delay(50);
}
onProgress(to);
}
public static Task UnLoadFishAssetsData()
{