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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 22:51:01