·射线
Ray 射线
RaycastHit 射线碰撞
RaycastMask 射线遮罩
射线1
Vector3 vStart = transform.position;
Vector3 vEnd = vStart + new Vector3(0, 0, 100);
Ray ray = new Ray(vStart, vEnd);
Debug.DrawLine(vStart, vEnd, Color.red);//画出射线
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
Debug.Log(hit.collider.name);//射线碰撞物体的名字
Debug.Log(hit.point);//射线碰撞的坐标
Debug.Log(hit.normal);//射线命中的表面的法线
Debug.Log(hit.distance);//距离
Debug.Log(hit.collider.gameObject);//获取碰撞物体
}
射线2
if (Input.GetMouseButtonDown(0))//鼠标按下时发射摄像
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))//如果发生碰撞,返回碰撞信息hit
{
Debug.DrawLine(Camera.main.transform.position, hit.point, Color.red);
Debug.Log(hit.collider.name);//射线碰撞物体的名字
}
}
射线3
Ray ray = new Ray(transform.position, transform.forward);
Debug.DrawLine(transform.position, transform.forward * 100, Color.blue);
//Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
//if (Physics.Raycast(ray, out hit, 100, ~512))//100是射线的长度
if (Physics.Raycast(ray, out hit, 100, ~(1 << 5)))//100是射线的长度
{
Debug.Log(hit.collider.name);
}
//0000000000000000000000000000011
//必须加上最大长度
//(1 << layerNumber)只检测某一层(layerNumber表示layer层的标号)
//~(1 << layerNumber)不检测某一层,其余都检测
//(1 << layerNumber)|(1 << layer2Number)只检测某2个层
射线4 射线多碰撞监测
if (Input.GetMouseButtonDown(0))
{
//射线另一种写法
Ray ray = new Ray(transform.position, transform.forward);
Debug.DrawLine(transform.position, transform.forward * 100, Color.blue);
RaycastHit[] hits;
//返回所有碰撞信息
hits = Physics.RaycastAll(ray);
增加射线碰撞距离
//hits = Physics.RaycastAll(ray,100);
增加检测层
//hits = Physics.RaycastAll(ray, 100,1<<10);
//输出所有物体碰撞信息
foreach (var item in hits)
{
Debug.Log(item.collider.name);
}
}