Unity中Screen.orientation动态切横竖屏UI位置不生效 重启游戏才正常
问题根因与修复方案
根因分析
你遇到的实时切换方向UI不生效、重启后生效的问题,本质是两个原因共同导致的:
- 代码执行顺序错误:切换方向的回调中,你先执行了UI布局调整方法,再修改屏幕方向。
- 屏幕旋转的异步特性:Unity中
Screen.orientation的修改是异步操作,不会立即完成,需要等待1~3帧才会完成屏幕尺寸更新、Canvas重排等操作。
你在实时切换时,布局调整是基于切换前的屏幕尺寸执行的,等后续屏幕旋转完成、Canvas重排后,之前设置的固定坐标就会被覆盖,所以布局异常。而重启时,启动阶段就已经设置好了目标方向,等Start方法执行布局调整时,屏幕尺寸已经是正确的目标状态,所以布局符合预期。
修复方案
调整切换逻辑,等待屏幕旋转完成后再执行UI布局调整即可,修改后代码如下:
首先把原有的两个Toggle点击回调替换为协程逻辑,等待旋转完成后再调用布局方法:
// 替换原有PortraitToggleSelected、LandscapeToggleSelected方法 public void PortraitToggleSelected() { PlayerPrefs.SetInt("OrientationOptionToggle", 0); StartCoroutine(DoOrientationChange(ScreenOrientation.Portrait, PortraitSetUp)); } public void LandscapeToggleSelected() { PlayerPrefs.SetInt("OrientationOptionToggle", 1); StartCoroutine(DoOrientationChange(ScreenOrientation.Landscape, LandScapeSetUp)); } // 新增异步旋转+布局更新的协程 private IEnumerator DoOrientationChange(ScreenOrientation targetOri, System.Action layoutAction) { // 先设置目标旋转方向 Screen.orientation = targetOri; // 等待旋转完成 yield return new WaitUntil(() => Screen.orientation == targetOri); // 额外等待一帧,确保Canvas的尺寸、锚点全部更新完毕 yield return null; // 最后执行UI布局调整 layoutAction?.Invoke(); }
额外优化建议
你当前使用固定数值设置anchoredPosition的方案仅适合单一分辨率设备,建议后续将UI改为基于锚点的相对定位,可适配不同尺寸、分辨率的设备,避免后续出现适配问题。
内容的提问来源于stack exchange,提问作者Chethan Venkataramaiah
相关产品推荐
相关产品推荐

