小白错误—未达到预设子弹生命时间,子弹自动消失

Posted 一颗菜的成长史

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小白错误—未达到预设子弹生命时间,子弹自动消失相关的知识,希望对你有一定的参考价值。

如需转载,请保留本文链接。

出现问题:子弹正常出现,偶尔几枚子弹会有,没有存活到5秒钟,也没有碰到物体,就自动消失的问题.

解决关键函数:

错误代码如下:

public class BulletBase : MonoBehaviour
{
    public float Speed;
    float lifeTime;
    private void Awake()
    {
        lifeTime = 0;
    }
    private void Start() {        }
    private void Update()
    {
        Run();
        disable();
    }
    //子弹运动方式
    public virtual void Run() { }
    //子弹生存5秒后死亡
    private void disable()
    {
        lifeTime += Time.deltaTime;
        if (lifeTime >= 3)
        {
            gameObject.SetActive(false);
            Pool.DeadBulletList.Add(gameObject);//将子弹加入死亡池,预备集中处理
            lifeTime = 0;
        }
    }
}

正确代码如下:

public class BulletBase : MonoBehaviour
{
    public float Speed;
    float lifeTime;
    private void Awake()
    {
        lifeTime = 0;
    }
    private void OnEnable()
    {
        lifeTime = 0;
    }
    private void Start() {        }
    private void Update()
    {
        Run();
        disable();
    }
    //子弹运动方式
    public virtual void Run() { }
    //子弹生存5秒后死亡
    private void disable()
    {
        lifeTime += Time.deltaTime;
        if (lifeTime >= 3)
        {
            gameObject.SetActive(false);
            Pool.DeadBulletList.Add(gameObject);//将子弹加入死亡池,预备集中处理
            lifeTime = 0;
        }
    }
}

问题所在:

当gameobject setactive(true)时,会调用OnEnable()方法,不会调用Awake()方法.

Awake()初始化lifeTime=0后,不再进行调用,再次使用gameobject时会调用OnEnable()方法,所以lifeTime=0也需要在OnEnable()中调用一次.

以上是关于小白错误—未达到预设子弹生命时间,子弹自动消失的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D制作简易坦克旋转发射子弹

ActionScript 3:子弹弹跳

unity怎么用C#写子弹碰到物件3次才死

基于Java的飞机大战游戏的设计与实现

坦克大战

塔防游戏学习日记之朝敌人发射子弹