Files
bansonic_beta_main/Assets/_eqpmtSys/equipBag.cs
T
2026-03-27 08:02:55 +08:00

201 lines
5.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using Bansonic;
#if UNITY_EDITOR
using UnityEditor;
#endif
public class equipBag : MonoBehaviour
{
[Header("prefab")]
public GameObject eqpmtItemPrefab;
public Transform eqpmtItemParent;
[Header("source paths")]
public string runtimeEquipmentFolder = "so/uEquip";
public string editorEquipmentFolder = "Assets/Resources/so/uEquip";
private readonly List<GameObject> spawnedItems = new List<GameObject>();
private void Start()
{
Rebuild();
}
private void OnEnable()
{
Rebuild();
}
public void Rebuild()
{
ClearSpawnedItems();
if (eqpmtItemPrefab == null || eqpmtItemParent == null)
{
return;
}
equipmentSO[] equipments = LoadEquipments();
if (equipments == null || equipments.Length == 0)
{
return;
}
equipments = equipments
.Where(equipment => equipment != null
&& !equipSmelt.IsEquipmentAssignedToSmeltPool(equipment)
&& !equipSmelt.IsEquipmentConsumedBySmelt(equipment))
.ToArray();
Array.Sort(equipments, CompareEquipments);
for (int i = 0; i < equipments.Length; i++)
{
equipmentSO equipment = equipments[i];
if (equipment == null)
{
continue;
}
GameObject instance = Instantiate(eqpmtItemPrefab, eqpmtItemParent);
instance.name = string.IsNullOrWhiteSpace(equipment.GetCurrentTierDisplayName())
? equipment.name
: equipment.GetCurrentTierDisplayName();
equipItemPrefab item = instance.GetComponent<equipItemPrefab>();
if (item != null)
{
item.Bind(equipment, HandleEquipmentClicked);
}
spawnedItems.Add(instance);
}
}
private equipmentSO[] LoadEquipments()
{
var results = new List<equipmentSO>();
#if UNITY_EDITOR
if (!Application.isPlaying)
{
results.AddRange(LoadEditorEquipments());
}
else
#endif
{
results.AddRange(Resources.LoadAll<equipmentSO>(runtimeEquipmentFolder)
.Where(equipment => equipment != null));
}
IReadOnlyList<equipmentSO> runtimeGenerated = equipmentGenerator.GetRuntimeGeneratedEquipments();
if (runtimeGenerated != null)
{
for (int i = 0; i < runtimeGenerated.Count; i++)
{
equipmentSO equipment = runtimeGenerated[i];
if (equipment != null && !results.Contains(equipment))
{
results.Add(equipment);
}
}
}
return results
.Where(equipment => equipment != null)
.ToArray();
}
#if UNITY_EDITOR
private equipmentSO[] LoadEditorEquipments()
{
if (string.IsNullOrWhiteSpace(editorEquipmentFolder) || !AssetDatabase.IsValidFolder(editorEquipmentFolder))
{
return Array.Empty<equipmentSO>();
}
string[] guids = AssetDatabase.FindAssets("t:equipmentSO", new[] { editorEquipmentFolder });
var result = new List<equipmentSO>(guids.Length);
for (int i = 0; i < guids.Length; i++)
{
string path = AssetDatabase.GUIDToAssetPath(guids[i]);
equipmentSO equipment = AssetDatabase.LoadAssetAtPath<equipmentSO>(path);
if (equipment != null)
{
result.Add(equipment);
}
}
return result.ToArray();
}
#endif
private void HandleEquipmentClicked(equipmentSO equipment)
{
if (equipment == null)
{
return;
}
}
private void ClearSpawnedItems()
{
if (eqpmtItemParent != null)
{
for (int i = eqpmtItemParent.childCount - 1; i >= 0; i--)
{
Transform child = eqpmtItemParent.GetChild(i);
if (child == null)
{
continue;
}
#if UNITY_EDITOR
if (!Application.isPlaying)
{
DestroyImmediate(child.gameObject);
}
else
#endif
{
Destroy(child.gameObject);
}
}
}
spawnedItems.Clear();
}
private static int CompareEquipments(equipmentSO left, equipmentSO right)
{
if (left == right)
{
return 0;
}
if (left == null)
{
return 1;
}
if (right == null)
{
return -1;
}
int levelCompare = right.level.CompareTo(left.level);
if (levelCompare != 0)
{
return levelCompare;
}
string leftName = left.GetCurrentTierDisplayName();
string rightName = right.GetCurrentTierDisplayName();
return string.Compare(leftName, rightName, StringComparison.Ordinal);
}
}