一、Physics.Raycast方法参数介绍
射线检测:从某个初始点开始,沿着特定的方向发射一条不可见且无限长的射线,通过此射线检测是否有任何模型添加了Collider碰撞器组件。一旦检测到碰撞,停止射线继续发射。
该方法高达16个重载,想一一了解可移步unity官方使用手册查看介绍
Physics-Raycast - Unity 脚本 API
二、摄像机射线和枪口射线实例演示
摄像机射线:
从摄像机处发射射线,检测到物体后绘制处摄像机到检测点的路径 显示准星位置
代码如下:
public RectTransform UI; //UI显示准星
private Ray ray;
private RaycastHit hit;
public LayerMask mask;
void Update()
{
//从摄像机处发射射线 形成射线
//ray=Camera.main.ScreenPointToRay(Input.mousePosition);
//if (Physics.Raycast(ray, out hit,100,mask))
//{
// UI.gameObject.SetActive(true);
// UI.position=Input.mousePosition;
// Debug.DrawLine(transform.position, transform.forward,Color.red);
//}
//else
//{
// UI.gameObject.SetActive(false);
//}
}
枪口射线:
从枪口处发射射线,若碰到物体,显示从枪口到碰撞物体检测点的路径,显示准星位置
代码如下:
public RectTransform UI; //UI显示准星
private Ray ray;
private RaycastHit hit;
public LayerMask mask;
public Transform gunPos; //枪口位置
void Update()
{
//枪口形成射线 准星效果
//起始位置 方向
if (Physics.Raycast(gunPos.position,gunPos.forward,out hit,100,mask.value))
{
//将检测点位置转换为屏幕坐标 以便保证准星位置
Vector3 UIposition= Camera.main.WorldToScreenPoint(hit.point);
UI.position = UIposition;
UI.gameObject.SetActive(true);
Debug.DrawLine(gunPos.position, hit.point,Color.red);
}
else
{
UI.gameObject.SetActive(false) ;
}
}
RaycastAll介绍:
private void Update()
{
hit = Physics.RaycastAll(transform.position, transform.forward, 10);
if(Input.GetKey(KeyCode.Space))
{
for (int i = 0; i < hit.Length; i++)
{
hit[i].transform.GetComponent<Renderer>().material.color = Color.red;
Debug.DrawLine(transform.position, hit[i].transform.position,Color.blue);
}
}
}
三、Physics.OverlapSphere
Collider[] 返回一个数组,其中包含与球体接触或位于球体内部的所有碰撞体。
示例:返回指定半径范围内检测到的物体 可使用LayMask区别层级
public Collider[] colliders;
private void Update()
{
colliders = Physics.OverlapSphere(transform.position, 10); //返回值
if (Input.GetKey(KeyCode.Space))
{
for (int i = 0; i < colliders.Length; i++)
{
colliders[i].GetComponent<Renderer>().material.color = Color.blue;
}
}
四、Physics.SphereCast
与 Physics.SphereCast 类似,但该函数将返回球体扫描相交的所有命中对象。
向场景中的所有碰撞体投射球体,并返回有关命中的每个碰撞体的详细信息。包含本身