跟随鼠标移动

冬天吃雪糕2022年9月8日
大约 2 分钟

跟随鼠标移动

屏幕坐标与世界坐标

在 Unity 中的坐标系包括世界(World)坐标系屏幕(Screen)坐标系视口(Viewport)坐标系

世界坐标

将游戏内的游戏空间理解为"世界",世界坐标系对等于游戏空间坐标系。Unity 采用的是左手坐标系。游戏中的transform.position或者transform.rotation的信息都是基于世界坐标系。

注意

默认情况下,Unity Editor 的 Inspector 中 Transform 组件上显示 Position、Rotation 和 Scale 是本地坐标系的(transform.localPositiontransform.localRotationtransform.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

上次编辑于: 2022/9/15 07:58:15
贡献者: WingSnow