Unity坐标转换UI与屏幕坐标之间的转换
程序员文章站
2022-05-01 12:29:59
...
-前言-
在我们的日常开发中经常会遇到各种坐标的转换,其中可以大致分为两类。
1.将3D世界坐标转换到UI坐标中
2.UI坐标之间的转换
这一切的坐标都转换都是通过RectTransform、Camera及Unity坐标转换工具类RectTransformUtility的结合使用。
-正文-
UI坐标之间的转换
首先我们来讲讲UI坐标之间的转换,UI坐标之间的转换涉及层级,首先我们需要了解的到是RectTransform的anchoredPosition是通过父节点坐标计算出来的,熟悉2D开发的同学应该非常清楚。因此一般我们使用WorldToScreenPoint首先将坐标转换到屏幕坐标然后再通过ScreenPointToLocalPointInRectangle转换到指定RectTransform下的坐标。代码如下
public Vector2 CalPositionAt(RectTransform from, RectTransform at)
{
//1.获取UI Camera 如果只有一个相机 就是MainCamera = Camera.main
Camera uiCamera = GameObject.FindWithTag (Tag.GUICamera);
//将from转换到屏幕坐标
Vector2 V2fromInScreen = RectTransformUtility.WorldToScreenPoint (uiCamera, from.transform.position);
//将屏幕坐标转换到at的局部坐标中
Vector2 V2InAt;
RectTransformUtility.ScreenPointToLocalPointInRectangle (at, V2fromInScreen, uiCamera, out V2InAt);
return V2InAt;
}
这里唯一值得注意的是在转换时注意at是作为父节点的,转换后的坐标是相对于at的局部坐标。另外注意Camera是渲染所对应的RectTransform相机即可。
3D坐标转到UI局部坐标
其实讲了UI坐标之间的转换,3D与UI坐标的互转的方式都是一个套路,只要涉及层级、3D->2D之间类似转换都先将要转换的坐标转换到屏幕坐标,再转换到所对应的坐标系统中即可。不过还是来码下代码。
public Vector3 CalWorldPositionToLocalRect(RectTransform rect,Vector3 worldPosition)
{
//1.将3D坐标转到屏幕坐标 一般MainCamera是3D对象摄像机 如果不是获取对应摄像机
Vector2 screenPoint = Camera.main.WorldToScreenPoint (worldPosition);
Camera uiCamera = GameObject.FindWithTag (Tag.GUICamera);
Vector2 uiPosition;
RectTransformUtility.ScreenPointToLocalPointInRectangle(rect,screenPoint,uiCamera,uiPosition);
return uiPosition;
}
下一篇: java命令行生成jar包