首页 > 其他分享 >unity 之简单的实例(clone)对象池

unity 之简单的实例(clone)对象池

时间:2023-05-04 11:44:47浏览次数:41  
标签:PoolDic InstanceIdDic poolEntity instanceId GameObject clone unity 实例 public

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


public class GameObjectPoolEntity 
{
    public  Queue<GameObject> QueueList;
    public string Name;
    public GameObject Pool0bj;
}

public class QGGameObjectPool : IDisposable
{
    private Dictionary<int, GameObjectPoolEntity> m_PoolDic;
    private Dictionary<int, List<int>> m_InstanceIdDic;

    public QGGameObjectPool()
    {
        m_PoolDic = new Dictionary<int, GameObjectPoolEntity>();
        m_InstanceIdDic = new Dictionary<int, List<int>>();
    }

    //取池
    public GameObject Spawn(GameObject prefabObj,  Action<GameObject> onComplete = null)
    {
        lock (m_PoolDic)
        {                        
            int instanceId = prefabObj.GetInstanceID();
            m_PoolDic.TryGetValue(instanceId, out var poolEntity);
            if (poolEntity == null)
            {
                poolEntity = new()
                {                    
                    Pool0bj = new GameObject(prefabObj.name + "Pool"),
                    Name = prefabObj.name,
                    QueueList = new Queue<GameObject>()
                };
                m_PoolDic[instanceId] = poolEntity;
            }
            else
            {
                if (poolEntity.QueueList.Count > 0)
                {
                    GameObject obj  = poolEntity.QueueList.Dequeue();
                    obj.SetActive(true);
                    onComplete?.Invoke(obj);
                    return obj;
                }
            }
            GameObject newObj = GameObject.Instantiate(prefabObj);
            newObj.transform.parent = poolEntity.Pool0bj.transform;
            m_InstanceIdDic.TryGetValue(instanceId, out var lst);           
            lst??= new List<int>();
            lst.Add(newObj.GetInstanceID());
            m_InstanceIdDic[instanceId] = lst;
            newObj.SetActive(true);
            onComplete?.Invoke(newObj);
            return newObj;
        }
    }

    //回池
    public void Despawn(GameObject gameObject)
    {
        lock (m_PoolDic) 
        {                         
            int instanceId = GetInstanceId(gameObject.GetInstanceID());      
            m_PoolDic.TryGetValue(instanceId, out var poolEntity);
            if (poolEntity != null)
            {
                gameObject.SetActive(false);
                poolEntity.QueueList.Enqueue(gameObject);                
            }
        }
    }

    private int GetInstanceId(int instanceID) 
    {
        foreach (var item in m_InstanceIdDic)
        {
            foreach (var obj in item.Value) 
            {
                if (obj == instanceID) 
                {
                    return item.Key;
                }
            }
        }
        return 0;
    }


    public void Dispose()
    {
        m_PoolDic.Clear();
        m_InstanceIdDic.Clear();
    }
}

 

标签:PoolDic,InstanceIdDic,poolEntity,instanceId,GameObject,clone,unity,实例,public
From: https://www.cnblogs.com/zhaolaosan/p/17370693.html

相关文章

  • 『不走弯路』Unity学习路线(主程方向)
    ⚠️⚠️⚠️下面教程推荐链接丢失,点击上述原文查看黑铁LV0本级描述没有接触过Unity无编程基础......
  • Epic资源转到unity的方法
    众所周知,unity中的素材主要是通过unity资源商店获取的。但是unity资源商店的白嫖机会太少了,而隔壁UE的Epic资源商店就有每月免费的资源,不白嫖成何体统?但是UE咱也不会用啊,白嫖的资源也不能浪费掉啊。今天就给大家介绍Epic资源转unity的方法。1.下载UE和新建项目首先要下载Epic,然......
  • unity利用Rigibody实现第一人称移动
    1.CameraRotation脚本,将它给MainCamera,实现上下视角旋转usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassCameraRotation:MonoBehaviour{[Tooltip("鼠标灵敏度")]publicfloatRotateSpeed=5f;//x轴的旋转......
  • 关于java中的多态和对实例化对象的一些理解
    java面向对象三大特征即为:继承封装多态。而多态需要三大必要条件。分别是:继承、方法重写、父类引用指向子类对象。我们先一个一个来理解。1、首先是继承和重写。这个很简单。因为多态就是建立在不同的重写之上的。也就是说多态就是在使用着一个方法的不同重写。而重写又是依赖着......
  • 实例化对象 A a = new A();
    "new"在Java中代表实例化的意思,Aa=newA()代表实例化了一个对象a,这个对象a属于A类.可以认为A是一个抽象概念,对象a是一个实体(存储于内存),等式左边实际上就是用类A定义对象a,等式右边就是创造对象a的过程.Aa;   是定义一个类型为A的对象。new实例化a=n......
  • unity
    将物体变为受重力影响的物理对象给对象添加组件:2D刚体(Rigidbody2D)物体会变成物理物体,有重力,会掉落让物体能与其他物体互动给物体添加碰撞器(Collider2D)碰撞器有绿色的轮廓,使用offset可移动轮廓脚本本质是让我们自定义自己的组件Start()用于在启用此脚本后将立即运行一次......
  • unity发布到4399的webgl模式问题:FRAMEWORK.JS中的WEBREQUEST_SEND括号内的函数(不能有
    在发布4399的时候,之前遇到过这个问题,解决方法当然就是删除这个函数啦。步骤也很简单,但是刚开始摸不着头脑搞了好久,最后发现发布的时候有个加密选项,选择不加密,后面build的文件里面就可以进行打开修改,按照要求修改函数即可。......
  • Android获取其他包的Context实例,…
    Android中有Context的概念,想必大家都知道。Context可以做很多事情,打开activity、发送广播、打开本包下文件夹和数据库、获取classLoader、获取资源等等。如果我们得到了一个包的Context对象,那我们基本上可以做这个包自己能做的大部分事情。         那我们能得到吗?很高......
  • 本实例实现了android上传手机图片…
    本实例实现了android上传手机图片至服务器,服务器进行保存服务器servlet代码Java代码 1.doPost(HttpServletRequestrequest,HttpServletResponseresponse)2.throwsServletException,IOException{3.4.......
  • IOS实例变量和属性
    在IOS编程中,很多人没有理解实例变量与属性的区别,我根据自己的经验,这这里与大家分享下这里面的区别,下面我写一个简单的例子:.h@interfaceMyController:UIViewController{UILabel*_myLabel;//这里是实例变量声明}@property(nonatomic,retain)UILabel*myLabe......