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
相关产品推荐
相关产品推荐

