Unity 坐标 转换 详解 World世界坐标 Screen屏幕坐标 View视口坐标 GUI坐标 NGUI坐标 localPosition相对父级坐标

在制作游戏中我们经常会遇到这样一个需求

在人物模型的上面显示 名字、称号 一类的文字或者图片 如下图

Unity 坐标 转换 详解  World世界坐标 Screen屏幕坐标 View视口坐标 GUI坐标 NGUI坐标 localPosition相对父级坐标

人物模型属于是Camera1  

UI Title信息属于NGUI Camera2

如下图

Unity 坐标 转换 详解  World世界坐标 Screen屏幕坐标 View视口坐标 GUI坐标 NGUI坐标 localPosition相对父级坐标

这时候我们就要用到坐标转换了 确定UI Title 的世界坐标

代码如下:

Transform charater = null;//角色Transform
Transform TitleLabel = null;//Title Label Transform Camera camera1 = Camera.main;//照射模型Camera
Camera camera2 = UICamera.currentCamera;//NGUI Camera Vector3 pos = camera1.WorldToScreenPoint(charater.position);//Camera1的世界坐标转为屏幕坐标
pos.z = ;//不需要 制为0 Vector3 pos2 = camera2.ScreenToWorldPoint(pos);//屏幕坐标转为camera2的世界坐标 TitleLabel.position = pos2;//设置TitleLabel的世界坐标

想知道为什么 我们一起来详细的了解一下Unity 坐标的知识

查看Unity圣典 TransfromCamera 组件

Transfrom 组件有如下图2个变量

Unity 坐标 转换 详解  World世界坐标 Screen屏幕坐标 View视口坐标 GUI坐标 NGUI坐标 localPosition相对父级坐标

Camera 组件有如下图6个函数

Unity 坐标 转换 详解  World世界坐标 Screen屏幕坐标 View视口坐标 GUI坐标 NGUI坐标 localPosition相对父级坐标

看完上面翻译的信息 是不是对于 世界坐标 屏幕坐标 视口坐标 不是很理解 下面我们来详细介绍一下这些坐标

WorldSpace(世界坐标):

游戏场景原点世界坐标为(0,0,0)

获取和设置代码如下:

transform.position = Vector3.zero;//设置transform的世界坐标为原点(0,0,0)

Vector3 vector3 = transform.position;//获得transform的世界坐标给vector3

ScreenSpace(屏幕坐标):

Screen Space是以像素来定义的 左下角为(0,0)   右上角为(Screen.width,Screen.height)  Z的位置是以相机的世界单位来衡量的。

例如场景分辨率1024x768,如果屏幕被缩小至100x100,那么点击右上角是100x100,而不是分辨率的1024x768。

鼠标的坐标 单个手指触摸屏幕坐标 都为屏幕坐标

Debug.Log(Input.mousePosition);//鼠标的坐标

Debug.Log(Input.GetTouch().position);//单个手指触摸屏幕坐标

ViewPortSpace(视口坐标):

视口坐标是标准的和相对于相机的。相机的左下角为(0,0)点,右上角为(1,1)点,Z的位置是以相机的世界单位来衡量的。

GUI坐标

这个坐标系与屏幕坐标系相似,不同的是该坐标系以屏幕的左上角为(0,0)点,右下角为(Screen.width,Screen.height)。

NGUI坐标

其实没有什么NGUI坐标

要设置NGUI坐标 需要获得UICamera.currentCamera来转换坐标

了解了上面的知识 相信你利用 Camera 的那6个函数 可以随便的转换坐标了。

完结!

上一篇:js深入研究之牛逼的类封装设计


下一篇:Qt Mac 下软件Release 公布dmg