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

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

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;//不需要 制为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的位置是以相机的世界单位来衡量的。

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

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

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

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

ViewPortSpace(视口坐标):

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

GUI坐标

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

NGUI坐标

其实没有什么NGUI坐标

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

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

完结!