Unity中2D游戏多分辨率屏幕适配方案

一:什么是像素?

像素是由很多个小方格组成,每一个小方格上都存储了位置信息和色彩信息。像素是图像的最小单位

图像分为两类:位图和矢量图
——位图(点阵图):由多个像素组成,当放大时被分为多个色块,而且放大的位图属于失真状态。平时拍照,扫描的图片等都属于位图
——矢量图:通过数学公式计算获得的图像,无论怎样放大都不会失真,但是难以呈现色彩层次丰富的逼真图像


二:图像分辨率与屏幕分辨率

——图像分辨率:每英寸图片内有多少个像素点,单位为PPI(Pixels Per Inch)—像素每英寸。例如72ppi代表每英寸包含72个像素点
——屏幕分辨率:屏幕每行的像素点数*屏幕每列的像素点数。例如1280*720代表横向1280像素纵向720像素,其总数为1280*720=921600个像素


三:像素的作用

——为什么图像(位图)放大后会变得模糊?
例如这是一张135*145的图,左边为正常情况下的全图,右边为放大之后的局部图。明显的看出放大之后图像失真了变得模糊了。那为什么图像会变得模糊呢?
这是因为图像放大后图像分辨率变小了,也就是每英寸显示的像素点数变少,所以变得模糊了。正常情况下单位面积内可以显示所有的像素点数比如10000个,而放大后单位面积内只能显示1000个像素点数
所以不难理解单位面积内的像素点越多,图像就会越清晰越逼真
Unity中2D游戏多分辨率屏幕适配方案_第1张图片Unity中2D游戏多分辨率屏幕适配方案_第2张图片

 


——为什么分辨率越高的显示器越清晰?
例如两个显示器,A的分辨率是640*480,B的分辨率是1600*1200,那么A屏幕上能够显示的像素为640*480个,明显少于B屏幕能够显示的像素,这也就是为什么分辨率越高的屏幕越清晰
假设有两个不同尺寸大小的屏幕A和B,A的尺寸比B大,但是他们的分辨率相同,那么他们同样清晰,不存在A比B清晰


四:Unity中的单位与图片像素的关系

Unity中2D游戏多分辨率屏幕适配方案_第3张图片
在Inspector面板的图像设置中有一个Pixels Per Unit参数。它代表Unity的一个单位长度包含本图片多少个像素
在Unity中创建的Cube等基本图形默认就是一个Unity单位长度,一个单位长度在unity世界坐标中代表1米
例如默认值为100,则代表一个Unity单位包含本图片中100个像素

例如还是这张小乌龟的图片,它是135像素*145像素。
那么它占了多少个Unity单位呢?
当Pixels Per Unit为100时则图片在高度上占了145/100=1.45个Unity单位高,左图所示。
当Pixels Per Unit为50时则图片在高度上占了145/50=2.9个Unity单位高,右图所示。
将图片放到场景中查看,验证所得的结论
Unity中2D游戏多分辨率屏幕适配方案_第4张图片Unity中2D游戏多分辨率屏幕适配方案_第5张图片


五:Camera在正交模式下的Size与像素和Unity之间的关系

现在已经明白了Unity中单位与像素之间的关系,其实它与相机的视口也存在一定的关系
结论是:相机高度占的单位长度=相机的size * 2

例如当前Camera的size为3,那么屏幕高度应该占了2*3=6个Unity单位,左图所示
例如当前Camera的size为2,那么屏幕高度应该占了2*2=4个Unity单位,右图所示
在场景中查看,验证结论
Unity中2D游戏多分辨率屏幕适配方案_第6张图片Unity中2D游戏多分辨率屏幕适配方案_第7张图片
 

既然屏幕高度的单位长度/2是相机的size大小,那么屏幕宽度占的单位长度与相机size大小有什么关系呢?

例如当前Camera的size为1,左图所示,可以看出是3个多单位长度。
例如当前Camera的size为0.5,右图所示,可以看出是1个多单位长度。
很明显屏幕宽度占的单位长度与相机size大小没有关系
Unity中2D游戏多分辨率屏幕适配方案_第8张图片Unity中2D游戏多分辨率屏幕适配方案_第9张图片

既然屏幕宽度占的单位长度与相机size大小没有关系,那么屏幕宽度与什么有关系呢?

新建一个cube,因为cube的长和宽都是1个单位长度。
调整Camera的size为0.5,则在屏幕高度上应该是0.5*2=1个单位长度,也就是正好可以放下1个cube。
例如屏幕的分辨率为5:4,如左图所示。
例如屏幕的分辨率为16:9,如右图所示。
不难发现,无论怎样调整分辨率,相机显示的单位高度都不会改变,但是仔细观察两种不同分辨率下的Game窗口,天空盒占的范围不一样。
Unity中2D游戏多分辨率屏幕适配方案_第10张图片Unity中2D游戏多分辨率屏幕适配方案_第11张图片
所以得出结论:相机高度占的单位长度只由Camera的size决定,而相机宽度占的单位长度是由于分辨率不同再通过一个比例计算出来的:
Unity中2D游戏多分辨率屏幕适配方案_第12张图片
又因为相机高度占的单位长度=相机的size*2,所以总结出来一个公式
Unity中2D游戏多分辨率屏幕适配方案_第13张图片


六:为什么场景视图的Scale不是1呢

还有一个问题就是为什么在Game视图中的Scale不为1。
Unity中2D游戏多分辨率屏幕适配方案_第14张图片
Unity中2D游戏多分辨率屏幕适配方案_第15张图片
改变不同的分辨率后测试后发现不同分辨率的Game视图不但Scale不为1而且还是不同的。继续测试,当分辨率为2304*1440时(我的屏幕最大分辨率为这个),当Game窗口小时,Scale为0.256,当Game窗口大时,Scale为0.586。
Unity中2D游戏多分辨率屏幕适配方案_第16张图片
结论:因为我们的屏幕太小了,无法显示这个分辨率的画面所以只能将相机画面等比例缩放,并不影响游戏。
比如我这台电脑的分辨率为2304*1440,而我游戏场景设置的分辨率为2560*1440,那么无论场景视图放到多大Scale都不可能为1。而如果游戏场景设置的分辨率比较小时在你的Game窗口就有可能会显示不缩放的Scale比例。


七:2D游戏多分辨率屏幕适配方案(只适用于Orthographic的相机投射模式)

对于UI元素,UGUI有可视化的自适应设置功能,但对于2D游戏中的精灵图片呢?
首先明确实际游戏内容和有效游戏内容两个概率,实际游戏内容可以通过调整Camera的Size来控制,有效游戏内容指游戏中一定需要完整显示在屏幕上的内容。我们开发时会选择一个固定的分辨率进行开发,这个分辨率下的游戏内容就是有效游戏内容
例如750*1334的分辨率下进行开发,Camera的Size为5,计算出游戏有效内容宽度为5*2*750/1334=5.6,之后通过公式:相机的orthographicSize=游戏的有效内容宽度/宽高比/2

using UnityEngine;

public class GameAdaptation : MonoBehaviour
{
    [Header("Screen.width/Screen.height*2*orthographicSize")]
    [Header("游戏的有效内容宽度")]
    public float vaildWidth;

    private void Awake()
    {
        Adaptation();
    }

    /// 
    /// 适配(通常版)
    /// 
    private void Adaptation()
    {
        float aspectRatio = Screen.width * 1f / Screen.height;
        float orthographicSize = vaildWidth / aspectRatio / 2;
        GetComponent().orthographicSize = orthographicSize;
    }

    //    /// 
    //    /// 适配(比开发时使用的宽度宽时不做处理)
    //    /// 
    //    private void Adaptation()
    //    {
    //        float aspectRatio = Screen.width * 1f / Screen.height;
    //        float orthographicSize = GetComponent().orthographicSize;
    //        float cameraWidth = orthographicSize * 2 * aspectRatio;
    //        if (cameraWidth < vaildWidth)
    //        {
    //            orthographicSize = vaildWidth / aspectRatio / 2;
    //            GetComponent().orthographicSize = orthographicSize;
    //        }
    //    }
}

你可能感兴趣的:(Unity开发实战)