欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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;
}

 

 

相关标签: Unity unity