You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity是否存在Screen.width或Screen.height变化时触发的内置函数?

Unity屏幕尺寸动态变化监听的更优实现

你原本的实现逻辑是可用的,但是有三个更高效的优化方案可选:

方案1:使用Unity内置分辨率变化事件(Unity 2021.2+ 推荐)

Unity从2021.2版本开始新增了内置的Screen.onResolutionChanged静态事件,会在屏幕分辨率/尺寸发生变化时主动触发,完全不需要自己每帧做判断,是效率最高的事件驱动实现。
示例代码如下:

public class ScreenElementSizer : MonoBehaviour {
    void OnEnable() {
        // 注册事件
        Screen.onResolutionChanged += ScreenResized;
    }

    void Start() {
        // 初始化执行一次
        ScreenResized();
    }

    void OnDisable() {
        // 取消注册,避免内存泄漏
        Screen.onResolutionChanged -= ScreenResized;
    }

    private void ScreenResized() {
        // 你的自定义缩放逻辑写在这里
    }
}

方案2:全局单例监听器(兼容低版本Unity)

如果你用的Unity版本低于2021.2,没有内置的分辨率事件,可以把尺寸判断逻辑抽到全局单例里,全局只做一次每帧判断,所有需要响应的对象都订阅这个单例的事件即可,避免每个挂载脚本的对象都重复跑Update判断,对象数量多的时候性能提升明显。
全局监听器示例:

// 全局单例,只需要挂载一次到全局持久化对象上
public class ScreenResizeListener : MonoBehaviour {
    public static ScreenResizeListener Instance { get; private set; }
    public event Action OnScreenResized;
    
    private int _lastScreenWidth;
    private int _lastScreenHeight;

    void Awake() {
        if (Instance != null && Instance != this) {
            Destroy(gameObject);
            return;
        }
        Instance = this;
        DontDestroyOnLoad(gameObject);
        _lastScreenWidth = Screen.width;
        _lastScreenHeight = Screen.height;
    }

    void Update() {
        if (Screen.width != _lastScreenWidth || Screen.height != _lastScreenHeight) {
            _lastScreenWidth = Screen.width;
            _lastScreenHeight = Screen.height;
            OnScreenResized?.Invoke();
        }
    }
}

业务脚本使用方式:

public class ScreenElementSizer : MonoBehaviour {
    void OnEnable() {
        if (ScreenResizeListener.Instance != null) {
            ScreenResizeListener.Instance.OnScreenResized += ScreenResized;
        }
    }

    void Start() {
        ScreenResized();
    }

    void OnDisable() {
        if (ScreenResizeListener.Instance != null) {
            ScreenResizeListener.Instance.OnScreenResized -= ScreenResized;
        }
    }

    private void ScreenResized() {
        // 你的自定义缩放逻辑写在这里
    }
}

方案3:Canvas元素专用回调

如果你要调整的对象是Canvas下的UI元素,还可以直接用OnRectTransformDimensionsChange回调,这个是Unity内置的RectTransform尺寸变化回调,当Canvas的尺寸因为分辨率变化调整时会自动触发,不需要额外监听分辨率:

public class ScreenElementSizer : MonoBehaviour {
    void Start() {
        ScreenResized();
    }

    //  RectTransform尺寸变化时自动触发
    void OnRectTransformDimensionsChange() {
        ScreenResized();
    }

    private void ScreenResized() {
        // 你的自定义缩放逻辑写在这里
    }
}

内容的提问来源于stack exchange,提问作者mike

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 01:39:06