1
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user