前言
在之前的文章 U3D游戏横屏显示竖屏 中,本来是按照高度优先开发的,但是遇到实际手机1080x2400 的情况,屏幕更长了,使得宽度显示窄而导致游戏场景内容被遮住了很多部分。
为此,本文记录如何解决该问题!
解决方法
1、设置Canvas Scale
设置其mode为 Expend
2、控制UI宽高优先匹配的脚本
本质逻辑就是,当发现实际的宽长比小于开发的宽长比时,切换为宽度适配优先,否则以高度适配优先。
调整的正是AspectRatioFitter的匹配模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| using UnityEngine; using UnityEngine.UI;
[RequireComponent(typeof(AspectRatioFitter))] public class AspectRatioFixer : MonoBehaviour { [Header("屏幕比例设置")] [SerializeField, Tooltip("初始设计宽高比 (宽/高)")] private float designAspect = 0.5625f;
private AspectRatioFitter _aspectFitter; private float _lastScreenAspect;
private void Awake() { _aspectFitter = GetComponent<AspectRatioFitter>(); UpdateAspectRatio(); }
private void UpdateAspectRatio() { _aspectFitter.aspectRatio = designAspect; float screenAspect = (float)Screen.width / Screen.height; if (screenAspect > designAspect) { _aspectFitter.aspectMode = AspectRatioFitter.AspectMode.HeightControlsWidth; } else { _aspectFitter.aspectMode = AspectRatioFitter.AspectMode.WidthControlsHeight; } _aspectFitter.aspectRatio = designAspect; }
private void OnRectTransformDimensionsChange() { if (_aspectFitter == null) { return; } UpdateAspectRatio(); } }
|
3、保持场景相机显示范围一致
当UI因为实际屏幕长宽比拉伸时,会让原本开发时的场景显示范围变大或变少。
因为场景画面有时候本来就是富足显示,只是我们实际操作区域是由UI来遮挡显示的。
但是这样的话,UI的改变,使得我们操作范围变化,原本边界或坐标就不正确了。
不过可以通过调节相机的距离,就能解决这个问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| private float _designAspect = 9f/16f; private float _baseOrthographicSize;
private void Awake() { 先记录原本的尺寸 _baseOrthographicSize = mainCamera. }
private void SyncSceneCamera(){ float currentAspect = (float)Screen.width / Screen.height; if (currentAspect < _designAspect) { mainCamera.orthographicSize = _baseOrthographicSize * (_designAspect / currentAspect); } else { mainCamera.orthographicSize = _baseOrthographicSize; }
}
|