Unity之"诡异"的协程

科技资讯 投稿 26300 0 评论

Unity之

游戏目标:让小车进入到对应颜色屋子里,即可获得一分。(转弯的道路可控

但是当车子在转弯的道路上时,此时将左转弯的路变成右转弯的路,车子就会失控,因为碰撞体消失后对应的事件就不会执行了。

小车前进代码:

public class CarMove : MonoBehaviour
{
    public float Speed = 1f;

    // Start is called before the first frame update
    void Start(
    {
        
    }

    // Update is called once per frame
    void Update(
    {   
        transform.Translate(Vector3.forward * Speed * Time.deltaTime;
    }

}
小车转弯代码:
public class CurveCollider : MonoBehaviour
{
    // Start is called before the first frame update
    void Start(
    {
        
    }

    // Update is called once per frame
    void Update(
    {
        
    }

    private void OnCollisionEnter(Collision collision
    {
        if (this.CompareTag("TurnLeft"
        {
            StartCoroutine(CarTurnLeft(collision;
        }
    }

    IEnumerator CarTurnLeft(Collision collision
    {
        while (true
        {
            Vector3 worldUp = Vector3.up;
            Vector3 targetPos = collision.transform.position;
            Vector3 direction = transform.position - targetPos;
            Vector3 forwardDir = new Vector3(-1.0f, 1.0f, 1.0f;
            Vector3.OrthoNormalize(ref worldUp, ref direction, ref forwardDir;
            Quaternion quaternion = Quaternion.identity;
            quaternion.SetLookRotation(forwardDir;
            collision.transform.rotation = quaternion;
            yield return null;
            Debug.Log(collision.transform.eulerAngles.y;
            if (collision.transform.eulerAngles.y >= 270 && (collision.transform.eulerAngles.y - 270 <= 1
            {
                quaternion = Quaternion.identity;
                quaternion.eulerAngles = new Vector3(0.0f, -90.0f, 0.0f;
                collision.transform.rotation = quaternion;
                yield break;
            }
        }
    }
}

下面先简单介绍一下协程的基本概念:Unity手册:协程
UnityEngine所提供的SDK都只能在单线程中调用,而协程也是单线程的,不同于多线程。

关于协程其中有这么一句话,很重要:协程优化

因为协程中的局部作用域变量必须在 yield 调用中保持一致,所以这些局部作用域变量将被保存到上一级的生成的它们的类中,从而保证在协程的存活期内保留在堆上的地址分配。

房子的碰撞代码如下:

private void OnCollisionEnter(Collision collision
    {
        if (this.CompareTag(collision.gameObject.tag
        {
            GameController.Score++;
        }
        Destroy(collision.gameObject;
    }

当小车进入到房子后就会摧毁小车,如果进入的车是对的,就加一分。

if (collision.transform.eulerAngles.y >= 270 && (collision.transform.eulerAngles.y - 270 <= 1  

这是不是很匪夷所思呢?

此时你可以想起上面那句话,应该可以猜到了为什么会发生这样。

此时小车3正好在执行协程,当从yield 之后的语句开始执行时,由于小车已经被摧毁,所以就报错了。

编程笔记 » Unity之"诡异"的协程

赞同 (43) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽