using UnityEngine; using UnityEngine.Pool; using Object = UnityEngine.Object; namespace DanieleMarotta.RiversongCodeShowcase { public static class PoolingServiceExtensions { public static IObjectPool GetOrCreatePool(this IPoolingService poolingService, GameObject prefab, Transform folder = null) { var poolKey = prefab.GetInstanceID(); var pool = poolingService.GetPool(poolKey); if (pool != null) return pool; pool = new ObjectPool( () => { var go = Object.Instantiate(prefab, folder); OnCreate(go, poolKey); return go; }, OnGet, go => OnRelease(go, folder)); poolingService.AddPool(poolKey, pool); return pool; } public static IObjectPool GetOrCreatePool(this IPoolingService poolingService, T prefab, Transform folder = null) where T : Component { var poolKey = prefab.GetInstanceID(); var pool = poolingService.GetPool(poolKey); if (pool != null) return pool; pool = new ObjectPool( () => { var component = Object.Instantiate(prefab, folder); OnCreate(component.gameObject, poolKey); return component; }, component => OnGet(component.gameObject), component => OnRelease(component.gameObject, folder)); poolingService.AddPool(poolKey, pool); return pool; } private static void OnCreate(GameObject go, int poolKey) { go.AddComponent().PoolKey = poolKey; go.SetActive(false); } private static void OnGet(GameObject go) { go.transform.SetParent(null); go.SetActive(true); } private static void OnRelease(GameObject go, Transform folder) { go.SetActive(false); go.transform.SetParent(folder); } public static T Get(this IPoolingService poolingService, int poolKey) where T : class { return poolingService.GetPool(poolKey).Get(); } public static void Release(this IPoolingService poolingService, GameObject go) { var poolKey = go.GetComponent().PoolKey; poolingService.GetPool(poolKey).Release(go); } public static void Release(this IPoolingService poolingService, T component) where T : Component { var poolKey = component.GetComponent().PoolKey; poolingService.GetPool(poolKey).Release(component); } } }