Files
2026-07-20 22:19:25 +08:00

127 lines
2.8 KiB
C#

using UnityEngine;
using UnityEngine.UI;
using System.Collections.Generic;
public class itemGetPrefab : MonoBehaviour
{
[Header("item prefab")]
public GameObject itemPrefab;
public Transform displayParent;
[Header("rarity")]
public ItemRarityColorConfigSO rarityColorConfig;
[Header("btn")]
public Button close;
private readonly List<GameObject> spawnedItems = new List<GameObject>();
private Coroutine layoutRefreshRoutine;
private void Awake()
{
if (close != null)
{
close.onClick.RemoveListener(CloseSelf);
close.onClick.AddListener(CloseSelf);
}
}
private void OnDestroy()
{
if (close != null)
{
close.onClick.RemoveListener(CloseSelf);
}
}
public void ClearItems()
{
for (int i = 0; i < spawnedItems.Count; i++)
{
if (spawnedItems[i] != null)
{
Destroy(spawnedItems[i]);
}
}
spawnedItems.Clear();
if (displayParent != null)
{
for (int i = displayParent.childCount - 1; i >= 0; i--)
{
Destroy(displayParent.GetChild(i).gameObject);
}
}
RequestLayoutRebuild();
}
public get_item_prefab AddItem()
{
if (itemPrefab == null || displayParent == null)
{
return null;
}
GameObject instance = Instantiate(itemPrefab, displayParent);
spawnedItems.Add(instance);
UI_OrderedEntryAnimator.PlayFadeOnly(instance, spawnedItems.Count - 1, 0.2f, 0.025f, true);
RequestLayoutRebuild();
return instance.GetComponent<get_item_prefab>();
}
private void RequestLayoutRebuild()
{
if (displayParent == null)
{
return;
}
if (layoutRefreshRoutine != null)
{
StopCoroutine(layoutRefreshRoutine);
layoutRefreshRoutine = null;
}
if (isActiveAndEnabled)
{
layoutRefreshRoutine = StartCoroutine(RebuildLayoutNextFrame());
return;
}
RebuildLayoutNow();
}
private System.Collections.IEnumerator RebuildLayoutNextFrame()
{
yield return null;
RebuildLayoutNow();
layoutRefreshRoutine = null;
}
private void RebuildLayoutNow()
{
RectTransform rect = displayParent as RectTransform;
if (rect == null)
{
return;
}
Canvas.ForceUpdateCanvases();
LayoutRebuilder.ForceRebuildLayoutImmediate(rect);
Canvas.ForceUpdateCanvases();
}
public void CloseSelf()
{
UI_PanelExitUtility.PlayExitThen(gameObject, () =>
{
if (gameObject != null)
{
Destroy(gameObject);
}
});
}
}