unity 1 - 鼠标坐标转化为被放置物体表面的全局3D坐标
标题可能取的不是很好,代码的主要功能就是通过射线和碰撞功能,通过鼠标在屏幕上移动,获得被指物体那一点的全局坐标
1.源代码
先上代码
public class 坐标转化测试 : MonoBehaviour {
[SerializeField] private Camera mainCamera;
[SerializeField] private LayerMask layerMask;
private void Update() {
Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition);
if(Physics.Raycast(ray, out RaycastHit raycastHit,float.MaxValue,layerMask)) {
transform.position = raycastHit.point;
}
}
}
2.脚本使用方法
脚本中包含一个update方法,将脚本放到需要移动的物体上
并且要给两个参数赋值,第一个是场景中的相机,第二个是一个层次(随便设一个就好)然后将需要触发的物体放到这个层次下就好啦。
但是有一点需要注意,就是放置了该脚本的对象在脚本存活期间,最好不要启用碰撞器,因为这个方法就是通过碰撞器触发的,如果本身开启触发器之后,当鼠标在自己上时就会出现问题(小伙伴可以试一下)
当然也还有其他解决方法,那就是在改变自身坐标的时候,将其中一个维度写死(一般是高度)这样只会在水平面上平移
3.脚本注意点
这次提供的脚本是只能在layer Mask下进行触发,并且一定需要碰撞器,没有碰撞器的物体是无法触发的。
4.脚本讲解
4.1 ScreenPointToRay方法
这里可能需要一点想象力,先放上一个官网的链接。想象一下,这个空间中的相机,当项目运行的时候屏幕上的东西是在屏幕内部的,相机是在屏幕外部的,而鼠标就是在屏幕之上,这样的一个三层关系。注意这个参数是屏幕上的一个点(可以认为是忽略z坐标的(不确定源码更改z是否具有影响,但是z最好还是给0比较好))
该方法返回的是一条光线,俗话说两点确定一条线,相机已经确定了,鼠标也是确定的,那么这条线自然也就确定了
上面讲的鼠标值得是我传入的参数是一个鼠标的坐标。
4.2 Input.mousePosition坐标
依照game窗口左下角为基准(0,0),返回一个三位坐标,但是其中的z坐标一定是0,所以其实返回的是一个二维的坐标。
4.3 Physics.Raycast方法
ray就是刚刚得到的光线,MaxValue用于指定射线检查的最大距离,layerMask层遮罩,用于在投射射线时有选择地忽略碰撞体
raycastHit类4.4中讲解
4.4 RaycastHit
用于从射线投射获取信息的结构。如果方法返回 true,则 hitInfo 将包含有关最近的碰撞体的命中位置的更多信息。
其参数中目前最有用的就是point参数,可以知道命中的全局坐标
4.5 out关键字
这边还是讲一下out关键字,其实是个语法糖,简化了一个方法需要多个返回值的情况,和数据库的存储过程类似,不用专门为返回值创建一个返回值的类
在方法定义的时候使用out关键字(相当于声明了)并且在方法结束返回,调用方法的时候使用out就是表示你声明了相同的关键字,并且调用完给你赋值
5.其他使用方法
代码中使用的Physics.Raycast方法具有多种不同的重载方法,可以省略后方的float.MaxValue,layerMask 两个参数,这样方法会检测所有的物体碰撞,被挂载脚本的物体将永远在最上面。
|