在开发2D游戏的时候,不同的设备分辨率下,经常需要将背景以高或以宽来适配。如果以高适配,即背景图的高度填充整个屏幕,然后去缩放宽度。最终效果图如下

注意,我们的背景图片 Pixel Per Unit 的值保持默认的 100,如果用了其他的值,那计算时也要对应修改

首先需要调整相机的 orthographicSize 的值,使其与当前设备分辨率的 height 相匹配。建立一个脚本,就叫 CameraController 吧。这个脚本会根据屏幕分辨率,去设置相机的 orthographicSize 的值。这个脚本挂在相机上,相机的 Projection 要调成 Orthographic 模式。

using System.Collections;
using UnityEngine;

[RequireComponent(typeof(Camera))]
public class CameraController : MonoBehaviour
{
    public static Camera gameCamera
    {
        get; private set;
    }

    public static float cameraHeightSize
    {
        get; private set;
    }

    public static float cameraWidthSize
    {
        get; private set;
    }

    private void Awake()
    {
        gameCamera = gameObject.GetComponent<Camera>();
        SetCameraSize();
    }

    private void SetCameraSize()
    {
        cameraHeightSize = Screen.height / 100.0f;
        gameCamera.orthographicSize = cameraHeightSize / 2.0f;

        float aspect = (float)Screen.height / (float)Screen.width;
        cameraWidthSize = cameraHeightSize / aspect;
    }
}

确定了 orthographicSize 的值,也就是确定了相机在世界空间的可视范围,也就是能看几米高,几米宽。然后就可以调整背景了。由于图片的 Pixel Per Unit 的值是 100,也就是每100个像素,看作1米。下面是调整背景 SpriteRenderer 缩放的代码。

using UnityEngine;

public class BGController : MonoBehaviour 
{
    public SpriteRenderer bg;

    private void Start(){
        float height = bg.sprite.bounds.size.y;
        float scale = CameraController.cameraHeightSize / height;
        bg.transform.localScale = new Vector3(scale, scale, 1.0f);
    }
}

这里要注意的是,要使用 sprite 的 bounds size, 而不是用 sprite 的 texture height。