对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:无需赋初值