一、射线
在unity中射线是一个从初始点开始,向一个方向无限延伸的一条直线,通过这条射线可以检测所触碰到的物体,然后就可以获取到物体的相关组件,并进行进一步的操作。例如,一些射击游戏通过武器发出一条射线进行消灭敌人,或者通过射线获取位置坐标并进行移动。总之,线检测在unity中的用途还是很广泛的。
二,创建射线
创建射线的两种方法
1、在物体的中心位置发出一条指向前方的一条射线:
Ray ray = new Ray(transform.position,transform.forword);
2、从相机发出一条指向鼠标点击位置的射线:
Ray cameraRay = Camera.main.ScreenPointToRay(Input.mousePosition);
三、射线碰撞信息
函数RaycastHit可以用来存储射线碰撞到的信息
其中包括point、collider、distance、rigidbody等。
四、显示射线
显示射线的两种方法:Debug.DrawLine()和Debug.DrawRay()。
例如:
Debug.DrawLine(transform.position,hitInfo.point,Color.green);
因为射线是隐藏的,所以显示出来的射线并不是射线本身,这里的显示射线只是起到一个辅助作用方便我们观察,说白了显示射线就是我们通过射线发出的点和射线所碰撞到的点所绘制的一条直线。前提是,实现这段代码要获取射线的碰撞信息,因为要用到碰撞点的位置坐标(hitInfo.point)。
五、射线检测
射线检测(Physics.Raycast)检测一条已知射线或者新建射线的碰撞信息,它的返回值类型为bool类型,可以通if语句进行判断,从而实现其不同的功能。
例如:
Physics.Raycast(transform.position,transform.forword,out RaycastHit hitInfo);
创建一条射线进行碰撞检测,并将碰撞信息存储在hitInfo里面。
案例分析:
using UnityEngine;
public class _Ray : MonoBehaviour
{
void Update()
{
Ray ray = new Ray(transform.position, transform.forward);//创建射线
RaycastHit hitInfo;//声明hitInfo获取碰撞信息
if (Physics.Raycast(ray, out hitInfo ))//判断是否发生碰撞
{
Debug.Log(hitInfo.collider.name);//打印碰撞物体名字
Debug.Log(hitInfo.point);//打印碰撞物体坐标
Debug.Log(hitInfo.distance);//打印发出点与碰撞点的距离
Debug.DrawLine(transform.position, hitInfo.point,Color.green);//显示射线
}
}
}
运行结果:
六、射线穿透检测
射线穿透检测(Physics.RaycastAll)通过射线可以穿透多个物体进行检测,获取多个物体的碰撞信息。
例如:
RaycastHit[ ] hitInfo = Physics.RaycastAll(ray);
将射线ray穿透检测到的所由碰撞信息存储到hitInfo这个数组里面。
案例分析:
using UnityEngine;
public class _Ray : MonoBehaviour
{
void Update()
{
Ray ray = new Ray(transform.position, transform.forward);//创建射线
RaycastHit[] hitInfo;//声明数组存放碰撞信息
hitInfo = Physics.RaycastAll(ray);//将射线ray所有碰撞信息存放
foreach (RaycastHit hit in hitInfo)//打印所有碰撞物体的名字并显示射线
{
Debug.Log(hit.collider.name);
Debug.DrawLine(transform.position,hit.point,Color.green);
}
}
}
运行结果: