美文网首页
Unity3d对象池

Unity3d对象池

作者: 明月海子 | 来源:发表于2019-06-01 13:51 被阅读0次

介绍演示

在游戏中,大量使用的对象,重复的创建和销毁,很耗费性能,这个时候就要使用对象池技术,当物体使用时,如果对象池中有,从对象池中取出使用,没有就创建,不使用时候,将物体放回对象池,隐藏

o1.png

代码演示

对象池脚本

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

public class ObjectPoolManager : MonoBehaviour
{
public static ObjectPoolManager Instance;
//对象池集合
public List<GameObject> ObjectPoolList = new List<GameObject>();
//对象预制体
public GameObject Object1;
//最大存放在对象池里面的个数
public int MaxCount = 100;

//将对象保存到对象池
public void Push(GameObject obj)
{
    if (ObjectPoolList.Count < MaxCount)
    {
        ObjectPoolList.Add(obj);
    }
    else
    {
        Destroy(obj);
    }
}

//从对象池中取出一个对象
public GameObject Pop()
{
    if (ObjectPoolList.Count > 0)
    {
        GameObject go = ObjectPoolList[0];
        ObjectPoolList.RemoveAt(0);
        return go;

    }
    return Instantiate(Object1);
}

//清除对象池
public void Clear()
{
    ObjectPoolList.Clear();
}


void Start()
{
    ObjectPoolManager.Instance = this;
}

void Update()
{
    
}

}

控制脚本

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

public class ObjectController : MonoBehaviour
{
//管理存在的对象(不在对象池中的对象);
public List<GameObject> AlreadyExit = new List<GameObject>();
public int RandomPos = 100;

void Start()
{
    
}

void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        //创建,从对象池中取出
        GameObject bullet = ObjectPoolManager.Instance.Pop();
        AlreadyExit.Add(bullet);
        bullet.SetActive(true);
        int RandomX = Random.Range(0, RandomPos);
        int RandomY = Random.Range(0, RandomPos);
        int RandomZ = Random.Range(0, RandomPos);
        bullet.transform.localPosition = new Vector3(RandomX,RandomY,RandomZ);
    }
    if (Input.GetMouseButtonDown(1))
    {
        //删除,放入对象池
        ObjectPoolManager.Instance.Push(AlreadyExit[0]);
        AlreadyExit[0].SetActive(false);
        AlreadyExit.RemoveAt(0);
    }
}

}

相关文章

  • Unity3d对象池

    介绍演示 在游戏中,大量使用的对象,重复的创建和销毁,很耗费性能,这个时候就要使用对象池技术,当物体使用时,如果对...

  • 图片链接工具

    Unity3d生命周期:Unity3d生命周期.png XJGame内存池:内存池.png XJGameUI框架i...

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

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

  • Unity3d对象池技术的实现Demo

    不管何种语言,对象的创建与销毁都需要消耗一定的时间,Unity3D 也是如此,所以在场景中,如果某些对象需要频繁的...

  • Laya_2D示例项目使用对象池预制体的创建、位置设置和添加到父

    //使用对象池创建盒子 1.对象池的使用 对象池创建箱子 let box = Laya.Pool.getI...

  • Unity--简单的对象池

    简单的对象池分三步走: 建立对象池 拿到对象 回收对象 Test为对象池,Obj为自动回收的物体 Test.cs ...

  • 对象池

    一、对象池概述: 对于那些实例化开销比较大,并且生命周期比较短的对象,我们可以通过池就行管理。所谓池,就相当于一个...

  • 对象池

  • 对象池

    概要 看到现在,Netty之设计精妙,令人感叹。优化至极,令人发指。在高并发场景下,对象的分配的损耗是很大的,特别...

  • 对象池

    讲在前面 为什么要有对象池?我们需要一种类型的实例时候往往回去new一个这样会造成gc问题对象池根本奥义就在于一个...

网友评论

      本文标题:Unity3d对象池

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