将世界物体的UI显示在世界画布上.
public Transform target;
public RectTransform ui;
public RectTransform canvasSelf;
void Update()
{
Vector3 pos = Camera.main.WorldToViewportPoint(target.position);
ui.localPosition = new Vector3(
(pos.x - 0.5f) * canvasSelf.rect.width,
(pos.y - 0.5f) * canvasSelf.rect.height,
0);
text.text = "Pos :" + pos.ToString();
text3.text = "ui :" + ui.localPosition.ToString();
text2.text = Screen.width + " X " + Screen.height + " " +
canvasSelf.rect.width + " X " + canvasSelf.rect.height;
}
target为追踪目标, ui为 目标在 canvas 上显示的 image.
使用了 Camera.main.WorldToViewportPoint 方法,所以要确保 canvas 的四角 都刚好在 摄像机 视锥的四条线上,最起码挨着.这样转换出来的 坐标,才能对的上.
如果发现仍然有偏差,就在UI上输出一下你把设备相机的FOV,我在做GearVR的时候,虽然屏幕是2K(2240*1440)分辨率但是被分成两个部分后,GearVR把每个部分的分辨率控制在了1024x1024,相机的FOV是 90,而Unity默认的相机FOV是60,这里需要注意下。