跟随鼠标移动
跟随鼠标移动
屏幕坐标与世界坐标
在 Unity 中的坐标系包括世界(World)坐标系、屏幕(Screen)坐标系和视口(Viewport)坐标系。
世界坐标
将游戏内的游戏空间理解为"世界",世界坐标系对等于游戏空间坐标系。Unity 采用的是左手坐标系。游戏中的transform.position
或者transform.rotation
的信息都是基于世界坐标系。
注意
默认情况下,Unity Editor 的 Inspector 中 Transform 组件上显示 Position、Rotation 和 Scale 是本地坐标系的(transform.localPosition
、transform.localRotation
和transform.localScale
),是根据游戏对象的父对象中心为坐标原点的,如果游戏对象没有父对象,那么本地坐标系和世界坐标系没有区别。
选中一个游戏对象后,点击左上角的 Local/Global 来切换查看世界坐标或本地坐标。
屏幕坐标
屏幕坐标是对屏幕像素(分辨率)的位置的描述,其左下角为(0,0),右上角为(Screen.width,Screen.height)。
视口坐标
视口坐标是标准化后的屏幕坐标,其左下角为(0,0),右上角为(1,1)。
世界坐标和屏幕坐标的转换
Unity 中的游戏画面始终由摄像机来提供,世界坐标和屏幕坐标的转换关系由摄像机的位置和设置决定。
Unity 提供了以下实现世界坐标和屏幕坐标相互转换的方法:
屏幕坐标转世界坐标
Vector3 ScreenToWorldPoint(Vector3 position);
最常见的用法是将鼠标的位置转换为世界坐标。我们可以使用Input.mousePosition
获得鼠标的位置(屏幕坐标),但是其z
值始终为0,所以不能直接使用,而要根据需要调整z
的值。
// 通常情况下,这不能得到想要的结果
Vector3 ScreenToWorldPoint(Input.mousePosition);
世界坐标转屏幕坐标
Vector3 WorldToScreenPoint(Vector3 position);
2D 场景鼠标位置转世界坐标
在 2D 场景下,将鼠标位置转成世界坐标比较简单,直接上代码:
Vector3 getMousePositionOnWorld() {
Vector3 mousePos2D = Input.mousePosition;
// 摄像机的 z 坐标决定在三维空间中将鼠标反向移动多远
mousePos2D.z = -Camera.main.transform.position.z;
return Camera.main.ScreenToWorldPoint(mousePos2D);
}
注意以上代码假设该 2D 场景是以世界的 X-Y 平面作为游戏场景,摄像机为正投影摄像机且没有旋转。
3D 场景鼠标位置转世界坐标
在 3D 场景下将鼠标位置转世界坐标则要复杂一些。3D 场景的摄像机是透视摄像机,屏幕坐标点 z 轴的位置对转换后世界坐标点的 x 、y 和 z 值都会有很大的影响。所以在转换之前,我们要正确地设置屏幕坐标的 z 值。
射线检测
https://www.bilibili.com/read/cv9851595