Unity3D的射线检测基本用法 以及 C#中out和ref应用


对Unity中的射线检测做一个记录

 


射线检测:

记录一下Unity中射线检测的基本用法:

        if (Input.GetMouseButtonDown(0))  //点击了鼠标左键
        {
            //以主摄像机,将屏幕上的一个点转换为射线
            Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hitInfo;  //射线对象(结构体),存储了相关信息
            //发出射线检测碰撞,返回一个布尔值(是否发生碰撞),这里的out下面会详解
            bool isCollider = Physics.Raycast(ray,out hitInfo);
            //碰到了标签是123的碰撞盒物体
            if (isCollider && hitInfo.collider.tag =="123")   
            {
                Debug.log("碰到了!");
            }
        }

只要发出的射线碰到了带有碰撞盒的物体,都会反馈回该物体的详细信息

要检测的物体一定,一定,一定要有碰撞盒!

对于多层的情况希望有检测,可以在后面加层级即可

      if (Physics.Raycast(muzzlePoint.position,
         cameraTransform.TransformDirection(Vector3.forward),
         out info, 100, layer))

100:最大距离

layer:LayerMask,希望检测的层级,可以指定多个(MIX)

2D环境下的射线检测


RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);
 if (hit.collider != null)
 {
     Debug.Log("clicked object name is ---->"+ hit.collider.gameObject);
 }       

 

 


C#中的out和ref:

out和ref其实可以理解为C++中的引用概念

ref:

没有加ref:

void add(int a) 
{ 
     a += 1; 
} 
int x= 1; 
add(x); 
Console.WriteLine(x);

输出:1

方法add并没有改变x的值

加了ref之后:

void add(ref int a)
{
    a += 1;
}
int x= 1;
add(ref x);
Console.WriteLine(x);

输出:2

方法add改变了x的值

out:

没有加out:

int x;
change(x);
void change(int a)
{
    a= 1;
}
Console.WriteLine(x);

输出:0

方法change并没有改变x的值

加了out之后:

int x; 
change(out x); 
void change(out int a)
{ 
        a= 1; 
} 
Console.WriteLine(x);

输出:1

方法change改变了x的值

区别:

  • 原理

ref:重点是把值传给调用方法

out:重点是得到调用方法的值(可以说是第二个“return”)

  • 使用

ref:使用前要注意给变量赋初值

out:无需赋初值

 


 

 

 

 

商业转载 请联系作者获得授权,非商业转载 请标明出处

发表评论