Menu
CoddyTech

Physics.Raycast

本课属于 Coddy Unity 学习旅程的“物理与游戏玩法”单元。第 35 课,共 71 课。

射线检测会从某个点沿一个方向发出一条不可见的线,并报告是否击中了碰撞体。Physics.Raycast(origin, direction, maxDistance) 会在碰撞体位于这条线上的 maxDistance 个单位范围内时返回 true,否则返回 false。这辆车会在车头前方不到 2 个单位处有任何物体时刹车:

public float brakeDistance = 2f;

void Update()
{
    if (Physics.Raycast(transform.position, transform.forward, brakeDistance))
    {
        Debug.Log("Brake!");
    }
}

transform.forward 会随汽车转向,因此射线始终从车头向外探测;Vector3.forward 则始终沿世界坐标的 z 轴指向前方。射线从汽车中心开始,也就是汽车自身碰撞体内部。射线不会报告它起点所在的碰撞体,因此汽车不会检测到自己。省略 maxDistance 后,射线会一直延伸下去:汽车会因为地图另一头的墙而刹车。

射线检测的是碰撞体,而不是绘制出来的东西:只有 Renderer、没有碰撞体的对象对射线来说是不可见的,而触发器碰撞体也会被视为命中。在测试时,Debug.DrawRay(transform.position, transform.forward * brakeDistance, Color.red) 会在 Unity 的 Scene 视图中绘制这条射线。

challenge icon

挑战

中等

让商店的门在有人站在传感器下方时打开。

  1. 在 Update() 中,测试 Physics.Raycast(transform.position, Vector3.down, reach):发射一条垂直向下、长度为 reach 个单位的射线,并让它停在地面上方。
  2. 条件为真时,调用 door.SetActive(false);;在 else 中,调用 door.SetActive(true);。

按“开始”,然后让访客走到传感器下方:门会打开,并在访客经过后关上。然后点击“检查”。

亲手试试

using UnityEngine;

public class DoorSensor : MonoBehaviour
{
    public GameObject door;
    public float reach = 3f;

    void Update()
    {
        // 当 Sensor 向下发出的射线碰到物体时,打开门。
    }
}

物理与游戏玩法中的所有课

自己练习: Unity 在线编辑器