2d游戏可以使用平行投影的camera,这种camera需要设置size (orthographicSize),size的含义为屏幕高度的一半,不过单位不是像素而是unit坐标,即通过pixels to units换算的坐标。例如:屏幕高度为640,pixels to units为100的情况下,orthographic size为640/2/100 = 3.2 
 

unit坐标我理解就是一个统一化的坐标,不用担心他的实际含义,只是提供一个统一的坐标给游戏各个组成部分使用。相应的sprite的尺寸也可通过pixels to units换算成unit 坐标,并且每个sprite都可以单独设置,这等于给资源多加了一个调整的参数。 

 

(说到这里其实就涉及到了另外一个问题:屏幕多分辨率适配,简单的说来,固定高度:即size的值固定下来,然后动态的去调整宽度值,然后根据宽度值来适配各种UI元素;固定宽度:即根据宽度值,动态算出高度值,然后设置size)

 

设置camrea的size实际上控制了显示区域的大小,size越大,能看到的世界越大,当然世界里面的sprite会相应缩小,因为实际的屏幕就那么大。

相机为Orthographic模式,其camera size为5.57,是什么含义呢,经过测量,发现视图中视截体的高度是5.57x2。

泰课在线

那么视截体的宽度怎么决定呢?

做下面试验,前面屏幕尺寸选的是Web(600x900),所以 视截体宽度=视截体长度/900*600=7.426。经测量,这个值是对的。

另外,如果调整Viewport Rect的W和H,也会影响视截体形状,但只要H不取0,视截体高度就永远等于2xsize值(5.57x2),所以有意义的只是W和H的比值。

 

于是可以总结:

在Orthographic模式下,视截体尺寸可如下计算:

视截体高度= camera.size

视截体宽度= 视截体高度*(screenWidth/screenHeight)*(camera.viewportRect.W/camera.viewportRect.H)

用于计算camera的unit单位尺寸的代码: 
var camera = camera_obj.GetComponent (); 
float orthographicSize = camera.orthographicSize; 
float aspectRatio = Screen.width * 1.0f / Screen.height;

    float cameraHeight = orthographicSize * 2;
    float cameraWidth = cameraHeight * aspectRatio;
    Debug.Log ("camera size in unit=" + cameraWidth + "," + cameraHeight);

获取sprite unit单位尺寸的代码: 
Vector2 spriteSize = sprite_obj.GetComponent ().sprite.bounds.size;