123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using YooAsset;
- namespace UniFramework.Pooling
- {
- /// <summary>
- /// 游戏对象池系统
- /// </summary>
- public static class UniPooling
- {
- private static bool _isInitialize = false;
- private static GameObject _driver = null;
- private static readonly List<Spawner> _spawners = new List<Spawner>();
- /// <summary>
- /// 初始化游戏对象池系统
- /// </summary>
- public static void Initalize()
- {
- if (_isInitialize)
- throw new Exception($"{nameof(UniPooling)} is initialized !");
- if (_isInitialize == false)
- {
- // 创建驱动器
- _isInitialize = true;
- _driver = new UnityEngine.GameObject($"[{nameof(UniPooling)}]");
- _driver.AddComponent<UniPoolingDriver>();
- UnityEngine.Object.DontDestroyOnLoad(_driver);
- UniLogger.Log($"{nameof(UniPooling)} initalize !");
- }
- }
- /// <summary>
- /// 销毁游戏对象池系统
- /// </summary>
- public static void Destroy()
- {
- if (_isInitialize)
- {
- foreach (var spawner in _spawners)
- {
- spawner.Destroy();
- }
- _spawners.Clear();
- _isInitialize = false;
- if (_driver != null)
- GameObject.Destroy(_driver);
- UniLogger.Log($"{nameof(UniPooling)} destroy all !");
- }
- }
- /// <summary>
- /// 更新游戏对象池系统
- /// </summary>
- internal static void Update()
- {
- if (_isInitialize)
- {
- foreach (var spawner in _spawners)
- {
- spawner.Update();
- }
- }
- }
- /// <summary>
- /// 创建游戏对象生成器
- /// </summary>
- /// <param name="packageName">资源包名称</param>
- public static Spawner CreateSpawner(string packageName)
- {
- // 获取资源包
- var assetPackage = YooAssets.GetPackage(packageName);
- if (assetPackage == null)
- throw new Exception($"Not found asset package : {packageName}");
- // 检测资源包初始化状态
- if (assetPackage.InitializeStatus == EOperationStatus.None)
- throw new Exception($"Asset package {packageName} not initialize !");
- if (assetPackage.InitializeStatus == EOperationStatus.Failed)
- throw new Exception($"Asset package {packageName} initialize failed !");
- if (HasSpawner(packageName))
- return GetSpawner(packageName);
- Spawner spawner = new Spawner(_driver, assetPackage);
- _spawners.Add(spawner);
- return spawner;
- }
- /// <summary>
- /// 获取游戏对象生成器
- /// </summary>
- /// <param name="packageName">资源包名称</param>
- public static Spawner GetSpawner(string packageName)
- {
- foreach (var spawner in _spawners)
- {
- if (spawner.PackageName == packageName)
- return spawner;
- }
- UniLogger.Warning($"Not found spawner : {packageName}");
- return null;
- }
- /// <summary>
- /// 检测游戏对象生成器是否存在
- /// </summary>
- /// <param name="packageName">资源包名称</param>
- public static bool HasSpawner(string packageName)
- {
- foreach (var spawner in _spawners)
- {
- if (spawner.PackageName == packageName)
- return true;
- }
- return false;
- }
- }
- }
|