引擎版本:UE5.6
测试设备: Iphone 14pro
在iOS平台上,当系统的“方向锁定”功能开启时,增强输入系统提供的重力数据似乎始终基于设备的物理坐标系,而没有根据屏幕渲染方向进行调整。导致当应用以横屏启动,然后用户将设备物理翻转180度时,应用界面会正确地旋转一次并锁定,但此时用于左右倾斜的输入轴会完全反转,因为输入数据没有随屏幕一起“翻转”。
[Attachment Removed]
引擎版本:UE5.6
测试设备: Iphone 14pro
在iOS平台上,当系统的“方向锁定”功能开启时,增强输入系统提供的重力数据似乎始终基于设备的物理坐标系,而没有根据屏幕渲染方向进行调整。导致当应用以横屏启动,然后用户将设备物理翻转180度时,应用界面会正确地旋转一次并锁定,但此时用于左右倾斜的输入轴会完全反转,因为输入数据没有随屏幕一起“翻转”。
[Attachment Removed]
重现步骤
复现步骤:
1. 开启 iOS 系统的 “竖排方向锁定”(从右上角下拉控制中心)。
2. 保持此状态(Home 键在右),左右倾斜手机。记录重力的原始值。
3. 此时,向屏幕左侧倾斜(面向我的右侧抬起),观察到原始 Y 轴为正值。
4. 向屏幕右侧倾斜(面向我的左侧抬起),我们观察到原始 Y 轴为负值。
5. 现在,将手机物理旋转 180 度(Home 键现在在左侧)。
6. 由于开启了锁定,App 只会翻转一次 以适应新的横屏方向,然后保持锁定。
7. 在此新方向下(Home 键在左),再次向屏幕左侧倾斜(此时是面向我的右侧抬起)。
此时观察到:
- 向屏幕左侧倾斜时,原始 Y 轴的值变为了负值。
- 向屏幕右侧倾斜时,原始 Y 轴的值变为了正值。
输入轴的值没有随着屏幕翻转而翻转,导致玩家的控制方向颠倒。
以下是直接打印了原始的的增强输入和通过PlayerController的GetInputMotionState获取的原始值,以及GetDeviceOrientation获取的设备方向。
手动测量存在误差,并且向上抬(面向我底部抬起)时可能导致旋转所以不会完全抬起。
锁定时,Home在右侧,此时打印GetDeviceOrientation是LandscapeRight
[Image Removed]
系统屏幕方向锁定时,翻转(只能翻转一次,然后就锁定了)
此时Home在左侧,此时打印GetDeviceOrientation是LandscapeRight
上倾斜 | 0,0,1 | -1.57,-1.58,0
下倾斜 | 0.01.0,-1 | -1.56,-1.61,0
左倾斜 | 0,-1,0.01 | 1.65,0.1,-1.56
右倾斜 | 0,1,0.01 | 1.1,-2.8,1.56
平放 | 1,0,0.015 | 0.015,-1.6,0
锁定时,Home在左,此时打印GetDeviceOrientation是LandscapeLeft
上倾斜 | 0.86,0,-0.5 | 0.53,0.07,0
下倾斜 | 0.03,0,1 | -1..53,0.1,0
左倾斜 | 0,1,0 | 0.3,-0.3,1.55
右倾斜 | -0.05,-1,-0.01 | 2.81,3,-1.53
平放 | 1,0,-0.01 | 0.015,0.075,0
锁定翻转,Home在右,此时打印GetDeviceOrientation是LandscapeLeft
上倾斜 | 0.78,0,0.62 | -0.67,-3.07,0
下倾斜 | 0.03,0,-1 | 1.51,-03,0
左倾斜 | 0,-1,0 | 1.5,-1.2,-1.56
右倾斜 | 0,1,0 | 2.97,0.4,1.5
平放 | 1,0,0 | 0,-3,0
不锁定的情况,Home在左,此时打印GetDeviceOrientation是LandscapeLeft
上倾斜 | 0.84,0,-0.5 | 0.56,0.01,0
下倾斜 | 0,0,1 | -1.57,0.09,0
左倾斜 | 0,1,0 | 1.6,-1.4,1.56
右倾斜 | 0,-1,0 | 1.5,1.7,-1.55
平放 | 1,0,0 | 0.01,0.03,0
不锁定的情况,Home在右,此时打印GetDeviceOrientation是LandscapeRight
上倾斜 | 0.84,0,-0.54 | -0.57,3.13,0
下倾斜 | 0.06,0,1 | 1.5,3,0
左倾斜 | 0,1,0 | 2,1,1.57
右倾斜 | 0,-1,0 | 0.7,-2.6,-1.56
平放 | 1,0,0 | 0,3,0
[Attachment Removed]
Hi,
你好,抱歉回复的比较晚,我测试了一下,主要的原因是在开启方向锁定后,收不到系统的屏幕旋转消息(IOSAppDelegate.cpp里的didRotate不会响应),这会导致计算Orientation跟实际不相符。可能要跟苹果开发者沟通一下,看看具体可能是什么愿意。
[Attachment Removed]
好的, 看起来是iOS的机制.
[Attachment Removed]