Unity中各种坐标转换

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


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

 



1.Unity中有四种坐标


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

注意transform.position不可以直接修改x,y,z的值:Unity中为什么不能对transform.position.x直接赋值?

2.屏幕坐标(Screen Space)
是最重要的,无论我们制作什么样的产品,最终都会发布到各个平台上也就是屏幕上。所以任何一个坐标系与屏幕坐标的转换都尤为重要。
屏幕坐标是一个3D坐标,是以像素来定义的,也就是跟分辨率有关,例如分辨率为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,0),相机的Z轴分量为-10,假设屏幕分辨率为1280*720,则此时原点转化为屏幕坐标后应该是(640,360,10)。
屏幕的左下角坐标为(0, 0),右上角为(Screen.width, Screen.height)。我们常用的Input.mousePosition就是获得的鼠标在屏幕坐标的位置,移动端的Input.GetTouch(0).position也是获得到手指在屏幕坐标的位置。

3.视口坐标(Viewport Space)

视口坐标是一个3D坐标,视口坐标的左下角为(0,0),右上角为(1,1)。
可以用于分屏游戏制作
例如我们将相机正对着场景(世界坐标)中的原点(0,0,0),相机的Z轴分量为-10,假设屏幕分辨率为1280*720,则此时原点转化为视口坐标后应该是(0.5,0.5,10)。

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:纵版飞机射击游戏(到达边界不能再移动)

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

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必须为直接父物体

猜你喜欢

转载自blog.csdn.net/LLLLL__/article/details/88124564
今日推荐