You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
4.8 KiB
156 lines
4.8 KiB
3 years ago
|
using System;
|
||
|
using System.Collections.Generic;
|
||
|
using UnityEngine;
|
||
|
|
||
|
namespace ET
|
||
|
{
|
||
|
public static class GameObjectPoolHelper
|
||
|
{
|
||
|
private static Dictionary<string, GameObjectPool> poolDict = new Dictionary<string, GameObjectPool>();
|
||
|
|
||
|
public static void InitPool( string poolName, int size, PoolInflationType type = PoolInflationType.DOUBLE)
|
||
|
{
|
||
|
if (poolDict.ContainsKey(poolName))
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
GameObject pb = GetGameObjectByResType(poolName);
|
||
|
if (pb == null)
|
||
|
{
|
||
|
Debug.LogError("[ResourceManager] Invalide prefab name for pooling :" + poolName);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
|
||
|
poolDict[poolName] = new GameObjectPool(poolName, pb, GameObject.Find("Global/PoolRoot"), size, type);
|
||
|
}
|
||
|
catch (Exception e)
|
||
|
{
|
||
|
Debug.LogError(e);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static async ETTask InitPoolFormGamObjectAsync( GameObject pb, int size, PoolInflationType type = PoolInflationType.DOUBLE)
|
||
|
{
|
||
|
string poolName = pb.name;
|
||
|
if (poolDict.ContainsKey(poolName))
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
if (pb == null)
|
||
|
{
|
||
|
Debug.LogError("[ResourceManager] Invalide prefab name for pooling :" + poolName);
|
||
|
return;
|
||
|
}
|
||
|
poolDict[poolName] = new GameObjectPool(poolName, pb, GameObject.Find("Global/PoolRoot"), size, type);
|
||
|
}
|
||
|
catch (Exception e)
|
||
|
{
|
||
|
Debug.LogError(e);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
await ETTask.CompletedTask;
|
||
|
}
|
||
|
|
||
|
|
||
|
/// <summary>
|
||
|
/// Returns an available object from the pool
|
||
|
/// OR null in case the pool does not have any object available & can grow size is false.
|
||
|
/// </summary>
|
||
|
/// <OtherParam name="poolName"></OtherParam>
|
||
|
/// <returns></returns>
|
||
|
public static GameObject GetObjectFromPool( string poolName, bool autoActive = true, int autoCreate = 0)
|
||
|
{
|
||
|
GameObject result = null;
|
||
|
|
||
|
if (!poolDict.ContainsKey(poolName) && autoCreate > 0)
|
||
|
{
|
||
|
InitPool(poolName, autoCreate, PoolInflationType.INCREMENT);
|
||
|
}
|
||
|
|
||
|
if (poolDict.ContainsKey(poolName))
|
||
|
{
|
||
|
GameObjectPool pool = poolDict[poolName];
|
||
|
result = pool.NextAvailableObject(autoActive);
|
||
|
//scenario when no available object is found in pool
|
||
|
#if UNITY_EDITOR
|
||
|
if (result == null)
|
||
|
{
|
||
|
Debug.LogWarning("[ResourceManager]:No object available in " + poolName);
|
||
|
}
|
||
|
#endif
|
||
|
}
|
||
|
#if UNITY_EDITOR
|
||
|
else
|
||
|
{
|
||
|
Debug.LogError("[ResourceManager]:Invalid pool name specified: " + poolName);
|
||
|
}
|
||
|
#endif
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
|
||
|
/// <summary>
|
||
|
/// Return obj to the pool
|
||
|
/// </summary>
|
||
|
/// <OtherParam name="go"></OtherParam>
|
||
|
public static void ReturnObjectToPool( GameObject go)
|
||
|
{
|
||
|
PoolObject po = go.GetComponent<PoolObject>();
|
||
|
if (po == null)
|
||
|
{
|
||
|
#if UNITY_EDITOR
|
||
|
Debug.LogWarning("Specified object is not a pooled instance: " + go.name);
|
||
|
#endif
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
GameObjectPool pool = null;
|
||
|
if (poolDict.TryGetValue(po.poolName, out pool))
|
||
|
{
|
||
|
pool.ReturnObjectToPool(po);
|
||
|
}
|
||
|
#if UNITY_EDITOR
|
||
|
else
|
||
|
{
|
||
|
Debug.LogWarning("No pool available with name: " + po.poolName);
|
||
|
}
|
||
|
#endif
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Return obj to the pool
|
||
|
/// </summary>
|
||
|
/// <OtherParam name="t"></OtherParam>
|
||
|
public static void ReturnTransformToPool( Transform t)
|
||
|
{
|
||
|
if (t == null)
|
||
|
{
|
||
|
#if UNITY_EDITOR
|
||
|
Debug.LogError("[ResourceManager] try to return a null transform to pool!");
|
||
|
#endif
|
||
|
return;
|
||
|
}
|
||
|
ReturnObjectToPool(t.gameObject);
|
||
|
}
|
||
|
|
||
|
public static GameObject GetGameObjectByResType( string poolName)
|
||
|
{
|
||
|
GameObject pb = null;
|
||
|
var (bundle,assetDict) = AssetsBundleHelper.LoadBundle(poolName + ".unity3d");
|
||
|
pb = assetDict[poolName] as GameObject;
|
||
|
return pb;
|
||
|
}
|
||
|
}
|
||
|
}
|