当Canvas的RenderMode设置为Camera模式
普通屏幕坐标转化就失效了,因为UI坐标原点变成屏幕中心.
所以需要把3D坐标转化成屏幕坐标,然后把屏幕坐标转化成本地坐标.
public class WorldPosToScreenPos : MonoBehaviour
{
//3d世界目标对象
public GameObject targetGo;
//3d摄像机
public Camera cameraMain;
//UI摄像机
public Camera CameraUI;
public Image img;
private void Update()
{
Vector3 targetPos = targetGo.transform.position;
//求出屏幕坐标
var screenPos = RectTransformUtility.WorldToScreenPoint(cameraMain, targetPos);
//将屏幕坐标转化为RectTransform的本地坐标
RectTransform parentRectTransform = img.transform.parent.GetComponent<RectTransform>();
RectTransformUtility.ScreenPointToLocalPointInRectangle(parentRectTransform, screenPos, CameraUI, out var localPos);
img.rectTransform.anchoredPosition = localPos;
}
}