触发器碰撞体
本课属于 Coddy Unity 学习旅程的“物理与游戏玩法”单元。第 15 课,共 71 课。
勾选“是触发器”后,碰撞体就不再是实体:刚体会直接穿过它,Unity 会改为调用两个对象脚本上的 OnTriggerEnter,报告它们发生了重叠。终点线、拾取物和危险区域都是触发器。在代码中,这个勾选框对应碰撞体的 isTrigger 属性。
这个金库的警报区域会在游戏开始时将碰撞体切换为触发器,这与勾选该选项的效果相同。守卫走进区域时,警报就会响起:
void Start()
{
GetComponent<Collider>().isTrigger = true;
}
void OnTriggerEnter(Collider other)
{
Debug.Log("Alarm!");
}触发器遵循与碰撞相同的规则:只有两个对象中至少有一个带有 Rigidbody 时,Unity 才会检测这对对象。两个对象都没有 Rigidbody 时,它们永远不会相互报告,无论是否为触发器。守卫通过脚本巡逻,因此每个守卫都有一个运动学 Rigidbody(添加组件,选择 Rigidbody,勾选 Is Kinematic):重力和碰撞不会影响它,但它仍然算作 Rigidbody。如果守卫没有 Rigidbody,它就会穿过区域,而控制台仍然是空的。如果没有 isTrigger,该区域就是一个实体盒子;运动学刚体永远不会碰到没有 Rigidbody 的碰撞体,因此同样不会记录任何内容。这对对象中只要有一个 Rigidbody 就够了,它可以在任意一个对象上。下一课会介绍 other,也就是进入区域的碰撞体。
挑战
简单让无人机穿过圆环,并让每个圆环报告它。
- 在
Drone.cs的Start()中,设置body = gameObject.AddComponent<Rigidbody>();和body.isKinematic = true;,这样它就会平稳飞行。 - 在
Ring.cs的Start()中,设置GetComponent<Collider>().isTrigger = true;。
按下 “开始”:无人机会飞过圆环,控制台会显示 Ring1 passed、Ring2 passed 和 Ring3 passed。然后点击 “检查”。
亲手试试
using UnityEngine;
public class Ring : MonoBehaviour
{
void Start()
{
// 将这个圆环的碰撞体设为触发器
}
void OnTriggerEnter(Collider other)
{
Debug.Log(name + " passed");
}
}
物理与游戏玩法中的所有课
自己练习: Unity 在线编辑器