一些修复和优化

This commit is contained in:
2026-07-20 02:22:51 +08:00
parent 818fc9a02f
commit 0a0872c4f4
49 changed files with 2008 additions and 262 deletions
+102 -33
View File
@@ -73,6 +73,10 @@ public class idolEquipments : MonoBehaviour
private float pendingScrollbarValue = 1f;
private Coroutine restoreScrollbarRoutine;
private bool suppressDropdownCallbacks;
private bool hasStarted;
private bool equipmentOwnershipCacheReady;
private readonly Dictionary<equipmentSO, AllyHero_SO> ownershipByReference = new Dictionary<equipmentSO, AllyHero_SO>();
private readonly Dictionary<string, AllyHero_SO> ownershipByName = new Dictionary<string, AllyHero_SO>(StringComparer.Ordinal);
private static readonly (EquipFilterMode mode, string label)[] FilterOptions =
{
@@ -102,6 +106,7 @@ public class idolEquipments : MonoBehaviour
private void Start()
{
hasStarted = true;
InitializeDropdowns();
InitializeOnlyCanEquipToggle();
BindControls();
@@ -116,8 +121,11 @@ public class idolEquipments : MonoBehaviour
InitializeOnlyCanEquipToggle();
BindControls();
RestoreEquippedFromHero();
RebuildBag();
RefreshEquippedSlot();
if (hasStarted)
{
RebuildBag();
RefreshEquippedSlot();
}
}
private void OnDisable()
@@ -267,6 +275,8 @@ public class idolEquipments : MonoBehaviour
return;
}
RefreshEquipmentOwnershipCache();
List<equipmentSO> equipments = LoadEquipments()
.Where(e => e != null)
.Where(e => !equipSmelt.IsEquipmentAssignedToSmeltPool(e) && !equipSmelt.ShouldHideConsumedEquipment(e))
@@ -292,7 +302,7 @@ public class idolEquipments : MonoBehaviour
int batchSize = Mathf.Max(1, i_batch);
for (int i = 0; i < equipments.Count; i++)
{
SpawnBagItem(equipments[i]);
SpawnBagItem(equipments[i], i);
if ((i + 1) % batchSize == 0)
{
yield return null;
@@ -307,18 +317,18 @@ public class idolEquipments : MonoBehaviour
{
for (int i = 0; i < equipments.Count; i++)
{
SpawnBagItem(equipments[i]);
SpawnBagItem(equipments[i], i);
}
}
private void SpawnBagItem(equipmentSO equipment)
private void SpawnBagItem(equipmentSO equipment, int index)
{
if (equipment == null || eqpmtItemPrefab == null || eqpmtBagParent == null)
{
return;
}
GameObject instance = Instantiate(eqpmtItemPrefab, eqpmtBagParent);
GameObject instance = GetOrCreateBagItem(index);
instance.name = string.IsNullOrWhiteSpace(equipment.GetDisplayTierName()) ? equipment.name : equipment.GetDisplayTierName();
equipItemPrefab item = instance.GetComponent<equipItemPrefab>();
@@ -332,8 +342,6 @@ public class idolEquipments : MonoBehaviour
item.itemButton.interactable = true;
}
}
spawnedBagItems.Add(instance);
}
private bool HandleBagItemRightClicked(equipmentSO equipment)
@@ -372,7 +380,8 @@ public class idolEquipments : MonoBehaviour
{
currentHero.SetEquippedEquipment(equipment);
}
RefreshAllIdolPanels();
equipmentOwnershipCacheReady = false;
RefreshAllIdolPanels(GetComponentInParent<UI_Idols>(true));
RefreshEquippedSlot();
RebuildBag();
}
@@ -384,7 +393,8 @@ public class idolEquipments : MonoBehaviour
{
currentHero.ClearEquippedEquipment();
}
RefreshAllIdolPanels();
equipmentOwnershipCacheReady = false;
RefreshAllIdolPanels(GetComponentInParent<UI_Idols>(true));
RefreshEquippedSlot();
RebuildBag();
}
@@ -392,6 +402,15 @@ public class idolEquipments : MonoBehaviour
public void SetHero(AllyHero_SO hero)
{
currentHero = hero;
equipmentOwnershipCacheReady = false;
RestoreEquippedFromHero();
RefreshEquippedSlot();
RebuildBag();
}
public void RefreshCurrentHeroEquipmentState()
{
equipmentOwnershipCacheReady = false;
RestoreEquippedFromHero();
RefreshEquippedSlot();
RebuildBag();
@@ -493,22 +512,21 @@ public class idolEquipments : MonoBehaviour
return false;
}
AllyHero_SO[] heroes = LoadHeroAssetsForOwnershipCheck();
for (int i = 0; i < heroes.Length; i++)
if (!equipmentOwnershipCacheReady)
{
AllyHero_SO hero = heroes[i];
if (hero == null || hero == currentHero)
{
continue;
}
RefreshEquipmentOwnershipCache();
}
hero.LoadEquippedEquipmentFromLocal();
equipmentSO equipped = hero.GetEquippedEquipmentResolved();
if (equipped == equipment || (!string.IsNullOrWhiteSpace(equipped?.name) && equipped.name == equipment.name))
{
occupiedHero = hero;
return true;
}
if (ownershipByReference.TryGetValue(equipment, out occupiedHero) && occupiedHero != null)
{
return true;
}
if (!string.IsNullOrWhiteSpace(equipment.name) &&
ownershipByName.TryGetValue(equipment.name, out occupiedHero) &&
occupiedHero != null)
{
return true;
}
return false;
@@ -567,13 +585,13 @@ public class idolEquipments : MonoBehaviour
}
}
private void RefreshAllIdolPanels()
private void RefreshAllIdolPanels(UI_Idols skipPanel = null)
{
UI_Idols[] panels = FindObjectsByType<UI_Idols>(FindObjectsInactive.Include, FindObjectsSortMode.None);
for (int i = 0; i < panels.Length; i++)
{
UI_Idols panel = panels[i];
if (panel != null)
if (panel != null && panel != skipPanel)
{
panel.RefreshCurrentHeroDetails();
}
@@ -582,16 +600,14 @@ public class idolEquipments : MonoBehaviour
private void ClearBagItems()
{
for (int i = eqpmtBagParent != null ? eqpmtBagParent.childCount - 1 : -1; i >= 0; i--)
for (int i = spawnedBagItems.Count - 1; i >= 0; i--)
{
Transform child = eqpmtBagParent.GetChild(i);
if (child != null)
GameObject item = spawnedBagItems[i];
if (item != null && item.activeSelf)
{
Destroy(child.gameObject);
item.SetActive(false);
}
}
spawnedBagItems.Clear();
}
private void CacheScrollbarValue()
@@ -765,7 +781,7 @@ public class idolEquipments : MonoBehaviour
else
#endif
{
results.AddRange(Resources.LoadAll<equipmentSO>(runtimeEquipmentFolder).Where(e => e != null));
results.AddRange(RuntimeResourcesCache.LoadAll<equipmentSO>(runtimeEquipmentFolder).Where(e => e != null));
}
for (int i = 0; i < results.Count; i++)
@@ -903,4 +919,57 @@ public class idolEquipments : MonoBehaviour
string raw = equipment.name.Replace("(Clone)", string.Empty).Replace("(Preview)", string.Empty).Replace("(TourPreview)", string.Empty);
return raw.StartsWith("type", StringComparison.OrdinalIgnoreCase) && raw.Length > 4 ? raw.Substring(4) : raw;
}
private GameObject GetOrCreateBagItem(int index)
{
while (spawnedBagItems.Count <= index)
{
GameObject instance = Instantiate(eqpmtItemPrefab, eqpmtBagParent);
spawnedBagItems.Add(instance);
}
GameObject item = spawnedBagItems[index];
if (item != null)
{
item.transform.SetParent(eqpmtBagParent, false);
item.transform.SetSiblingIndex(index);
if (!item.activeSelf)
{
item.SetActive(true);
}
}
return item;
}
private void RefreshEquipmentOwnershipCache()
{
ownershipByReference.Clear();
ownershipByName.Clear();
AllyHero_SO[] heroes = LoadHeroAssetsForOwnershipCheck();
for (int i = 0; i < heroes.Length; i++)
{
AllyHero_SO hero = heroes[i];
if (hero == null || hero == currentHero)
{
continue;
}
hero.LoadEquippedEquipmentFromLocal();
equipmentSO equipped = hero.GetEquippedEquipmentResolved();
if (equipped == null)
{
continue;
}
ownershipByReference[equipped] = hero;
if (!string.IsNullOrWhiteSpace(equipped.name))
{
ownershipByName[equipped.name] = hero;
}
}
equipmentOwnershipCacheReady = true;
}
}