This commit is contained in:
2026-10-09 22:06:36 +08:00
parent 3a985587bf
commit 1f4c19904f
25 changed files with 715 additions and 371 deletions
@@ -1,4 +1,5 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
@@ -464,6 +465,7 @@ public class UIHome_BY_ItemListPanels : SubUIBase
private void ClearItemList()
{
ReleasePreviewAcquired(); // ⭐ 切列表/关面板:释放当前预览的按需资源
foreach (var toggle in _instantiatedToggles)
{
if (toggle != null)
@@ -659,6 +661,7 @@ public class UIHome_BY_ItemListPanels : SubUIBase
private void ClearZhanShenItemList()
{
ReleasePreviewAcquired(); // ⭐ 切列表/关面板:释放当前预览的按需资源
foreach (var toggle in _instantiatedZSItemToggles)
{
if (toggle != null)
@@ -725,12 +728,8 @@ public class UIHome_BY_ItemListPanels : SubUIBase
if (rawImg_DetailPreview != null)
rawImg_DetailPreview.gameObject.SetActive(true);
// ---- 预览(和翅膀一样实例化预制体到预览区)----
if (resData != null && previewParent != null && prefab != null)
{
_currentPreviewObj = Instantiate(prefab, previewParent);
_currentPreviewObj.SetActive(true);
}
// ---- 预览(⭐按需加载:点哪个战神加载哪个,切走自动释放上一个)----
ShowPreviewOnDemand(turretNumber, true);
}
// ==================== 战神选择按钮 ====================
@@ -994,14 +993,12 @@ public class UIHome_BY_ItemListPanels : SubUIBase
rawImg_DetailPreview.gameObject.SetActive(_currentSelectType != ItemPanelSelect.Turrect);
// ---- 预览 ----
if (resData != null && previewParent != null && prefab != null)
// ---- 预览(⭐按需加载:点哪个加载哪个,切走自动释放上一个)----
ShowPreviewOnDemand(turretNumber, false, obj =>
{
_currentPreviewObj = Instantiate(prefab, previewParent);
_currentPreviewObj.SetActive(true);
if (_currentSelectType == ItemPanelSelect.Turrect)
if (obj != null && _currentSelectType == ItemPanelSelect.Turrect)
{
var rt = _currentPreviewObj.GetComponent<RectTransform>();
var rt = obj.GetComponent<RectTransform>();
if (rt != null)
{
rt.anchorMin = new Vector2(0.5f, 0f);
@@ -1010,7 +1007,7 @@ public class UIHome_BY_ItemListPanels : SubUIBase
rt.localScale = Vector3.one * 2.5f;
}
}
}
});
}
/// <summary>清除预览区当前展示的实例。</summary>
@@ -1023,6 +1020,71 @@ public class UIHome_BY_ItemListPanels : SubUIBase
}
}
// ==================== 预览按需加载(点哪个加载哪个,切走释放上一个) ====================
private int _previewSeq = 0;
/// <summary>当前预览已 Acquire 的编号(切走时释放)</summary>
private int _previewAcquiredId = 0;
private bool _previewAcquiredIsZS = false;
/// <summary>
/// ⭐ 按需加载并显示预览模型:释放上一个的按需引用 → 异步获取当前 → 实例化。
/// 战神走 ZS{编号}+Display 标签,炮台/翅膀走 PT{编号} 标签。
/// 快速连续点击由 seq 竞态丢弃(只显示最后点的那一个)。
/// onLoaded:实例化后的回调(炮台预览的 RectTransform 特殊处理等)。
/// </summary>
private void ShowPreviewOnDemand(int turretNumber, bool isZhanShen, System.Action<GameObject> onLoaded = null)
{
StartCoroutine(ShowPreviewRoutine(turretNumber, isZhanShen, onLoaded, ++_previewSeq));
}
private IEnumerator ShowPreviewRoutine(int turretNumber, bool isZhanShen, System.Action<GameObject> onLoaded, int seq)
{
// 释放上一个预览的按需引用(归零卸包 → 内存里同时只有一个预览资源)
ReleasePreviewAcquired();
if (turretNumber <= 0 || previewParent == null)
{
ClearPreview();
onLoaded?.Invoke(null);
yield break;
}
var task = isZhanShen
? TurretResourcesData.AcquireZhanShenAsync(turretNumber, ZhanShenUsage.Display)
: TurretResourcesData.AcquireTurretPrefabAsync(turretNumber);
while (!task.IsCompleted)
yield return null;
// 期间又点了别的 → 丢弃本次并归还引用
if (seq != _previewSeq)
{
if (isZhanShen) TurretResourcesData.ReleaseZhanShen(turretNumber, ZhanShenUsage.Display);
else TurretResourcesData.ReleaseTurretPrefab(turretNumber);
yield break;
}
GameObject prefab = task.Result;
ClearPreview();
if (prefab != null)
{
_previewAcquiredId = turretNumber;
_previewAcquiredIsZS = isZhanShen;
_currentPreviewObj = Instantiate(prefab, previewParent);
_currentPreviewObj.SetActive(true);
}
onLoaded?.Invoke(_currentPreviewObj);
}
/// <summary>释放当前预览的按需引用(面板关闭/切列表时调用,归零卸包)</summary>
private void ReleasePreviewAcquired()
{
if (_previewAcquiredId <= 0) return;
if (_previewAcquiredIsZS) TurretResourcesData.ReleaseZhanShen(_previewAcquiredId, ZhanShenUsage.Display);
else TurretResourcesData.ReleaseTurretPrefab(_previewAcquiredId);
_previewAcquiredId = 0;
}
/// <summary>根据道具数据生成特殊效果描述。</summary>
private static string GetSpecialEffectText(TurretResourcesData resData, TurretData turretData, BaseUserProp userProp = null)
{