「这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战」。
作为一名优秀的开发者,对于技术的探求应该是永无止步的,如何让自己更进步,那就只有不停的学习,不停的充电.而这些都都是说起来容易做起来难,坚持才是难的地方 --蛙哈哈
2D游戏的场景是大小是固定, 不同的设备屏幕是不一样的,如果不处理镜头的适配问题,就会出现穿帮的问题.
比如:
(9:16)
(3:4)
在屏幕分辨率(9:16)下调整正确,在(3:4)下就穿帮了,所以我们需要一个适配工具来适配镜头,用于在任何分辨率下都表现正常.
先解释几个概念
-
相机
-
透视相机
是模拟人眼的相机,看东西近大远小
-
正交相机
无论距离远近,对象大小不变
a 为透视相机 b为正交相机 由于2D游戏用的都是正交相机,所以后面都主要介绍正交相机
-
-
正交相机的size
在代码中的属性为:orthographicSize
在Inspector中为:size
unity文档中的介绍:
orthographicSize 为垂直视体大小的一半。视体的水平大小取决于宽高比。
所以我们就需要在不同分辨率下,调整此值来达到适配的目的.
-
镜头和屏幕的适配
先说一些基础概念:
- 游戏的设计分辨率为: 1080*1920
- 屏幕宽高比: Aspect Ratio
- 像素单位比: Assets Pixels Pre Unit 比如设置为200 则200个像素为一个单位, 目前游戏设计为200
- 屏幕高度等于高度的实际分辨率/像素单位比 1920 / 200 = 9.6
- 设计分辨率下的 camera的 size 为: 9.6 / 2 = 4.8
- 根据高度求宽度: 摄像机宽度 = 摄像机高度 * Aspect Ratio
- 根据宽度求高度: 摄像机高度 = 摄像机宽度 / Aspect Ratio
因为此项目为竖屏游戏,所以需要基于宽来适配,也就是宽不变,高度随设备的大小改变而改变.
代码实现:
//游戏的设计分辨率为: 1080*1920 private float _referenceCameraHeight = 9.6f; //设计分别率的高, 是可以算出来的,所以就提前算好,写进去 private float _referenceCameraWidth = 5.4f; //设计分别率的宽, 是可以算出来的,所以就提前算好,写进去 private float _referenceCameraSize = 4.8f;//设计分别率的size, 是可以算出来的,所以就提前算好,写进去 private float _aspectRatio; _camera = this.GetComponent<Camera>(); _aspectRatio = (float)Screen.width / Screen.height; //宽不变,所以基于设计的相机宽度 和屏幕的宽高比 算出 屏幕的高 //摄像机高度 = 摄像机宽度 / Aspect Ratio = 摄像机宽度 * 16/9=6.4*16/9=11.38; _currentCameraHeight = 5.4f * Screen.height / Screen.width; float orthographicSize = _currentCameraHeight / 2; _camera.orthographicSize = orthographicSize;
适配之后的3:4效果就正常了!!!!