游戏目标:让小车进入到对应颜色屋子里,即可获得一分。(转弯的道路可控
但是当车子在转弯的道路上时,此时将左转弯的路变成右转弯的路,车子就会失控,因为碰撞体消失后对应的事件就不会执行了。
小车前进代码:
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 之后的语句开始执行时,由于小车已经被摧毁,所以就报错了。