Unity3D-对象池


前言

简单的写了一个子弹的对象池
请添加图片描述

请添加图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

一、准备一个场景

  • 在Hierarchy面板下新建一个Empty,用来挂载脚本

二、新建脚本

1.Pool脚本

代码如下(示例):

/****************************************************
    文件:Pool.cs
	作者:HKZ
    邮箱: 3046916186@qq.com
    日期:2021/12/1 19:52:18
	功能:对象池
*****************************************************/

using System.Collections.Generic;
using UnityEngine;

namespace HKZ
{
    [System.Serializable]
    public class Pool
    {
        [SerializeField]
        private GameObject prefab;
        [SerializeField]
        private int size = 1;
        private Transform parent;

        private Queue<GameObject> queue;

        public GameObject Prefab { get => prefab; }
        public int Size => size;

        public void Initialize(Transform parent)
        {
            queue = new Queue<GameObject>();
            this.parent = parent;
            for (int i = 0; i < Size; ++i)
            {
                queue.Enqueue(Copy());
            }
        }

        private GameObject Copy()
        {
            var copy = GameObject.Instantiate(Prefab, parent);
            copy.SetActive(false);
            return copy;
        }

        private GameObject AvailableObject()
        {
            GameObject avaliableObject = null;
            if (queue.Count > 0 && !queue.Peek().activeSelf)
            {
                avaliableObject = queue.Dequeue();
            }
            else
            {
                avaliableObject = Copy();
            }
            queue.Enqueue(avaliableObject);
            //avaliableObject.SetActive(true);
            return avaliableObject;
        }

        public GameObject PreparedObject()
        {
            GameObject preparedObject = AvailableObject();
            
            preparedObject.SetActive(true);

            return preparedObject;
        }
        public GameObject PreparedObject(Vector3 position)
        {
            GameObject preparedObject = AvailableObject();
            
            preparedObject.SetActive(true);
            preparedObject.transform.position = position;

            return preparedObject;
        }
    }
}

2.新建PoolManager脚本

代码如下(示例):

/****************************************************
    文件:PoolManager.cs
	作者:HKZ
    邮箱: 3046916186@qq.com
    日期:2021/12/1 20:14:46
	功能:Nothing
*****************************************************/

using System.Collections.Generic;
using UnityEngine;

namespace HKZ
{
    public class PoolManager : MonoBehaviour
    {
        [SerializeField]
        private Pool[] playerProjectilePools;

        private static Dictionary<GameObject, Pool> dictionary;

        private void Start()
        {
            dictionary = new Dictionary<GameObject, Pool>();
            Initialize(playerProjectilePools);
        }

        private void Initialize(Pool[] pools)
        {
            foreach (var pool in pools)
            {
                if (dictionary.ContainsKey(pool.Prefab))
                {
                    Debug.LogError("Same prefab in multiple pools!--->Prefab:" + pool.Prefab.name);
                    continue;
                }
                dictionary.Add(pool.Prefab, pool);
                Transform poolParent = new GameObject("Pool:" + pool.Prefab.name).transform;
                poolParent.parent = transform;

                pool.Initialize(poolParent);
            }
        }

        public static GameObject Release(GameObject prefab)
        {
            if (!dictionary.ContainsKey(prefab))
            {
                Debug.LogError("Pool Manager could not find prefab" + prefab.name);
                return null;
            }
            return dictionary[prefab].PreparedObject();
        }
        public static GameObject Release(GameObject prefab, Vector3 position)
        {
            if (!dictionary.ContainsKey(prefab))
            {
                Debug.LogError("Pool Manager could not find prefab" + prefab.name);
                return null;
            }
            return dictionary[prefab].PreparedObject(position);
        }
       
    }
}

三、把Pool脚本挂载在新建的Empty上

在这里插入图片描述

  • 调用PoolManager脚本里的Release函数即可
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值