背景
      我们都知道,最初是作为3d游戏引擎而设计的,在4.3版本后才推出的UGUI和Sprite来实现2d游戏设计。在UGUI中使用的屏幕坐标系(以像素单位),但是在中依然使用的是3d坐标系中的(Unit浮点单位),在导入Texture2d时可以做像素到单位(unit)的转换设置。而世界坐标系坐标原点是屏幕中心点,照成了实际开发中大量的世界坐标到屏幕坐标的转换操作。这也是我写这篇文章的初衷,因为这个问题一直困扰着我,有时候都有了抓狂的赶脚。
      还有一个问题Unity系统使用中心点作为默认坐标系的原点,这样在逻辑坐标(以地图为参照物)中物体移动时,无形中增加了转换的难度。对于本人来说,最理想的方式是采用我们习惯使用Window坐标体系,至少完成世界坐标、屏幕坐标及逻辑坐标(游戏地图)的原点对齐以及世界坐标单位和屏幕坐标单位像素1:1对应,文字总是很晦涩,我们还是使用几张图片来说明问题吧!
传统windows的坐标系,左上角坐标原点,x轴正方向向右,y轴正方向向下

泰课在线
Unity中的坐标系,也就是世界坐标,原点是屏幕中心点,方向是x轴正方向向右,y轴正方向向上
泰课在线
   默认情况下,世界坐标和屏幕坐以屏幕中心为坐标系原点。导入的纹理图片默认也以图片中心点为原点,而不是我们习惯的左上角或者左下角逻辑原点。举个例子,很直观的就是在左下角区域,以中心点作为坐标原点,这个区域就是负值。这就和我们熟知的逻辑坐标有了一个差值,我们在做逻辑坐标与世界坐标或者屏幕坐标转换的时候,就需要考虑这个差值。
实现
      我们知道屏幕显示的大小是由摄像机的尺寸和分辨率来决定的,其中 摄像机的尺寸,是由属性面板中的size属性来确定,实际上它的值是可视区域的高度的一半而单位是unit。很多屏幕自适应程序的教程,也是应用这个原理来设计,这方面的文章和帖子已经很多了,我就不详细阐述了
我们要实现的最终效果,其实很简单平移下unity的世界坐标就可以了,具体的操作其实是平移相机,如下图所示  

实际上要实现世界坐标和逻辑坐标的一一对应,我们只需要通过两个步骤,
一,世界坐标、屏幕坐标、逻辑坐标的单位统一;
二,设置世界坐标和逻辑坐标的原点相同(也就是(0,0)点相同)。
     首先我们设置纹理也就是,图片Size单位,默认值是每100像素为一个单位,也就是在Unity3d中100个像素,对应一个Unity3d 的Unit单位,我们将这个值修改为,每一像素对应一单位,具体如下图所示,

设置完成后我们导入工程中的图片或者叫做纹理,就是以像素为单位的,简单的说,也就是如果一个300×400像素的图片,它的宽和高也就是300×400单位(unit)了。
     接下来我们设置合理的摄像机尺寸,按照前参考文章中提到的屏幕自适应技术,我们选择一个固定的像素尺寸,这里我选择800×600。由于前面我已经将所有导入工程中的图片单位设置为一像素对应一单位(Unity),这样我们设置摄像机的尺寸Size,必须将该值设置为可视区域分辨率高的一半,也就是300单位,至此,我们完成了第一项关于世界坐标系和逻辑坐标系的单位统一。
      我们知道默认的世界坐标系和屏幕坐标系是以屏幕的中心为坐标系原点了的,逻辑坐标原点也采用图片的中心点作为原点这不太符合2d程序开发的习惯,这里需要统一下坐标原点,Unity3d世界坐标系,x轴 和y轴的方向分别是向右向上,可以假象屏幕的左下角为原点(而传统的Windos GUI,x轴和y轴的方向是向右向下,假象屏幕的左上角点,)首先我们设置导入工程中的所有2d纹理的,坐标点或者叫中心点,置为左下角(BottomLeft)点,接下来我们,做一下相机的平移,我们将相机像左平移四百单位,向上平移三百单位,这样就完成啦世界坐标和逻辑坐标的原点统一,具体看下面两张图比较清楚。
第一步,将2d纹理的中心点设置在左下角点看到的现象
泰课在线
第二步,平移相机实现世界坐标和逻辑坐标(屏幕坐标)的重合
泰课在线
相机的设置
泰课在线

最后
本篇是Unity3d坐标系系统的综合应用,同时也是一块试金石,考验你是否真正掌握了Unity3d坐标系系统,不知道你怎么样?反正我是学会了。

泰课在线