unity 射线特性测试

  • Post category:C#

 

 

上面方块分别添加

绿色 BoxCollider2D Rigidbody2D

黑色 BoxCollider Rigidbody

黄色 Rigidbody2D

蓝色 无

红色 BoxCollider2D

然后我们通过以下代码设置一条2d射线用来测试

private LineRenderer line;
Vector3 mousePos = Input.mousePosition;
Vector3 screenToWorld = Camera.main.ScreenToWorldPoint(new Vector3(mousePos.x, mousePos.y, -Camera.main.transform.position.z));
Ray2D ray = new Ray2D(screenToWorld, Vector2.up);
Debug.DrawRay(ray.origin, ray.direction, Color.blue, 1.0f);
RaycastHit2D info = Physics2D.Raycast(ray.origin, ray.direction, 0.1f);

if (info.collider != null)//如果发生了碰撞
    {
     GameObject obj = info.collider.gameObject;
     Debug.Log(obj.name);

    }

结果是只有绿色和红色可以接收到碰撞

然后我们重新写一段3d射线用来新的测试

Vector3 mousePos = Input.mousePosition;
Vector3 screenToWorld = Camera.main.ScreenToWorldPoint(new Vector3(mousePos.x, mousePos.y, -Camera.main.transform.position.z - 0.5f));
RaycastHit hit;
Ray ray = new Ray(screenToWorld, Vector3.forward);
Debug.DrawRay(ray.origin, ray.direction, Color.blue, 1.0f);

if (Physics.Raycast(ray, out hit))
{
      Debug.Log(hit.collider.gameObject.name);
}

结果只有黑色可以检测到

 

特性1:2d射线只能检测2d碰撞体,同样3d射线只能检测3d碰撞体,射线只能对有对应有碰撞体的对象产生反馈

 

 

把复制一个3d黑色方块把z轴减小1个单位,然后把原3d黑色方块放大2.5倍,使得小方块在后方

将绿色的2d方块放大2倍置于红色2d方块之上

重复上面的射线操作

 

小的黑色方块无法被检测到, 红色方块无法被检测到

 

然后我们给大小黑色方块,绿色红色方块分别添加mask 8, 9

// 2d部分
RaycastHit2D info = Physics2D.Raycast(ray.origin, ray.direction, 0.1f, 1<<9);

// 3d部分
if (Physics.Raycast(ray, out hit, 10f, 1<<9))

 

再去重复上面的动作,小的黑色方块可以被检测到,红色方块也可以被检测到

 

如果不设置长度,那么射线是一条可以无限延长,任意穿透的线,在不设置指定图层的情况下,只对离得最近的碰撞体优先反馈,当设置mask情况下,对指定mask的图层进行反馈

 

 

有时候2d游戏可能需要针对鼠标进行检测,必然道具,或者人物,这个时候如果用3d射线指向外进行2d检测是无法进行检测的

因此,唯一办法是随时给鼠标一个做的非常短比如0.05f的检测射线,然后指向上,来替代,之后再通过mask来判断需要检测的范围,ui还是物体,还是其他对象