OnTriggerEnter
本课属于 Coddy Unity 学习旅程的“物理与游戏玩法”单元。第 16 课,共 71 课。
void OnTriggerEnter(Collider other) 会在另一个碰撞体开始与触发器重叠时,于物理步骤中运行一次。other 就是那个碰撞体,因此 other.name、other.gameObject 和 other.CompareTag("Player") 会告诉你进入的是哪个对象。Unity 会在两个对象的脚本上都调用它:在触发器上,other 是进入的对象;在进入的对象上,other 是触发器。
这条终点线只会对玩家做出反应,不会对其他对象做出反应,所以滚过它的球不会记录任何内容:
void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
Debug.Log(other.name + " crossed the finish line");
}
}参数必须是 Collider。如果写成 void OnTriggerEnter(Collision collision),脚本仍然可以编译,因为对 C# 来说,它只是一个普通方法。Unity 会检查参数本身,记录一条 Script error: OnTriggerEnter 错误,提示 This message parameter has to be of type: Collider,并且永远不会调用这个方法。Collision 用于 OnCollisionEnter,两个实体在接触点相遇时会调用它。触发器没有接触信息可报告,只有碰撞体,因此它接收的是 Collider。
挑战
简单修复收费站的方法,然后向汽车收取过路费。
- 按“运行”:控制台会显示一条与方法有关的错误。将其改为
void OnTriggerEnter(Collider other)。 - 在方法中,当
other.CompareTag("Car")时,将toll加到collected上,并记录"Toll: " + collected。骑自行车的人可以免费通过。
按“运行”:控制台会先显示 Toll: 3,然后显示 Toll: 6。接着按“检查”。
亲手试试
using UnityEngine;
public class TollGate : MonoBehaviour
{
public int toll = 3;
int collected;
void OnTriggerEnter(Collision collision)
{
// 汽车需要缴纳通行费;其他物体可免费通过
}
}
物理与游戏玩法中的所有课
自己练习: Unity 在线编辑器