您希望将一个UI对象(Image)跟随一个GameObject,该GameObject可以是SpriteRenderer或MeshRenderer。
换句话说,这可以描述为将世界坐标转换为UI坐标。
下面这个简单的函数将世界坐标转换为UI空间。它需要一个UI的Canvas
作为参数,然后是您想要转换为UI位置的位置,这在您的情况下是Player.transform.position
变量。
移动UI对象的关键是RectTransformUtility.ScreenPointToLocalPointInRectangle
函数,它将屏幕点转换为UI矩形局部点。
public Vector3 worldToUISpace(Canvas parentCanvas, Vector3 worldPos)
{
Vector3 screenPos = Camera.main.WorldToScreenPoint(worldPos);
Vector2 movePos;
RectTransformUtility.ScreenPointToLocalPointInRectangle(parentCanvas.transform as RectTransform, screenPos, parentCanvas.worldCamera, out movePos);
return parentCanvas.transform.TransformPoint(movePos);
}
使用方法:
public GameObject Player;
public Canvas canvas;
void Update()
{
transform.position = worldToUISpace(canvas, Player.transform.position);
}
现在假设你已经将UI放置到了正确的位置,现在你想让它跟随另一个对象(玩家),你需要使用上面的代码实现一个简单的偏移。这很容易。下面展示了代码应该是什么样子:
public GameObject Player;
public Canvas canvas;
Vector3 Offset = Vector3.zero;
void Start()
{
Offset = transform.position - worldToUISpace(canvas, Player.transform.position);
}
void Update()
{
transform.position = worldToUISpace(canvas, Player.transform.position) + Offset;
}
public Vector3 worldToUISpace(Canvas parentCanvas, Vector3 worldPos)
{
Vector3 screenPos = Camera.main.WorldToScreenPoint(worldPos);
Vector2 movePos;
RectTransformUtility.ScreenPointToLocalPointInRectangle(parentCanvas.transform as RectTransform, screenPos, parentCanvas.worldCamera, out movePos);
return parentCanvas.transform.TransformPoint(movePos);
}