美文网首页
[Unity]对象池

[Unity]对象池

作者: Loyal_HAC | 来源:发表于2020-06-10 18:23 被阅读0次

对象池的作用

避免一直重复的创建和销毁某个对象,增加消耗

理解

就是在开辟一个地方,去储存会大量实例化和销毁的对象(最典型的就是FPS游戏里面的子弹),对象池就是给这些实例化的对象有个地方住着,而不是因为无家可归就被鲨了,当下次再需要的时候就可以直接利用而不是需要再生一个(毕竟生孩子需要很大的消耗 哈哈哈哈o(*≧▽≦)ツ┏━┓)。

对象池最少需要两个功能

1.获取对象
2.回收对象

不说废话上代码

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

public class ObjPool : MonoBehaviour
{
    // Use this for initialization
    public static ObjPool _instance;
    private Dictionary<string, List<GameObject>> _pool = new Dictionary<string, List<GameObject>>();
    private Dictionary<string, GameObject> _prefab = new Dictionary<string, GameObject>();
    void Awake()
    {
        _instance = this;
    }
    // Update is called once per frame
    void Update()
    {
    }
    /// <summary>
    /// 在对象池获取对象
    /// </summary>
    /// <param name="objName">对象名称</param>
    /// <returns></returns>
    public GameObject GetObj(string objName)
    {
        GameObject result = null;
        if (_pool.ContainsKey(objName))
        {
            if (_pool[objName].Count > 0)
            {
                result = _pool[objName][0];
                result.SetActive(true);
                _pool[objName].Remove(result);
                return result;
            }
        }
        GameObject prefab = null;
        if (_prefab.ContainsKey(objName))
        {
            prefab = _prefab[objName];
        }
        else
        {
            prefab = Resources.Load<GameObject>("Prefabs/" + objName);
            _prefab.Add(objName, prefab);
        }
        result = Instantiate(prefab);
        result.name = objName;
        return result;
    }
    /// <summary>
    /// 回收到对象池
    /// </summary>
    /// <param name="obj"></param>
    public void RecycleObj(GameObject obj)
    {
        obj.SetActive(false);
        if (_pool.ContainsKey(obj.name))
        {
            _pool[obj.name].Add(obj);
        }
        else
        {
            _pool.Add(obj.name, new List<GameObject> { obj });
        }
    }
}

测试一哈

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

public class TestObjPool : MonoBehaviour {

    public GameObject[] gameObjects=new GameObject[10];
    public void Start()
    {
        for (int i = 0; i < 10; i++)
        {
            gameObjects[i]=ObjPool._instance.GetObj("Obj");
        }

        for (int i = 0; i < 5; i++)
        {
            ObjPool._instance.RecycleObj(gameObjects[i]);
        }
    }
    
}

结果

回收的对象没被销毁只是隐藏了,可以再利用(似乎就是可回收垃圾🤣)


结果

相关文章

  • Unity 学习笔记

    Unity 对象池实现方案:

  • Unity对象池

  • unity对象池

    在网上看见了对象池的一些应用,一直很好奇,所以来研究一下 对象池主要的用途就是在那些需要重复被创建和销毁的物体上可...

  • Unity——对象池

    前言 实现对象池的步骤 代码 该脚本可以添加到创建的空物体身上,注意游戏场景中必须要有带有碰撞器的对象存在,不然,...

  • [Unity]对象池

    对象池的作用 避免一直重复的创建和销毁某个对象,增加消耗 理解 就是在开辟一个地方,去储存会大量实例化和销毁的对象...

  • Unity 对象池

    最近在学习 Unity 官方的 《Tower Defense Template》[https://unity3d....

  • Unity 类对象池资源池对象池

    类对象池 包含创建对象池,取对象池中的内容,回收。 对象管理类 因为使用加载AB包的时候可能会频繁创建类,但是ne...

  • Unity-对象池

    简介 解决某些对象频繁创建或销毁造成的时间资源消耗 实例 参考 https://www.jianshu.com/p...

  • Unity对象池封装

    一共分为两个类,SubPool与ObjectPool,SubPool类为总对象池包含ObjectPool的子池子,...

  • Unity 对象池技术

    Unity 对象池技术 为什么使用对象池? 在我们开发中,往往会遇见需要不断创建和销毁同一物体的情况。(如飞机大战...

网友评论

      本文标题:[Unity]对象池

      本文链接:https://www.haomeiwen.com/subject/ldwptktx.html