IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity3D-对象池 -> 正文阅读

[游戏开发]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函数即可
  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章           查看所有文章
加:2021-12-07 12:21:59  更:2021-12-07 12:22:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 21:03:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码