unity 对象池的基本运用

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

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

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

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

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

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

    void Awake()
    {
        _Instance = this;
    }
    ///


    /// 从对象池中获取
    ///

    ///
    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);
        }
    }

    ///


    /// 放到对象池中
    ///

    ///
    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);

        }
    }

 

最后运行实验一下:unity 对象池的基本运用_第1张图片

你可能感兴趣的:(unity模块)