NGUI 屏幕分辨率自适应 最终版

2015年03月13日 16:18 0 点赞 0 评论 更新于 2025-11-21 16:59

一、使用前提与方法

NGUI 版本必须是 3.x。要实现屏幕分辨率自适应,只需将 UIScreenAdaptive.cs 脚本添加到 UIRoot 即可,该方案适用于各种分辨率。

二、代码实现

以下是 UIScreenAdaptive.cs 脚本的详细代码:

using UnityEngine;

namespace Com.Xyz.UI
{
[ExecuteInEditMode]
[RequireComponent(typeof(UIRoot))]
public class UIScreenAdaptive : MonoBehaviour
{
// 默认宽高比的宽度
public int aspectRatioWidth = 1280;
// 默认宽高比的高度
public int aspectRatioHeight = 720;
// 是否只运行一次
public bool runOnlyOnce = false;
// UIRoot 组件引用
private UIRoot mRoot;
// 标记是否已经开始
private bool mStarted = false;

/// <summary>
/// 唤醒时注册屏幕大小改变事件
/// </summary>
private void Awake()
{
UICamera.onScreenResize += OnScreenResize;
}

/// <summary>
/// 销毁时注销屏幕大小改变事件
/// </summary>
private void OnDestroy()
{
UICamera.onScreenResize -= OnScreenResize;
}

/// <summary>
/// 开始时初始化 UIRoot 并更新一次
/// </summary>
private void Start()
{
// 查找 UIRoot 组件
mRoot = NGUITools.FindInParents<UIRoot>(this.gameObject);
// 设置缩放样式为固定大小
mRoot.scalingStyle = UIRoot.Scaling.FixedSize;
// 调用更新方法
this.Update();
// 标记为已开始
mStarted = true;
}

/// <summary>
/// 屏幕大小改变时的回调
/// </summary>
private void OnScreenResize()
{
if (mStarted && runOnlyOnce)
{
this.Update();
}
}

/// <summary>
/// 更新方法,根据宽高比调整 UIRoot 的手动高度
/// </summary>
private void Update()
{
// 计算默认宽高比
float defaultAspectRatio = aspectRatioWidth * 1f / aspectRatioHeight;
// 计算当前屏幕宽高比
float currentAspectRatio = Screen.width * 1f / Screen.height;

if (defaultAspectRatio > currentAspectRatio)
{
// 如果默认宽高比大于当前宽高比,计算水平手动高度
int horizontalManualHeight = Mathf.FloorToInt(aspectRatioWidth / currentAspectRatio);
mRoot.manualHeight = horizontalManualHeight;
}
else
{
// 否则使用默认高度
mRoot.manualHeight = aspectRatioHeight;
}

if (runOnlyOnce && Application.isPlaying)
{
// 如果只运行一次且游戏正在运行,禁用该脚本
this.enabled = false;
}
}
}
}

代码解释

  1. 成员变量

    • aspectRatioWidthaspectRatioHeight:用于定义默认的宽高比,可根据实际需求进行调整。
    • runOnlyOnce:控制脚本是否只运行一次。
    • mRoot:存储 UIRoot 组件的引用。
    • mStarted:标记脚本是否已经开始运行。
  2. 方法

    • Awake():在脚本实例被唤醒时调用,注册屏幕大小改变事件。
    • OnDestroy():在脚本实例被销毁时调用,注销屏幕大小改变事件。
    • Start():在脚本实例开始时调用,初始化 UIRoot 并调用一次 Update() 方法。
    • OnScreenResize():屏幕大小改变时的回调函数,根据条件调用 Update() 方法。
    • Update():核心方法,计算默认宽高比和当前屏幕宽高比,根据比较结果调整 UIRoot 的手动高度。如果 runOnlyOncetrue 且游戏正在运行,则禁用该脚本。

通过以上步骤和代码,就可以实现 NGUI 在不同屏幕分辨率下的自适应。

作者信息

boke

boke

共发布了 3994 篇文章