Unity3D内存管理之资源池Object Pool(适合初学者)

news/2024/7/20 15:55:15 标签: Unity, ObjectPool, 资源池, 内存管理
引言:坚持更新,坚持更新,坚持更新。今日分享的是对象池的简单应用,从而有效优化内存。这里主要根据坦克大战的案例,讲解资源池的基本用法。项目使用的源文件在文末提供。本人也只是一名即将毕业的大学生,讲解如有不足的地方,各位客官还请提点!
开发版本:Unity 5.3.5f1
适合人群:适合初学者


一、什么是资源池

将一定数量的对象预先存储在资源池中,当需要的时候使用,而不是每次都实例化一个对象,不用的时候再放回。例如一款射击类游戏,需要不断的发射子弹,如果每发射一颗子弹,都要实例化一个对象,随后再销毁对象,再实例化对象,必然会消耗较大的内存。如果预先就将子弹实例化出一定的数量,并保存在弹夹中,发射的时候,取出来发射,不用的时候,再放回弹夹。如此反复利用,可以避免频繁实例化和销毁带来的性能消耗。这里的弹夹的概念就是资源池模式!

二、实现思路

以之前小生的坦克大战为例(传送门:https://blog.csdn.net/qq_35361471/article/details/79321304),来实现子弹的资源池功能。在游戏开始时,预先实例化30枚子弹在场景中,并且隐藏起来。当坦克发射子弹的时候,显示子弹。当子弹碰撞到物体爆炸时,将其隐藏起来。假设30枚子弹在同一时刻都在场景中使用(该游戏规模较小,30枚子弹足够了,但存在子弹不够的情况),则实例化新的子弹,提供使用。可以使用列表来存储实例化的子弹。使用流程图如下所示:


三、代码实现

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class BulletPool : MonoBehaviour
{
    public int count = 30;//预定义子弹的数量
    public GameObject bulletPrefab;

    private List<GameObject> bulletList = new List<GameObject>();//列表存储实例化的子弹

    private void Awake()
    {
        InitPool();
    }

    //初始化资源池
    private void InitPool()
    {
        for (int i = 0; i < count; i++)
        {
            CreatBullet();
        }
    }

    //实例化一个子弹,加入到列表中,并隐藏
    private GameObject CreatBullet()
    {
        GameObject go = Instantiate(bulletPrefab) as GameObject;
        bulletList.Add(go);
        go.transform.SetParent(transform);
        go.SetActive(false);
        return go;
    }

    //返回子弹列表中还没有使用的子弹对象,如果没有的话,则实例化新的子弹
    public GameObject GetBullet()
    {
        foreach (GameObject bullet in bulletList)
        {
            if (bullet.activeInHierarchy == false)
            {
                bullet.SetActive(true);
                return bullet;
            }
        }
        return CreatBullet();
    }

    //回收子弹到资源池中
    //回收成功返回true,失败返回false
    public bool PutBack(GameObject go)
    {
        if (bulletList.Contains(go))
        {
            go.SetActive(false);
            return true;
        }
        return false;
    }
}

源项目文件链接:链接:https://pan.baidu.com/s/1f1-nQtS3B30Q0-NVOr_TMg 密码:5ptj

共同努力学习Unity!!!


http://www.niftyadmin.cn/n/880638.html

相关文章

Shader Forge 入门学习(一) 基础操作

引言&#xff1a;失踪人口回归&#xff0c;最近几个月刚刚毕业&#xff0c;进入社会&#xff0c;对着未来有着些许迷茫&#xff0c;但起风了&#xff0c;唯有努力生存&#xff01;近日学习Shader Forge&#xff0c;记录下来&#xff0c;共同进步&#xff01;内容主要包括Shader…

Unity3D AR开发之Vuforia入门学习

引言&#xff1a;2016年的AR游戏Pokemon GO火遍全球(除了中国)&#xff0c;让我第一次了解到AR的世界。神奇的虚拟对象出现在现实世界中&#xff0c;感觉小时候的游戏王这类的动画可以成为现实。 最近小生学习了高通的Vuforia&#xff0c;本篇着重介绍入门操作。开发版本&#…

Unity3D 自定义天空盒Skybox及接缝问题

引言&#xff1a;本篇介绍如何自定义天空盒子&#xff0c;以及解决天空盒子的接缝问题一、自定义天空盒子网络下载如下天空盒图片修改其纹理形状Texture Shap为cube&#xff0c;生成一个立方体贴图然后&#xff0c;创建一个材质&#xff0c;shader类型如下&#xff1a;天空盒作…

Shader Forge 入门学习(二) 实现发光、火焰燃烧、溶解、扭曲效果

引言&#xff1a;本篇博客主要记录ShaderForge的常用案例&#xff0c;包括外发光、火焰燃烧、溶解、扭曲等效果。由于内容较多会分成几篇博客记录。如果您对Shader Forge的常用操作还不熟悉&#xff0c;请先看 Unity3D Shader Forge 入门学习(一)。刚开始学习时&#xff0c;可以…

Unity 性能优化总结(适合初学者)

性能优化 引言&#xff1a; 本篇博客总结了一些常用的性能优化方法&#xff0c;希望能帮到和我一样在开发道路上前进的童鞋们&#xff01;在此&#xff0c;需要感谢CSDN、简书的一些博主&#xff0c;泰课、Siki学院和B站的一些老师们。 开发版本: Unity 2017 文章目录性能优化…

Unity AssetBundle 从入门到掌握(适合初学者)

AssetBundle从入门到掌握 文章目录AssetBundle从入门到掌握1. AssetBundle的定义和作用2. 什么是AssetBundle&#xff1f;3. AssetBundle使用步骤4. 代码打包AssetBundle5. AssetBundle的加载和卸载AB的加载AB的卸载6. AssetBundle分组策略总结逻辑实体分组注意7. Manifest文件…

Unity Networking开发多人联机射击游戏

UNet开发多人联机射击游戏 引言&#xff1a; Networking作为Unity官方的用于开发多人在线游戏的网络模块&#xff0c;开发者可以不用自己搭建网络模块的底层&#xff0c;通过使用Unity提供的一些相关组件&#xff0c;可以轻松实现简单的多人在线游戏。本片博客为泰课在线贾老师…

Unity 编辑器扩展总结 一:编辑器开发入门

编辑器扩展总结 工欲善其事必先利其器 引言&#xff1a; 在项目开发中&#xff0c;编辑器扩展为开发者提供了开发自定义工具的功能&#xff0c;让开发者更加便利地使用编辑器开发项目。如若博客中存在错误&#xff0c;还请不吝赐教。所有参考的博客或者视频来源将在文末展示。 …