acecase 发表于 2021-4-12 15:01

Unity坐标转换

世界坐标:


场景中非子物体的transform组件的坐标。Unity中的通过transform.position获取到的坐标即为世界坐标,注意:Inspector上点击子物体显示的transform上的坐标值是局部坐标,通过transform.localposition获取。
屏幕坐标:


屏幕坐标即当前整个游戏画面分辨率为主创建的坐标系,画面左下角为原点(0,0),宽高根据分辨率而定,如分辨率为1920X1080,则宽Screen.width = 1920,Screen.height = 1080.
视口坐标:


将屏幕坐标normalized化,x值 = 1/Screen.width,y值 = 1/Screen.height。,即原点变不变依然为(0,0),宽高则为(1,1)。
UI坐标:


以UI上的RectTransform的width和height为宽高,根据锚点不同,原点也不一样。
转换:


1.屏幕转世界坐标
Vector3 Camera.main.ScreenToWorldPoint(newVector3(screenPos.x,screenPos.y,zInfo));

2.世界转屏幕坐标
Vector3 Camera.main.WorldToScreenPoint(newVector3(worldPos.x,worldPos.y,worldPos.z));

3.世界转视口坐标
Vector3 Camera.main.WorldToViewportPoint();

4.视口转世界坐标
Vector3 Camera.main.ViewportToWorldPoint(newVector3(viewPortPos.x,viewPortPos.y,zInfo));

5.视口转屏幕坐标
Vector3 Camera.main.ViewportToScreenPoint();

6.屏幕转视口坐标
Vector3 Camera.main.ScreenToViewportPoint();

7.屏幕转UI坐标:这个比较特殊,如果UI宽高和屏幕宽高一样,那么可以不用转换,直接通过屏幕坐标根据锚点赋值即可。其他情况下:
RectTransformUtility.ScreenPointToLocalPointInRectangle
(RectTransform rect,
Vector2 screenPoint,
Camera cam,
outVector2 localPoint);

rect表示该UI的父物体的组件,
screenPoint表示屏幕坐标,
cam表示当前使用的相机(如果Canvas是Screen Space-overlay模式,cam参数应为null),
localPoint则是输出的UI的局部坐标。
这个函数是根据父物体的坐标系来计算出当面屏幕坐标应该转换为的值,该值是相对父物体而言的局部坐标。
页: [1]
查看完整版本: Unity坐标转换