138 lines
3.5 KiB
C#
138 lines
3.5 KiB
C#
|
|
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);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|