进入与退出
本课属于 Coddy Unity 学习旅程的“物理与游戏玩法”单元。第 20 课,共 71 课。
触发器还会发送另外两种消息。OnTriggerExit(Collider other)会在重叠结束时的物理步中运行一次,无论重叠是如何结束的。只要重叠持续存在,OnTriggerStay(Collider other)就会在每个物理步中运行一次,默认每秒运行 50 次,就像FixedUpdate()一样。这三种消息都使用相同的Collider。
这个上升气流会抬起其中漂浮的物体,并在物体离开时报告:
public float lift = 15f;
void OnTriggerStay(Collider other)
{
other.attachedRigidbody.AddForce(Vector3.up * lift);
}
void OnTriggerExit(Collider other)
{
Debug.Log(other.name + " left the updraft");
}力应该在物理步中施加,因此OnTriggerStay很适合:只要球在内部,就会在每个物理步中施加一次推力;球一离开,推力就会停止。上升气流没有 Rigidbody,因此每个进入的物体都必须有一个,而且这里的attachedRigidbody永远不会是null。如果要在OnTriggerStay中施加每秒的力,请乘以Time.deltaTime。在物理步中,它表示这一步的时长,也就是 0.02。每次进入都会触发一次OnTriggerEnter,之后,同一个碰撞体还会触发一次OnTriggerExit。
挑战
简单只要装卸区里有东西,就点亮灯。
- 添加一个
int inBay;字段。在Start()中,将lamp.enabled = false;。 - 在
OnTriggerEnter中,将inBay加 1,并将lamp.enabled = true;。 - 在
OnTriggerExit中,将inBay减 1,并且只在它为 0 时关闭灯。
按“开始”,把箱子推进再推出:直到装卸区空了,灯才会熄灭。然后按“检查”。
亲手试试
using UnityEngine;
public class LoadingBay : MonoBehaviour
{
public Light lamp;
// 只要装卸区内有东西,灯就会亮;装卸区为空时,灯就会熄灭。
}
物理与游戏玩法中的所有课
自己练习: Unity 在线编辑器