123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using YooAsset;
- namespace UniFramework.Pooling
- {
- public class Spawner
- {
- private readonly List<GameObjectPool> _gameObjectPools = new List<GameObjectPool>(100);
- private readonly List<GameObjectPool> _removeList = new List<GameObjectPool>(100);
- private readonly GameObject _spawnerRoot;
- private readonly ResourcePackage _package;
- public string PackageName
- {
- get
- {
- return _package.PackageName;
- }
- }
- private Spawner()
- {
- }
- internal Spawner(GameObject poolingRoot, ResourcePackage package)
- {
- _spawnerRoot = new GameObject($"{package.PackageName}");
- _spawnerRoot.transform.SetParent(poolingRoot.transform);
- _package = package;
- }
- /// <summary>
- /// 更新游戏对象池系统
- /// </summary>
- internal void Update()
- {
- _removeList.Clear();
- foreach (var pool in _gameObjectPools)
- {
- if (pool.CanAutoDestroy())
- _removeList.Add(pool);
- }
- foreach (var pool in _removeList)
- {
- _gameObjectPools.Remove(pool);
- pool.DestroyPool();
- }
- }
- /// <summary>
- /// 销毁游戏对象池系统
- /// </summary>
- internal void Destroy()
- {
- DestroyAll(true);
- }
- /// <summary>
- /// 销毁所有对象池及其资源
- /// </summary>
- /// <param name="includeAll">销毁所有对象池,包括常驻对象池</param>
- public void DestroyAll(bool includeAll)
- {
- if (includeAll)
- {
- foreach (var pool in _gameObjectPools)
- {
- pool.DestroyPool();
- }
- _gameObjectPools.Clear();
- }
- else
- {
- List<GameObjectPool> removeList = new List<GameObjectPool>();
- foreach (var pool in _gameObjectPools)
- {
- if (pool.DontDestroy == false)
- removeList.Add(pool);
- }
- foreach (var pool in removeList)
- {
- _gameObjectPools.Remove(pool);
- pool.DestroyPool();
- }
- }
- }
- /// <summary>
- /// 异步创建指定资源的游戏对象池
- /// </summary>
- /// <param name="location">资源定位地址</param>
- /// <param name="dontDestroy">资源常驻不销毁</param>
- /// <param name="initCapacity">对象池的初始容量</param>
- /// <param name="maxCapacity">对象池的最大容量</param>
- /// <param name="destroyTime">静默销毁时间(注意:小于零代表不主动销毁)</param>
- public CreatePoolOperation CreateGameObjectPoolAsync(string location, bool dontDestroy = false, int initCapacity = 0, int maxCapacity = int.MaxValue, float destroyTime = -1f)
- {
- return CreateGameObjectPoolInternal(location, dontDestroy, initCapacity, maxCapacity, destroyTime);
- }
- /// <summary>
- /// 同步创建指定资源的游戏对象池
- /// </summary>
- /// <param name="location">资源定位地址</param>
- /// <param name="dontDestroy">资源常驻不销毁</param>
- /// <param name="initCapacity">对象池的初始容量</param>
- /// <param name="maxCapacity">对象池的最大容量</param>
- /// <param name="destroyTime">静默销毁时间(注意:小于零代表不主动销毁)</param>
- public CreatePoolOperation CreateGameObjectPoolSync(string location, bool dontDestroy = false, int initCapacity = 0, int maxCapacity = int.MaxValue, float destroyTime = -1f)
- {
- var operation = CreateGameObjectPoolInternal(location, dontDestroy, initCapacity, maxCapacity, destroyTime);
- operation.WaitForAsyncComplete();
- return operation;
- }
- /// <summary>
- /// 创建指定资源的游戏对象池
- /// </summary>
- private CreatePoolOperation CreateGameObjectPoolInternal(string location, bool dontDestroy = false, int initCapacity = 0, int maxCapacity = int.MaxValue, float destroyTime = -1f)
- {
- if (maxCapacity < initCapacity)
- throw new Exception("The max capacity value must be greater the init capacity value.");
- GameObjectPool pool = TryGetGameObjectPool(location);
- if (pool != null)
- {
- UniLogger.Warning($"GameObject pool is already existed : {location}");
- var operation = new CreatePoolOperation(pool.AssetHandle);
- YooAssets.StartOperation(operation);
- return operation;
- }
- else
- {
- pool = new GameObjectPool(_spawnerRoot, location, dontDestroy, initCapacity, maxCapacity, destroyTime);
- pool.CreatePool(_package);
- _gameObjectPools.Add(pool);
- var operation = new CreatePoolOperation(pool.AssetHandle);
- YooAssets.StartOperation(operation);
- return operation;
- }
- }
- /// <summary>
- /// 异步实例化一个游戏对象
- /// </summary>
- /// <param name="location">资源定位地址</param>
- /// <param name="forceClone">强制克隆游戏对象,忽略缓存池里的对象</param>
- /// <param name="userDatas">用户自定义数据</param>
- public SpawnHandle SpawnAsync(string location, bool forceClone = false, params System.Object[] userDatas)
- {
- return SpawnInternal(location, null, Vector3.zero, Quaternion.identity, forceClone, userDatas);
- }
- /// <summary>
- /// 异步实例化一个游戏对象
- /// </summary>
- /// <param name="location">资源定位地址</param>
- /// <param name="parent">父物体</param>
- /// <param name="forceClone">强制克隆游戏对象,忽略缓存池里的对象</param>
- /// <param name="userDatas">用户自定义数据</param>
- public SpawnHandle SpawnAsync(string location, Transform parent, bool forceClone = false, params System.Object[] userDatas)
- {
- return SpawnInternal(location, parent, Vector3.zero, Quaternion.identity, forceClone, userDatas);
- }
- /// <summary>
- /// 异步实例化一个游戏对象
- /// </summary>
- /// <param name="location">资源定位地址</param>
- /// <param name="parent">父物体</param>
- /// <param name="position">世界坐标</param>
- /// <param name="rotation">世界角度</param>
- /// <param name="forceClone">强制克隆游戏对象,忽略缓存池里的对象</param>
- /// <param name="userDatas">用户自定义数据</param>
- public SpawnHandle SpawnAsync(string location, Transform parent, Vector3 position, Quaternion rotation, bool forceClone = false, params System.Object[] userDatas)
- {
- return SpawnInternal(location, parent, position, rotation, forceClone, userDatas);
- }
- /// <summary>
- /// 同步实例化一个游戏对象
- /// </summary>
- /// <param name="location">资源定位地址</param>
- /// <param name="forceClone">强制克隆游戏对象,忽略缓存池里的对象</param>
- /// <param name="userDatas">用户自定义数据</param>
- public SpawnHandle SpawnSync(string location, bool forceClone = false, params System.Object[] userDatas)
- {
- SpawnHandle handle = SpawnInternal(location, null, Vector3.zero, Quaternion.identity, forceClone, userDatas);
- handle.WaitForAsyncComplete();
- return handle;
- }
- /// <summary>
- /// 同步实例化一个游戏对象
- /// </summary>
- /// <param name="location">资源定位地址</param>
- /// <param name="parent">父物体</param>
- /// <param name="forceClone">强制克隆游戏对象,忽略缓存池里的对象</param>
- /// <param name="userDatas">用户自定义数据</param>
- public SpawnHandle SpawnSync(string location, Transform parent, bool forceClone = false, params System.Object[] userDatas)
- {
- SpawnHandle handle = SpawnInternal(location, parent, Vector3.zero, Quaternion.identity, forceClone, userDatas);
- handle.WaitForAsyncComplete();
- return handle;
- }
- /// <summary>
- /// 同步实例化一个游戏对象
- /// </summary>
- /// <param name="location">资源定位地址</param>
- /// <param name="parent">父物体</param>
- /// <param name="position">世界坐标</param>
- /// <param name="rotation">世界角度</param>
- /// <param name="forceClone">强制克隆游戏对象,忽略缓存池里的对象</param>
- /// <param name="userDatas">用户自定义数据</param>
- public SpawnHandle SpawnSync(string location, Transform parent, Vector3 position, Quaternion rotation, bool forceClone = false, params System.Object[] userDatas)
- {
- SpawnHandle handle = SpawnInternal(location, parent, position, rotation, forceClone, userDatas);
- handle.WaitForAsyncComplete();
- return handle;
- }
- /// <summary>
- /// 实例化一个游戏对象
- /// </summary>
- private SpawnHandle SpawnInternal(string location, Transform parent, Vector3 position, Quaternion rotation, bool forceClone, params System.Object[] userDatas)
- {
- var pool = TryGetGameObjectPool(location);
- if (pool != null)
- {
- return pool.Spawn(parent, position, rotation, forceClone, userDatas);
- }
- // 如果不存在创建游戏对象池
- pool = new GameObjectPool(_spawnerRoot, location, false, 0, int.MaxValue, -1f);
- pool.CreatePool(_package);
- _gameObjectPools.Add(pool);
- return pool.Spawn(parent, position, rotation, forceClone, userDatas);
- }
- private GameObjectPool TryGetGameObjectPool(string location)
- {
- foreach (var pool in _gameObjectPools)
- {
- if (pool.Location == location)
- return pool;
- }
- return null;
- }
- //扩展
- public bool IsGameObjectPoolExisted(string location)
- {
- return TryGetGameObjectPool(location) != null;
- }
- }
- }
|