unity 对象池的基本运用

机械化的对对象池进行解说就是: 对象池就存放需要被反复调用资源的一个空间,比如游戏中要常被大量复制的对象,子弹,敌人,以及任何重复出现的对象。 

通俗的说就是:把经常大量使用的对象放在一个容器里面,当我们用的时候取出来,不用的时候就放到池子里面,不用每一次都销毁、创建,消耗性能。

下面就用代码实现一个简单的对象池栗子。

首先先创建一个GameManager脚本挂在相机上, 用来管理对象池 设为静态。

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

public class GameManager : MonoBehaviour
{
    public static GameManager _Instance;
    //定义一个集合  (对象池)
    List<GameObject> objectPools = new List<GameObject>();

    void Awake()
    {
        _Instance = this;
    }
    /// <summary>
    /// 从对象池中获取
    /// </summary>
    /// <param name="obj"></param>
    public void GetObj(GameObject obj)
    {
        //判断池中是否有可用资源
        if (objectPools.Count == 0)  //没有则重新生成
        {
            GameObject go = Instantiate(obj, Vector3.zero, Quaternion.identity) as GameObject;
            //并添加到池中
            objectPools.Add(go);
        }
        else
        {
            //从对象池中取
            GameObject go = objectPools[0];
            go.SetActive(true);
            objectPools.Remove(go);
        }
    }

    /// <summary>
    /// 放到对象池中
    /// </summary>
    /// <param name="obj"></param>
    public void SetObj(GameObject obj)
    {
        objectPools.Add(obj);
        obj.SetActive(false);
    }

}

在创建一个脚本挂在子弹预设物上,用来回收子弹

 public float Speed = 6f;
    
    // Update is called once per frame
    void Update()
    {
        //让子弹向前移动
        transform.Translate(Vector3.forward * Time.deltaTime * Speed);
        StartCoroutine(DesBullet(3f));
    }

    //回收子弹
    private IEnumerator DesBullet(float v)
    {
        yield return new WaitForSeconds(v);
        GameManager._Instance.SetObj(gameObject);
    }

 

再创建一个脚本挂在相机上 获取池中的子弹

//子弹预设
    public GameObject BullerPre;
    // Update is called once per frame
    void Update () {
        if (Input.GetMouseButtonDown(0)) {

            GameManager._Instance.GetObj(BullerPre);

        }
    }

 

最后运行实验一下:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值