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。
挑战
中等给枪装上激光瞄准器:在激光落点显示一个红点。
- 在
Update()中,发射Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, range)。 - 命中时,调用
dot.gameObject.SetActive(true);并设置dot.position = hit.point;。 - 未命中时,调用
dot.gameObject.SetActive(false);。
按下 “开始” 并转动枪:红点会沿着墙壁和木箱滑动。然后点击 “检查”。
亲手试试
using UnityEngine;
public class LaserSight : MonoBehaviour
{
public Transform dot;
public float range = 15f;
void Update()
{
// 把光点放在激光照射到表面的位置;如果激光没有击中任何物体,就隐藏光点。
}
}
物理与游戏玩法中的所有课
自己练习: Unity 在线编辑器