介绍

Unity 打包的 iOS 游戏运行时无法全屏显示。不同的设备表现不同:

  • iPhone X 游戏显示在中间,两侧大量留黑,下面虚拟 Home 键留黑
  • iPad Pro 12.9 只有四周有一圈虚拟 Home 键高度的黑边

环境

  • Unity 5.3.8f1
  • macOS 10.13.6
  • Xcode 10.3

分析

问题原因

Unity 论坛上的一个贴子给出了答案,设置 Launch ScreenDefault 并同时设置 Mobile Splash Screen 就可以了。

从中可以猜测,iOS 是使用启动图片的分辨率是否与当前设备分辨率相同来决定程序是否适配当前设备。

Xcode 旧版本并不包含新型号的 iPhone iPad 分辨率的 Launch Image,导致运行时出现无法全屏的问题。

iOS 已经推荐使用 Launch Screen 代替旧的 Launch Image,原因很简单:出现了大量不同的分辨率的设备(如 iPhone X、iPad Pro 12.9 等等),而 Launch Screen 可以自动地适配不同的分辨率。

Unity 选项

Launch Screen type

Default
A launch screen that is very much like a launch image. One image is selected for portrait and landscape. The selection order: iPhone 6+ launch images, shared mobile launch image, default unity launch image for iPhone 6+. The images are displayed using aspect-fill mode.

Mobile Splash Screen

Specifies texture which should be used for iOS Splash Screen. Standard Splash Screen size is 320x480.(This is shared between Android and iOS)

“Aspect Fill” means “stretch this image up as large as it can go, cropping off any parts that don’t fit while keeping its original aspect ratio.”

从文档中可以看出,Launch Screen type 选择使用 Default 是符合项目需要的,Aspect Fill 正是将一张图片完整地撑满全屏显示出来,多余的部分裁掉。

同时也了解到只设置 Mobile Splash Screen 就可以同时处理 iOS 与 Android,图片大小为 320x480

解决方案

根据 Unity 5.3 文档描述的内容,应该设置 Mobile Splash Screen320x480 的图片(建议使用更大尺寸的相同比例图片,如 640x960,可以显示得更清晰),然后设置 Launch ScreenDefault

注意事项

Launch Screen 选项

如果使用 Image with background, relative size 在真机上运行时会出现图片所在区域显示为黑色,非图片区域显示为前景色。如果前景色不是黑色,那么在启动时中间图片区域非图片区域有明显的分界,图片 Alpha 渐变出来的效果,非常难看。

纹理导入选项

导入图片时需要设置 Texture TypeSprite (2D and UI),使用 Default 的后果是图片都被缩放到放大到比尺寸更大的 2 的幂大小上,并且宽高变成一样的,如 768x1024 会变成 1024x1024,导致图片被拉抻。

另外建议 Sprite Mode | Mesh Type 设置为 Full Rect

文件误修改

导出 Xcode 工程后,不要打开 LaunchScreen-iPhone.xibLaunchScreen-iPad.xib,因为打开后如果在弹出的对话框中选择某个设备后,文件会提示已修改,保存后可以在版本控制系统中看到文件内容有变化。

总结

在处理类似问题时应该仔细阅读文档,对于文档中不懂的地址一定要搜索查找去理解清楚,否则就会浪费大量时间测试。