Menu
CoddyTech

触发器碰撞体

本课属于 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,也就是进入区域的碰撞体。

challenge icon

挑战

简单

让无人机穿过圆环,并让每个圆环报告它。

  1. 在 Drone.cs 的 Start() 中,设置 body = gameObject.AddComponent<Rigidbody>(); 和 body.isKinematic = true;,这样它就会平稳飞行。
  2. 在 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 在线编辑器