射线 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
是输出参数,用于反馈射线碰撞到物体时的碰撞信息。- 其中记录了常用的组件如
collider
、transform
、rigidbody
等。通过组件我们能获取其他任意组件和碰撞到gameObject
。 point
属性表示射线碰撞到物体时的碰撞点坐标。raycastHit.transform.position
表示射线碰撞到到那个物体的物体坐标,和raycastHit.point
是不一样的。
射线的用法
使用射线的3个步骤:
- 实例化射线
- 发射射线
- 处理碰撞
具体操作见下一节Demo。
Demo
由简到难,我们准备了以下几个案例:
检测用户选中的物体
朝着选中的目标移动
之前的案例中我们做过朝着目标移动。这样我们将目标设为变量,用鼠标点击来选择要移动到的目标。
确定点击的是地形
朝着鼠标位置移动
更多参考:
- Demo 塔防游戏-盖塔