在开发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。