SpawnPool,游戏物体对象池总池,总池下面有PrefabPool预设池子池
总池有角色总池,特效总池等等
每一种独立的预设都是一个子池(一个预设对应一个子池),这些东西最后会放到总池下面List<PrefabPool>,
游戏物体对象的总池
预设池,子池
Spwn对象的时候,从预设列表读取预设数据, 根据数据加载出asset,
Sys_Prefab中的预设编号即子池编号,
PoolId对应
对象池初始化, GameObjectPoolEntity, 游戏对象池单个组界面显示的
循环创建若干个总池,Spwnpool
/// <summary>
/// 从对象池中获取对象
/// </summary>
/// <param name="prefabId"></param>
/// <param name="prefab"></param>
/// <param name="onComplete"></param>
public void Spawn(int prefabId, BaseAction<Transform> onComplete)
{
//读表拿到prefabEntity
Sys_PrefabEntity sys_PrefabEntity = GameEntry.DataTable.DataTableManager.Sys_PrefabDBModel.GetDic(prefabId);
if (sys_PrefabEntity == null) return;
GameEntry.Resource.ResourceLoaderManager.LoadMainAsset((AssetCategory)sys_PrefabEntity.AssetCategory, sys_PrefabEntity.AssetPath, (ResourceEntity resourceEntity) =>
{
//对象池实体,根据id找到对应的游戏对象池实体
GameObjectPoolEntity gameObjectPoolEntity = m_SpawnPoolDic[sys_PrefabEntity.PoolId];//对象池编号
Transform prefab = ((GameObject)resourceEntity.Target).transform;
//对象池实体中获得预设池
PrefabPool prefabPool = gameObjectPoolEntity.Pool.GetPrefabPool(sys_PrefabEntity.Id);//实体编号
if (prefabPool == null)
{
//没找到
//先去空闲的池队列里找
if (m_PrefabPoolQueue.Count > 0)
{
Debug.LogError("从队列里取PrefabPool");
prefabPool = m_PrefabPoolQueue.Dequeue();
prefabPool.PrefabPoolId = sys_PrefabEntity.Id;//设置预设池编号
gameObjectPoolEntity.Pool.AddPrefabPool(prefabPool);
prefabPool.prefab = prefab;
prefabPool.prefabGO = prefab.gameObject;
prefabPool.AddPrefabToDic(prefab.name, prefab);
}
else
{
//没有空闲的,创建新的实体池,第二个参数为预设池编号
prefabPool = new PrefabPool(prefab, sys_PrefabEntity.Id);
//创建新的预设子池,把resourceEntity传进来,这里是修改过的
gameObjectPoolEntity.Pool.CreatePrefabPool(prefabPool, resourceEntity);
}
prefabPool.OnPrefabPoolClear = (PrefabPool pool) =>
{
//预设池加入队列
pool.PrefabPoolId = 0;
gameObjectPoolEntity.Pool.RemovePrefabPool(pool);
m_PrefabPoolQueue.Enqueue(pool);
};
//这些属性要从表格读取,设置子池的属性
prefabPool.cullDespawned = sys_PrefabEntity.CullDespawned == 1;
prefabPool.cullAbove = sys_PrefabEntity.CullAbove;
prefabPool.cullDelay = sys_PrefabEntity.CullDelay;
prefabPool.cullMaxPerPass = sys_PrefabEntity.CullMaxPerPass;
}
if (onComplete != null)
{
//拿到一个实例
Transform retTrans = gameObjectPoolEntity.Pool.Spawn(prefab, resourceEntity);
int instanceID = retTrans.gameObject.GetInstanceID();
m_InstanceIdPoolIdDic[instanceID] = sys_PrefabEntity.PoolId;
onComplete(retTrans);
}
});
}
对象回池