Files
TaiWan/Assets/Roaming/Scripts/LoadDynamic/DynamicLoader.cs

138 lines
3.5 KiB
C#
Raw Normal View History

2025-10-31 15:20:38 +08:00
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
public class DynamicLoader : MonoBehaviour
{
public static DynamicLoader Instance;
private void OnEnable()
{
Instance = this;
}
/// <summary>
/// <20>Ѽ<EFBFBD><D1BC>ض<EFBFBD><D8B6><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
private List<GameObject> poolLoaded;
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
private List<GameObject> poolCache;
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
/// </summary>
public List<string> poolWillLoaded;
/// <summary>
/// <20><><EFBFBD>󻺴<EFBFBD><F3BBBAB4><EFBFBD>
/// </summary>
public int cacheMaxNum { get; set; }
/// <summary>
/// ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
/// </summary>
string showLayer = "Default";
/// <summary>
/// ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><D8B6><EFBFBD>
/// </summary>
string hideLayer = "CacheLayer";
int showLayerIndex;
int hideLayerIndex;
public string LastPos;
// Start is called before the first frame update
void Start()
{
cacheMaxNum = 10;
poolLoaded = new List< GameObject>();
poolCache = new List<GameObject>();
hideLayerIndex = LayerMask.NameToLayer(hideLayer);
showLayerIndex = LayerMask.NameToLayer(showLayer);
}
/// <summary>
/// <20>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD>ȡҪ<C8A1><D2AA><EFBFBD>صĶ<D8B5><C4B6><EFBFBD>
/// </summary>
/// <param name="objName"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <returns></returns>
GameObject GetObjectFromCache(string objName)
{
return poolCache.FirstOrDefault<GameObject>(obj => obj.name == objName);
}
/// <summary>
/// <20><><EFBFBD>Ѽ<EFBFBD><D1BC><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD>ȡҪ<C8A1><D2AA><EFBFBD>صĶ<D8B5><C4B6><EFBFBD>
/// </summary>
/// <param name="objName"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <returns></returns>
GameObject GetObjectFromLoaded(string objName)
{
return poolLoaded.FirstOrDefault<GameObject>(obj => obj.name == objName);
}
/// <summary>
/// <20><><EFBFBD>ظ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD>
/// </summary>
/// <param name="preNames">Ԥ<><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
public void Load(string[] preNames)
{
// <20><><EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD><D1B4>ڵ<EFBFBD>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD>
List<GameObject> lstFromCache = poolCache.FindAll(obj => preNames.Contains(obj.name));
foreach (var obj in lstFromCache)
{
obj.layer = showLayerIndex;
poolLoaded.Add(obj);
poolCache.Remove(obj);
}
// <20>Ƴ<EFBFBD><C6B3>Ѽ<EFBFBD><D1BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD>Ҫ<EFBFBD><D2AA>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD>
List<GameObject> lstFromLoaded = poolLoaded.FindAll(obj => !preNames.Contains(obj.name));
foreach (var obj in lstFromLoaded)
{
obj.layer = hideLayerIndex;
poolCache.Add(obj);
if (poolCache.Count > cacheMaxNum)
{
Destroy(poolCache[0]);
poolCache.RemoveAt(0);
}
poolLoaded.Remove(obj);
}
// <20><><EFBFBD>ز<EFBFBD><D8B2>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD>е<EFBFBD>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD>
GameObject tmp = null;
foreach (var name in preNames)
{
tmp = poolLoaded.FirstOrDefault(obj => obj.name == name);
if (tmp == null)
{
StartCoroutine(GeneratePrefab(name));
}
}
}
IEnumerator GeneratePrefab(string name)
{
string parentName = name.Substring(0, name.IndexOf("_")); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GameObject tmp = Resources.Load<GameObject>("Prefabs\\" + name);
tmp = GameObject.Instantiate(tmp, GameObject.Find(parentName).transform);
tmp.name = name;
tmp.layer = showLayerIndex;
poolLoaded.Add(tmp);
// DataLoader.Instance.AttachOperation();
yield return new WaitForSeconds(0.5f);
}
}