利用对象池发射子弹(自创)

2017-08-14  本文已影响0人  土豆_9724

利用对象池发射子弹(自创)

一:创建一个新的场景,随便创建一个物体,在这个物体上添加控制代码:控制这个物体前后左右,旋转方向。代码如下:

using UnityEngine;

using System.Collections;

//这是一个关于对象池的程序 ,发射20个子弹

public class DuiXiangCi : MonoBehaviour {

 void Update () {
    Control();

            }
public void Control()
{

        if (Input .GetKey(KeyCode.W))
        {
            this.transform.Translate(Vector3 .forward * 0.2f);
        }
        if (Input .GetKey(KeyCode.S))
        {
            this.transform.Translate(Vector3 .forward * -0.2f);
        }

    if (Input .GetKey(KeyCode.A))
    {
        this.transform.Rotate(Vector3 .up * -1.0f);
    }
    if (Input .GetKey(KeyCode.D))
    {
        this.transform.Rotate(Vector3 .up * 1.0f);
    }

}

}

二: 按下鼠标左键, 这个物体开始发射子弹,隔几秒之后消失子弹,并且子弹发射方向随便物体旋转而改变方向。在这里,为了优化内存,我们用的是 对象池。挂在物体身上的代码如下:

using UnityEngine;

using System.Collections;

//这是一个关于对象池的程序 ,发射20个子弹

public class DuiXiangCi : MonoBehaviour {

public GameObject mFireBall; // 发射子弹的预设体

private Stack sFireBll = new Stack(); // 声名一个栈
public static DuiXiangCi dd;
public Transform MFirePos;  // 开火位置
             // Use this for initialization
             void Start () {
    Create(20);
    dd = this;
            }

public void Create(int num)  //写一个发射20个子弹的循-环程序方法
{
    for (int i = 0; i < num; i++)
    {   // 声名一个实例化物体
        GameObject obj = Instantiate(mFireBall) as GameObject;
        obj.gameObject.SetActive( false); // 生成的这个物体刚开始的时候是不显示的
        sFireBll.Push(obj);  // 把这个生成的子弹放入栈中
    }
}
// 出栈
GameObject GetObj(Vector3 pos, Quaternion rot)
{
    if (sFireBll.Count < 2)
    {
       Create(10);
    }
    GameObject obj = sFireBll.Pop() as GameObject;
    obj.transform.position = pos;
    obj.transform.rotation = rot;
    obj.gameObject.SetActive( true);
    return obj;
}
public void Recyele(GameObject obj)  // 回收,让子弹自己回收的话,这里是在子弹上调用的。
{
    obj.gameObject.SetActive( false);
    sFireBll.Push(obj);   // 子弹打出去之后,再回收到栈里。
}

             // Update is called once per frame
             void Update () {
    Control();
    if (Input .GetMouseButtonDown(0))
    {
        GetObj(MFirePos.position, this.transform.rotation  );
    }
            }
public void Control()
{

        if (Input .GetKey(KeyCode.W))
        {
            this.transform.Translate(Vector3 .forward * 0.2f);
        }
        if (Input .GetKey(KeyCode.S))
        {
            this.transform.Translate(Vector3 .forward * -0.2f);
        }

    if (Input .GetKey(KeyCode.A))
    {
        this.transform.Rotate(Vector3 .up * -1.0f);
    }
    if (Input .GetKey(KeyCode.D))
    {
        this.transform.Rotate(Vector3 .up * 1.0f);
    }

}

}

三:下面是属于写在子弹身上的代码,子弹发出后,利用对象池,子弹自动回收。具体代码如下;

using UnityEngine;

using System.Collections;

public class spherePao : MonoBehaviour {

             void OnEnable () {

    Invoke( "Recycle",3.0f);

            }
private void Recycle()
{   //调用另一个脚本里的对象池自动回收机制
    DuiXiangCi.dd.Recyele(this .gameObject);
}

             // Update is called once per frame
             void Update () {
    transform.Translate( Vector3.forward);   
            }

}
/* 备注:

上一篇下一篇

猜你喜欢

热点阅读