首先说一下什么是摄像机,这和我们现实生活里的摄像机概念一样,只不过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; } } }