Menu
CoddyTech

RaycastHit

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

Physics.Raycast 还可以告诉你它击中了什么。在方向后添加 out RaycastHit hit:当该方法返回 true 时,它会将详细信息填入 hit。out 是 C# 方法通过你提供的变量返回额外值的方式。按下 Space 时,这个测距仪会记录它指向的对象以及对象有多远:

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, 50f))
        {
            Debug.Log(hit.collider.name + " is " + hit.distance + " units away");
        }
    }
}

如果它指向一面正面位于前方 12 个单位处的墙,它会记录 Wall is 12 units away。其他字段包括:hit.point 是射线触碰表面的世界坐标位置,hit.normal 是该位置表面的朝向(平地上为 (0, 1, 0)),hit.transform 是被击中对象的 Transform。通过 hit.collider.gameObject,你可以访问对象的其他信息,例如它的标签。

只在 if 内读取 hit。射线未命中时,Raycast 会返回 false,而 hit 中没有有用的信息:它的 collider 为 null。

challenge icon

挑战

中等

给枪装上激光瞄准器:在激光落点显示一个红点。

  1. 在 Update() 中,发射 Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, range)。
  2. 命中时,调用 dot.gameObject.SetActive(true); 并设置 dot.position = hit.point;。
  3. 未命中时,调用 dot.gameObject.SetActive(false);。

按下 “开始” 并转动枪:红点会沿着墙壁和木箱滑动。然后点击 “检查”。

亲手试试

using UnityEngine;

public class LaserSight : MonoBehaviour
{
    public Transform dot;
    public float range = 15f;

    void Update()
    {
        // 把光点放在激光照射到表面的位置;如果激光没有击中任何物体,就隐藏光点。
    }
}

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

自己练习: Unity 在线编辑器