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 视图中绘制这条射线。
挑战
中等让商店的门在有人站在传感器下方时打开。
- 在
Update()中,测试Physics.Raycast(transform.position, Vector3.down, reach):发射一条垂直向下、长度为reach个单位的射线,并让它停在地面上方。 - 条件为真时,调用
door.SetActive(false);;在else中,调用door.SetActive(true);。
按“开始”,然后让访客走到传感器下方:门会打开,并在访客经过后关上。然后点击“检查”。
亲手试试
using UnityEngine;
public class DoorSensor : MonoBehaviour
{
public GameObject door;
public float reach = 3f;
void Update()
{
// 当 Sensor 向下发出的射线碰到物体时,打开门。
}
}
物理与游戏玩法中的所有课
自己练习: Unity 在线编辑器