Unity中各种坐标转换

时间:2024-04-08 18:47:21

经常被Unity中各种坐标在转换搞晕同时坐标系的转换十分重要。所以做个笔记整理一下以作备忘学习。


目录

1.Unity中有四种坐标

1.世界坐标(World Space)

2.屏幕坐标(Screen Space)

3.视口坐标(Viewport Space)

4.GUI坐标

2.各种坐标转换

1.视口坐标转世界坐标——常用于获得相机视口边界的世界坐标位置

2.视口坐标转屏幕坐标

4.屏幕坐标转UI坐标


坐标系的概念是由法国数学家笛卡尔提出的。坐标系通常分为左手坐标系和右手坐标系。数学里面采用的是右手坐标系,而Unity采用的是左手坐标系。

Unity中各种坐标转换Unity中各种坐标转换



1.Unity中有四种坐标

Unity中各种坐标转换


1.世界坐标(World Space)

世界坐标很好理解,它是一个3D坐标。就是游戏物体在你创造世界中的坐标。transfrom.position就是获得该物体自身的世界坐标,也就是Inspector面板中显示的数值(如果有父物体而且父物体的坐标不为(0,0,0),则transform.localposition才是物体的自身坐标)。
 

2.屏幕坐标(Screen Space)

是最重要的,无论我们制作什么样的产品,最终都会发布到各个平台上也就是屏幕上。所以任何一个坐标系与屏幕坐标的转换都尤为重要。
屏幕坐标是以像素来定义的,也就是跟分辨率有关,例如分辨率为1280*720则Screen.width为1280,Screen.height为720。
Screen.width = Camera.main.pixelWidth和Screen.height = Camera.main.pixelHeight只有在相机视口坐标是整个屏幕时才满足。所以不难看出Screen.width是屏幕的分辨率,你设置的屏幕分辨率是多少就是多少。 而Camera.main.pixelWidth是你相机的视口像素大小,也可以理解为相机视口的像素宽度。
屏幕的左下角坐标为(0, 0),右上角为(Screen.width, Screen.height)。
我们常用的Input.mousePosition就是获得的鼠标在屏幕坐标的位置,移动端的Input.GetTouch(0).position也是获得到手指在屏幕坐标的位置。

 

3.视口坐标(Viewport Space)

视口坐标的左下角为(0,0),右上角为(1,1)。
可以用于分屏游戏制作。
Unity中各种坐标转换

 

4.GUI坐标

我几乎没有使用过Unity内置的OnGUI方法所以只用作了解。
它的原点 在左上角为(0,0),右下角坐标为(Screen.width, Screen.height), 因为这是一个二维的坐标系,所以坐标 z的值永远都为 0 。


 

2.各种坐标转换

1.视口坐标转世界坐标——常用于获得相机视口边界的世界坐标位置

Vector3 Camera.main.ViewportToWorldPoint(new Vector3(viewPortPos.x , viewPortPos.y ,-Camera.transform.position.z))

案例1:纵版飞机射击游戏(到达边界不能再移动)

Unity中各种坐标转换

Unity中各种坐标转换

案例2:达到边界后回到对面边界(贪吃蛇,涂鸦跳跃.....)

Unity中各种坐标转换

Unity中各种坐标转换

2.视口坐标转屏幕坐标

Vector3 Camera.main.ViewportToScreenPoint(new Vector3(viewPortPos.x , viewPortPos.y , -Camera.transform.position.z));
 

4.屏幕坐标转UI坐标

public static bool ScreenPointToLocalPointInRectangle(RectTransform rect, Vector2 screenPoint, Camera cam, out Vector2 localPoint)
1.若Canvas的RenderMode为Overlay时,cam参数应该为NULL。

*****2.rect必须为直接父物体