F8 GameObjectPool

December 12, 2025 · View on GitHub

license Unity Version Platform

简介(希望自己点击F8,就能开始制作游戏,不想多余的事)

Unity F8 GameObjectPool组件

  1. 预加载池化 - 提前初始化对象以实现即时使用
  2. 核心功能:
    • 生成 - 从池中获取对象
    • 销毁 - 将对象归还到池
    • 延迟销毁 - 延迟一段时间后归还对象
  3. 生命周期事件监听 - 监视对象状态更改

导入插件(需要首先导入核心)

注意!内置在->F8Framework核心:https://github.com/TippingGame/F8Framework.git
方式一:直接下载文件,放入Unity
方式二:Unity->点击菜单栏->Window->Package Manager->点击+号->Add Package from git URL->输入:https://github.com/TippingGame/F8Framework.git

视频教程:【Unity框架】(10)游戏对象池

代码使用方法

    // 预制体或者组件
    private GameObject _gameObjectPrefab;
    private DemoGameObjectPool _componentPrefab;
    // 粒子特效
    private ParticleSystem _particleSystemPrefab;
    // 预设对象池ScriptableObject
    private PoolsPreset _poolsPreset;
    void Start()
    {
        /*------------------------------使用GameObjectPool对象池------------------------------*/
        
        // 使用名称或GameObject或者Component创建对象
        GameObject spawnedClone = FF8.GameObjectPool.Spawn("name");
        GameObject spawnedClone = FF8.GameObjectPool.Spawn(_gameObjectPrefab);
        DemoGameObjectPool component = FF8.GameObjectPool.Spawn(_componentPrefab, Vector3.zero, Quaternion.identity, this.transform);
        
        // 销毁
        FF8.GameObjectPool.Despawn(gameObject, delay: 0.5f);
        
        // 粒子特效播放完成后立即销毁
        FF8.GameObjectPool
            .Spawn(_particleSystemPrefab)
            .DespawnOnComplete();
        
        // 生成预设对象池(_poolsPreset可使用资源模块加载)
        FF8.GameObjectPool.InstallPools(_poolsPreset);
        
        // 如何获取对象池
        F8GameObjectPool _pool = FF8.GameObjectPool.GetPoolByPrefab(_gameObjectPrefab);
        F8GameObjectPool _pool = FF8.GameObjectPool.GetPoolByPrefabName(_gameObjectPrefab.name);
        
        // 对每个池执行操作。
        FF8.GameObjectPool.ForEachPool((obj) => { });

        // 对每个克隆执行操作。
        FF8.GameObjectPool.ForEachClone((obj) => { });

        // 尝试获取克隆的状态(已生成 / 已回收 / 已生成超过容量)。
        PoolableStatus cloneStatus = FF8.GameObjectPool.GetCloneStatus(spawnedClone);

        // 游戏对象是否是克隆(使用 GameObjectPool 生成)?
        bool isClone = FF8.GameObjectPool.IsClone(spawnedClone);
        
        // 如果要销毁克隆但不回收克隆,请使用此方法以避免错误!
        FF8.GameObjectPool.DestroyClone(spawnedClone);
        
        // 销毁所有池。
        FF8.GameObjectPool.DestroyAllPools(immediately: false);
        
        
        
        /*------------------------------GameObjectPool对象池内功能------------------------------*/
        
        // 手动初始化池。如果您通过 Awake 方法访问池,而该方法在池初始化之前被调用,则可能需要这样做。
        _pool.Init();
        
        _pool.Init(_gameObjectPrefab);

        // 填充池。
        _pool.PopulatePool(16);
        
        // 设置池的容量。
        _pool.SetCapacity(32);
        
        // 设置池的溢出行为。
        _pool.SetBehaviourOnCapacityReached(BehaviourOnCapacityReached.Recycle);
        
        // 设置池中游戏对象的回收类型。
        _pool.SetDespawnType(DespawnType.DeactivateAndHide);
        
        // 设置池的回调类型,用于游戏对象的生成或回收。
        _pool.SetCallbacksType(CallbacksType.Interfaces);
        
        // 设置池的警告是否激活。
        _pool.SetWarningsActive(true);
        
        // 对池中的每个克隆执行操作。
        _pool.ForEachClone((obj) => { });
        
        // 对池中的每个已生成的克隆执行操作。
        _pool.ForEachSpawnedClone((obj) => { });
        
        // 对池中的每个已回收的克隆执行操作。
        _pool.ForEachDespawnedClone((obj) => { });
        
        // 销毁已生成的克隆。
        _pool.DestroySpawnedClones();
        
        // 销毁已回收的克隆。
        _pool.DestroyDespawnedClones();

        // 销毁池中的所有克隆。
        _pool.DestroyAllClones();

        // 立即销毁已生成的克隆。
        _pool.DestroySpawnedClonesImmediate();
        
        // 立即销毁已回收的克隆。
        _pool.DestroyDespawnedClonesImmediate();

        // 立即销毁池中的所有克隆。
        _pool.DestroyAllClonesImmediate();
        
        // 销毁池。
        _pool.DestroyPool();
        
        // 立即销毁池。
        _pool.DestroyPoolImmediate();
        
        // 回收池中的所有克隆。
        _pool.DespawnAllClones();

        // 清除池。
        _pool.Clear();
        
        // 对象池事件
        void DoSomething(GameObject go)
        {
            
        }
        // 监听
        _pool.GameObjectInstantiated.AddListener(DoSomething);
        _pool.GameObjectSpawned.AddListener(DoSomething);
        _pool.GameObjectDespawned.AddListener(DoSomething);
        // 移除
        _pool.GameObjectInstantiated.RemoveListener(DoSomething);
        _pool.GameObjectSpawned.RemoveListener(DoSomething);
        _pool.GameObjectDespawned.RemoveListener(DoSomething);
    }
    
    /*------------------------------继承IPoolable的物体拥有回调------------------------------*/
    public class DemoPoolCallBack : MonoBehaviour, IPoolable
    {
        public void OnSpawn()
        {
            // Do something on spawn.
        }
    
        public void OnDespawn()
        {
            // Do something on despawn.
        }
    }

拓展功能

  1. 使用预加载池 image