射线 Ray

什么是射线

从一个原点发出一条直线,可以用它来检测前方的碰撞。就像盲人的探路棍。

射线的作用

  • 探测前方的障碍物。
  • 从摄像机发射到屏幕上某个点的射线,用于检测屏幕上的碰撞体。

实例化射线

有两种方式来实例化射线:

  • 射线主要用来说明发射点的位置和发射的方向

    // 直接用Ray类的构造函数实例化
    // 第一个参数说明发射点的位置,第二个参数说明发射的方向。
    Ray ray = new Ray (new Vector3(0,0,0),  transform.forward);
    
  • 从摄像机发射到屏幕的射线

    // 从摄像机指向鼠标的射线
    Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
    

发射射线

  • Physics.Raycast()方法发射射线。它返回一个bool值,表示射线是否碰到障碍物。
  • Physics.Raycast()只能检测到一个碰撞。当射线检测到碰撞时就会停下来。
  • Physics.RaycastAll()会检测到射线的所有碰撞。当射线检测到一个碰撞时,不会停下来,而是继续检测。它的返回值是一个碰撞信息的数组RaycastHit[]
  • 可以使用distance 参数指定射线发射的距离。
  • 可以使用RaycastHit输出参数获取碰撞的信息。只有当Physics.Raycast()返回为true时,RaycastHit中的数据才是靠谱的。

RaycastHit

  • RaycastHit是输出参数,用于反馈射线碰撞到物体时的碰撞信息。
  • 其中记录了常用的组件如collidertransformrigidbody等。通过组件我们能获取其他任意组件和碰撞到gameObject
  • point属性表示射线碰撞到物体时的碰撞点坐标。
  • raycastHit.transform.position表示射线碰撞到到那个物体的物体坐标,和raycastHit.point是不一样的。

射线的用法

使用射线的3个步骤:

  1. 实例化射线
  2. 发射射线
  3. 处理碰撞

具体操作见下一节Demo。

Demo

由简到难,我们准备了以下几个案例:

  1. 检测用户选中的物体

  2. 朝着选中的目标移动

    之前的案例中我们做过朝着目标移动。这样我们将目标设为变量,用鼠标点击来选择要移动到的目标。

  3. 确定点击的是地形

  4. 朝着鼠标位置移动

更多参考:

  • Demo 塔防游戏-盖塔