UI跟随实现原理
1)通过NGUITools中的FindCameraForLayer(layer) 渲染跟随目标的摄像机。以及渲染当前UI的摄像机。
//这里是通过物体的层获得相应层上的相机
worldcamera = NGUITools.FindCameraForLayer(TargetObject.layer);
//通过脚本所在物体的层获得相应层上的相机
uiCamera = NGUITools.FindCameraForLayer(this.gameObject.layer);
- 1
- 2
- 3
- 4
2)使用目标渲染摄像机,将目标对象在世界中的坐标,转化到摄像机视窗坐标.
Vector3 pos = worldcamera.WorldToViewportPoint(target.position);
- 1
3)使用UI摄像机将视窗坐标转换到屏幕坐标,并将z轴设定为0
Vector3 targetPos = uiCamera.ViewportToWorldPoint(pos);
targetPos.z=0;
this.transform.position=targetPos;
- 1
- 2
- 3
案例实现UI跟随游戏对象
使Label始终跟随Cube对象,通过offset调整UI与游戏对象的具体偏移量,具体实现如下:
FollowUI.cs
using UnityEngine;
using System.Collections;
public class FolowUI : MonoBehaviour {
public GameObject TargetObject; //目标物体。这里是指Cube
public Camera worldcamera; //世界相机。
public Camera guiCamera; //UI相机
public Vector3 offset=new Vector3(0,1,0) //相对于游戏对象的世界为之偏移量
// Use this for initialization
void Start()
{
worldcamera = NGUITools.FindCameraForLayer(TargetObject.layer); //这里是通过物体的层获得相应层上的相机
guiCamera = NGUITools.FindCameraForLayer(this.gameObject.layer); //通过脚本所在物体的层获得相应层上的相机
}
void LateUpdate()
{
//将世界坐标转换为摄像机视窗坐标
Vector3 pos = worldcamera.WorldToViewportPoint(TargetObject.transform.position+offset);
//将屏幕坐标转换为UI的世界坐标
pos = guiCamera.ViewportToWorldPoint(pos);
//由于NGUI 2D界面的Z轴都为0,这里我们将坐标修改为0.只取其X,Y坐标。
pos.z = 0;
//将修改过的坐标赋给UI界面。
transform.position = pos;
}
}