赞
踩
把3D坐标映射到UI上,这种操作多用于类似血条、人物名之类的东西:
这种其实是可以整个通用的方法来解决的:通过3D坐标直接修改UI控件的位置:
需求很明了简洁,所以直接上代码:
-
- /// <summary>
- /// 通过世界坐标设置UI的位置
- /// </summary>
- /// <param name="rectTransform"></param>
- /// <param name="worldPos"></param>
- public static void Do_SetUIPositionByWorldPos(this RectTransform rectTransform, Vector3 worldPos)
- {
- if (rectTransform == null)
- return;
-
- if (uiCamera == null)
- return;
-
- Vector3 screenPos = worldCamera.WorldToScreenPoint(worldPos);
- // Z小于0,代表在相机后面,此时X、Y反向;
- if (screenPos.z < 0)
- {
- screenPos.x *= -1;
- screenPos.y *= -1;
- }
-
- Vector3 uiWorldPos = uiCamera.ScreenToWorldPoint(screenPos);
- rectTransform.position = uiWorldPos;
- rectTransform.Do_SetLocalPosZ(0);
- }
-
- public static void Do_SetLocalPosZ(this Transform t, float z)
- {
- Vector3 localPos = t.localPosition;
- localPos.z = z;
- t.localPosition = localPos;
- }

上文中的 worldCamera 是指照3D物体的相机。
uiCamera是指照射UI的相机。
注意区分。
PS:
这个方法要放在一个静态类里,如果不明白这种写法可以去搜索C#类扩展。
PS2:
我感觉这个方法并不是性能最优,后面还以再研究怎么优化。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。