重回unity(一)适应屏幕分辨率

在我考研复习一年果断没有考试之后,我果断回到了unity的怀抱,第一篇回顾我们来聊一聊unity在安卓游戏开发中如何适应屏幕分辨率。。。

1.如果是UI的话,UGUI适应屏幕分辨率只需要调锚点就好了,不再详细赘述。

2.如果用SpriteRenderer,情况就比较复杂,我们拿下面一个小例子来说明:

我们在做一个涂鸦跳跳开始界面,使用BGCamera来渲染背景图片,使用Main Camera来渲染除背景以外的其他东西,并且两个相机都调为正交模式,BGCamera的Size调为适当大小,保证背景图片不会穿帮(不会露出天空盒),并且让platform(开始界面的地面)调为适应9:16的分辨率,如下图:重回unity(一)适应屏幕分辨率

 

此时,问题来了,如果我们分辨率不是9:16,而是10:16,应该怎么办???我们先换一个10:16的分辨率看下效果

重回unity(一)适应屏幕分辨率

很明显,platform的宽度已经无法适应屏幕宽度了,你可能会说:我可以手动改啊。那么我想问你:如果是6:16,7:16你又想怎么办呢?明显我们需要一个公式来动态调整这个地面的宽度。

公式很简单,假设相机的size为cameraSize,背景图片(注意:这里是背景图片,不是platform)的宽度为y(GetComponent<SpriteRenderer>().bounds.size.x可以获取图片宽度,也可以用图片实际宽度除以一个单位长度所包含的像素数),屏幕分辨率为screen.width/screen.height,那么公式为cameraSize*2/y = screen.height/screen.width,意思就是相机的范围刚好包裹整个背景图片时,应该满足相机大小的两倍比背景图片的宽等于屏幕分辨率对应的比例(这里的scale全部设置为1)

这是背景图片,那么platform也是同样的道理,因为platform的长刚好也是屏幕的宽,也是背景图片的宽,所以说cameraSize*2/x = screen.height/screen.width,这里是长,所以我用x表示。那么,移项后便得到x = 2*cameraSize*screen.width/screen.height,这样便得到了在当前分辨率下platform的长应该满足的公式,即,将platform的长设置为这样就能让platform适应屏幕,具体的我们可以设置scale,即获取platform当前的x和在这种分辨率下应该的x,得到一个比率,当前的scalex乘这个比例就好了

思路是这样,代码如下:

void Resize()
    {
        float width = GetComponent<SpriteRenderer>().bounds.size.x;
        float targetWidth = Camera.main.orthographicSize * 2 /Screen.height * Screen.width;
        Vector3 scale = transform.localScale;
        scale.x = targetWidth / width;
        transform.localScale = scale;
    }

将这段代码放到Start方法中并将脚本挂在platform上,即可适应分辨率了

重回unity(一)适应屏幕分辨率