Unity C# 如何通过代码根据屏幕尺寸调整分辨率纵横比
Unity 根据屏幕尺寸调整游戏纵横比实现方案
问题原因
你之前调用的Screen.SetResolution仅会调整游戏运行窗口的物理分辨率,不会自动校正渲染内容的纵横比,画面拉伸是因为相机默认会将渲染画面铺满整个窗口,不会根据屏幕比例做自适应调整。
实现方案
通过修改主相机的ViewportRect属性控制渲染区域的比例,即可实现纵横比适配,还可以根据需求选择是保持游戏开发基准比例(加黑边避免内容裁剪)还是完全适配当前屏幕比例。
完整代码
public class ResolutionFixer : MonoBehaviour { // 如果你需要固定游戏的目标纵横比(比如开发时用的16:9),可以在这里赋值,不需要固定就删去这个变量 public float fixedTargetAspect = 16f / 9f; // 开启后会完全适配当前屏幕的原生纵横比,不保留固定比例 public bool adaptToScreenAspect = true; void Start() { float targetAspect; if (adaptToScreenAspect) { // 取当前屏幕的实际纵横比作为目标比例 targetAspect = (float)Screen.width / Screen.height; } else { // 用预设的固定比例 targetAspect = fixedTargetAspect; } float screenAspect = (float)Screen.width / Screen.height; float scaleFactor = screenAspect / targetAspect; Camera mainCam = GetComponent<Camera>(); Rect viewportRect = mainCam.rect; if (scaleFactor < 1f) { // 屏幕比例比目标比例窄,上下留黑边 viewportRect.width = 1f; viewportRect.height = scaleFactor; viewportRect.x = 0f; viewportRect.y = (1f - scaleFactor) / 2f; } else { // 屏幕比例比目标比例宽,左右留黑边 float widthScale = 1f / scaleFactor; viewportRect.height = 1f; viewportRect.width = widthScale; viewportRect.y = 0f; viewportRect.x = (1f - widthScale) / 2f; } mainCam.rect = viewportRect; // 全屏模式下可以加上这行确认分辨率适配,窗口模式不需要开启 // Screen.SetResolution(Screen.width, Screen.height, FullScreenMode.FullScreenWindow); } }
使用说明
- 将脚本挂载到游戏的主相机上
- 不需要固定比例就保持
adaptToScreenAspect为true即可自动适配当前屏幕尺寸 - 如果需要固定开发时的基准比例避免内容裁剪,关闭
adaptToScreenAspect,设置fixedTargetAspect为你开发时用的比例即可
UGUI适配补充
如果项目用到UGUI界面,还需要调整根画布的配置:
- 找到场景里的根Canvas对象,找到
Canvas Scaler组件 - 将UI Scale Mode设置为
Scale With Screen Size - 根据你的设计稿调整Match属性:设为0优先匹配宽度,设为1优先匹配高度,设为0.5宽高各匹配一半
内容的提问来源于stack exchange,提问作者Itay Tsuk
相关产品推荐
相关产品推荐

