一 摄像机分类
首先说一下什么是摄像机,这和我们现实生活里的摄像机概念一样,只不过Unity里的摄像机是用来拍摄游戏场景的,我们透过屏幕能够看到的游戏场景都是通过摄像机拍摄出来的,从游戏开始摄像机就在工作,把每一帧游戏画面反映到屏幕上。
Unity提供了两种摄像机类型:
- 透视摄像机
- 正交摄像机
透视摄像机主要用于3D游戏开发上,学过美术的朋友应该能更好的理解,透视嘛,越远的地方成像越小,越近的地方成像越大。而正交摄像机没有远小近大的说法,就好比一个正方体的盒子,从一面看到对面的感觉,你看到的面有多大成像就是多大。
再具体的介绍大家就看看书或者搜一下相关资源吧。因为我的目标的是2D游戏开发,所以后面的摄像机介绍都是针对正交摄像机的。
二 适应屏幕分辨率
这是一个老生常谈的问题,因为当下的游戏设备五花八门,手机游戏更甚,每一台手机的屏幕分辨率都不见得一样,那么让同一款游戏能够支持不同分辨率尺寸的设备就变得尤为重要。
解决方案很多,结合书里的介绍我给出其中一个解决思路:假定一个成像尺寸,然后在此基础上根据屏幕实际的分辨率做相应的调整。这个调整称之为正交摄像机的对焦距离调整。也即是说动态的调整Camera的尺寸来达到屏幕适配的目的。
三 脚本实现
因为要动态的对Camera的Size进行调整,所以就需要编写脚本挂到Camera组件上,在游戏启动时通过计算来重置Camera的Size值。
脚本我是用的C#编写的,实现过程如下:
- 首先需要设置摄像机单元格的像素大小,我们假定每个单元格像素100
- 设置基础的缩放比例值为1
- 以iphone5屏幕的分辨率1136*640作为基准
- 根据实际屏幕分辨率和基准缩放比例重新计算摄像机的尺寸
public class PiexelCamera : MonoBehaviour
{
// 默认单元格的像素大小
public static float pixelToUnit = 100f;
// 默认缩放比例为1
public static float scale = 1f;
// 以iphone5的屏幕尺寸作为基准的屏幕分辨
public Vector2 baseResolution = new Vector2(1136, 640);
// 在Awake方法中进行相机的初始化动作,会因为Awake方法会在实例未创建之前调用,所以系统级别设计应该都在Awake中实现
private void Awake()
{
// 通过GetComponent方法获取相机实例
var camera = GetComponent<Camera>();
// 这里做了一个多余的判断,如果是正交相机才进行适配处理
if (camera.orthographic)
{
// 根据实际的屏幕尺寸和基准的缩放比计算实际缩放比例
scale = Screen.height / baseResolution.y;
// 单元格实际像素值应该是实际缩放比例与默认单元格像素值的乘积
pixelToUnit *= scale;
// 为当前正交摄像机设置实际orthographic值
camera.orthographicSize = (Screen.height / 2) / pixelToUnit;
}
}
}