public class L15 : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
//射线检测
//鼠标选择场景上的某一物体
//FPS射击游戏(无弹道,不产生实际的子弹进行移动)
//射线对象
//3D世界中的射线
//假设有一条起点坐标为(1,0,0),方向为直接坐标Z轴正方向的射线
//参数一 起点
//参数二 方向
//申明一个射线对象
Ray r = new Ray(Vector3.right,Vector3.forward);
//Ray中的参数
print(r.origin);//起点
print(r.direction);//方向
//摄像机发射出的射线
//得到一条从屏幕位置作为起点,以摄像机视角方向为方向的射线
Ray r2 = Camera.main.ScreenPointToRay(Input.mousePosition);
//射线碰撞检测函数
//射线检测也是瞬时的,执行代码时进行一次射线检测
//最原始的射线检测
Ray r3 = new Ray(Vector3.zero,Vector3.forward);
//参数一 射线
//参数二 检测的最大距离,超过这个距离不检测
//参数三 检测指定层级
//参数四 是否忽略触发器
//返回值 bool,如果碰撞到对象返回true,如果没有返回false
if(Physics.Raycast(r3, 1000,1<< LayerMask.NameToLayer("Default"), QueryTriggerInteraction.UseGlobal))
{
print("hit");
}
//有一种重载不用直接传入射线,而是传入射线的起点和方向
if (Physics.Raycast(Vector3.zero, Vector3.forward, 1000, 1 << LayerMask.NameToLayer("Default"), QueryTriggerInteraction.UseGlobal))
{
print("hit");
}
//获取相交的单个物体信息
RaycastHit hitInfo;
//RaycastHit是结构体,是值类型,Unity会通过out在函数内部处理过后得到碰撞信息返回到该参数中
if(Physics.Raycast(r3,out hitInfo,1000, 1 << LayerMask.NameToLayer("Default"), QueryTriggerInteraction.UseGlobal))
{
//碰撞器信息
print(hitInfo.collider.gameObject.name);
//碰撞到的点
print(hitInfo.point);
//法线信息
print(hitInfo.normal);
//得到碰撞到的对象的位置
print(hitInfo.transform.position);
//得到碰撞到的对象距离自己的距离
print(hitInfo.distance);
}
//获取相交的多个对象
//可以得到碰撞到的多个对象,如果没有碰撞到就是容量为0的数组
RaycastHit[] hits = Physics.RaycastAll(r3,1000,1<<LayerMask.NameToLayer("Default"),QueryTriggerInteraction.UseGlobal);
//还有一种返回值是碰撞的数量 通过out得到数据
if(Physics.RaycastNonAlloc(r3, hits, 1000, 1 << LayerMask.NameToLayer("Default"), QueryTriggerInteraction.UseGlobal)>0)
{
}
}
}