Unity2D的camera size
在 2D 游戏开发中,常常会使用平行投影的相机(Camera)。对于这种相机,需要设置其 size(即 orthographicSize)属性。orthographicSize 的含义是屏幕高度的一半,不过其单位并非像素,而是通过 pixels to units 换算后的单位坐标(Unit Coordinates)。
例如,当屏幕高度为 640 像素,pixels to units 为 100 时,orthographicSize 的值为 640 / 2 / 100 = 3.2。
单位坐标可以理解为一种统一化的坐标体系,开发者无需过多关注其实际的物理含义,它主要为游戏的各个组成部分提供一个统一的坐标参考。相应地,精灵(Sprite)的尺寸也可以通过 pixels to units 换算为单位坐标,并且每个精灵都能单独设置该换算比例,这为游戏资源的调整增加了一个灵活的参数。
屏幕多分辨率适配问题
这里涉及到屏幕多分辨率适配的问题,常见的适配方式有两种:
- 固定高度:将
orthographicSize的值固定下来,然后动态调整相机的宽度值,再根据宽度值来适配各种 UI 元素。 - 固定宽度:根据屏幕宽度值,动态计算出高度值,然后设置
orthographicSize。
Camera Size 对显示区域的影响
设置相机的 orthographicSize 实际上控制了相机显示区域的大小。orthographicSize 的值越大,相机能看到的游戏世界范围就越大,但由于实际屏幕大小是固定的,所以游戏世界中的精灵会相应地缩小。
当相机处于正交(Orthographic)模式时,如果 camera size 为 5.57,经过测量可知,视图中视截体(Frustum)的高度是 5.57 * 2。
视截体宽度的计算
那么视截体的宽度是如何决定的呢?我们可以通过一个试验来探究。假设前面选择的屏幕尺寸为 Web(600x900),此时视截体宽度的计算公式为:视截体宽度 = 视截体高度 / 900 600。在上述例子中,视截体宽度为 `5.57 2 / 900 * 600 = 7.426`,经测量,该计算结果是正确的。
另外,如果调整相机的 Viewport Rect 的 W 和 H 值,也会对视截体的形状产生影响。但只要 H 不为 0,视截体的高度就始终等于 2 * orthographicSize(例如 5.57 * 2),因此有意义的是 W 和 H 的比值。
总结
在正交(Orthographic)模式下,视截体尺寸的计算公式如下:
- 视截体高度 =
camera.orthographicSize * 2 - 视截体宽度 = 视截体高度 (屏幕宽度 / 屏幕高度) (相机视口矩形的宽度 / 相机视口矩形的高度)
代码示例
计算相机的单位尺寸
var camera = camera_obj.GetComponent<Camera>();
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);
获取精灵的单位尺寸
Vector2 spriteSize = sprite_obj.GetComponent<SpriteRenderer>().sprite.bounds.size;
通过以上内容,我们详细了解了 Unity 2D 中相机 orthographicSize 的含义、视截体尺寸的计算方法以及相关的代码实现,这些知识对于 2D 游戏的开发和多分辨率适配具有重要的指导意义。