【Unity】【UGUI】映射3D坐标到UI上(血条、人物状态)
程序员文章站
2022-03-26 23:19:47
...
前言:
把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:
我感觉这个方法并不是性能最优,后面还以再研究怎么优化。
上一篇: Godot 3D 人物血条实现
下一篇: 3D场景角色血条/状态条