关于 iphone-duo-games
面向游戏开发者的 iPhone Duo 适配指南,重点说明运行时窗口变化、触控目标避开折叠区域,以及如何保持不同姿态下的可玩性。
主要功能
- 01响应运行时视口尺寸变化
- 02优先调整画面纵横比
- 03保持文字与触控目标尺寸稳定
- 04让触控控件避开折叠和遮挡区域
- 05检查分屏时的渲染表现
适用场景
- 01适配设备开合和旋转时的游戏画面
- 02为折叠姿态调整虚拟摇杆和按钮位置
- 03在固定比例游戏中设计有意图的留边
- 04确保分屏窗口中控件仍可见
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ mirzaaghazadeh/ iphone-duo-skills --skill iphone-duo-games安装后在 Claude Code 中输入/iphone-duo-games确认已加载。
详细介绍
iPhone Duo 上的游戏
游戏不受本设备大部分 UI 指南的限制——无需调整工具栏的方向,也无需适配分屏视图。但游戏仍然必须适应尺寸变化。每当有人打开、关闭、折叠或旋转设备时,运行中的游戏所处屏幕的尺寸和形状都会改变。如果游戏假设视口固定,就会出现黑边、画面拉伸,或控件超出屏幕边缘的情况。
可以锁定方向,但不能停止填满屏幕
锁定为纵向或横向都没问题,而且系统支持。但不能把方向锁定当作假设尺寸固定的许可。
在这里,这种假设行不通有两个原因:
- 本设备有两块尺寸不同的显示屏,游戏会在一局中途切换到另一块屏幕。
- **内屏不遵循受支持的界面方向设置。**此前在每部 iPhone 上都生效的方向锁定,在内屏上会失效。
UIRequiresFullScreen 的行为也一样——仍会生效,但设备打开和关闭时,游戏仍会调整尺寸。无论如何,都要为尺寸变化做好准备。
因此:选择你需要的方向,然后确保游戏在每种姿态下都填满屏幕。这才是真正的要求。
调整宽高比胜过加黑边
视口形状变化时,你有三个选择,按优先顺序排列:
**1. 调整宽高比。**显示更多或更少的游戏世界。这是首选方案:扩展摄像机视锥,扩大可视范围,让场景自然延伸到分配给它的空间中。游戏始终铺满屏幕,无论设备处于何种姿态,都能呈现原生体验。
**2. 用美术内容填充左右或上下黑边。**如果设计确实无法适应可变宽高比——例如固定的益智游戏网格,或经过精确调校的平台游戏摄像机——那么可以接受加边,但要把边缘填满。延展背景、续接场景美术,或在填充区域加入主题边框。目标是让画面看起来像经过精心设计的边框,而不是游戏没能适配屏幕。
**3. 直接留黑边。**应当避免。这就是“未能适配”的样子。
保持文字和控件尺寸不变
视口调整尺寸时,不要急着将整个场景等比缩放。等比缩放会让 HUD 文字和触控目标与游戏世界一起缩小——因此,打开设备切换到更大的显示屏时,文字反而更难阅读,按钮也更难点击,这恰恰背道而驰。
缩放游戏世界;让 UI 保持在独立图层中,并以点为单位设置尺寸。尽可能让文字和控件在每种姿态下都保持近似恒定的实际尺寸。尤其要确保屏幕触控控件不会仅仅因为宽高比变化,就缩小到舒适尺寸以下。
折叠处会给触控控件带来实际问题
这是最可能影响游戏的 iPhone Duo 特有问题。
设备处于半折叠状态时,内屏中间会形成弯曲区域,这里的内容确实更难看清,也更难点击。虚拟摇杆、射击按钮或拖动目标如果落在弯曲处,就会变得不可靠——不是完全看不见,只是更难使用,因此也更难从错误报告中诊断问题。
游戏很少使用能自动避开折叠区域的系统组件,因此需要由你来处理:
- 查询保留区域,并确保交互控件避开分隔区域(折叠处)。API 和位置调整模式请参见
../iphone-duo-adaptive-layout/SKILL.md。 - 将触控控件锚定在外侧边缘,而不是居中放置。边缘锚定在所有姿态下都更可靠,而且设备展开时不会造成任何损失。
- 也要留意遮挡区域:外侧前置摄像头始终存在,内侧摄像头则会在启用时出现。
纯视觉、非交互内容可以跨越折叠处。需要移动的是触控目标和重要读数。
值得针对其进行设计的姿势
你不需要为每种姿势定制布局,但有两种值得考虑:
桌面/笔记本电脑姿势。 设备立在平面上,一半屏幕朝上,另一半朝向玩家。这是一种真正新颖的游戏姿势——下半部分是稳定的触控区域,上半部分是显示区域。采用棋盘与控制区分屏布局的游戏很适合这种姿势。
帐篷姿势。 设备立在边缘上,无需用手扶持。适合放置、观战、环境式或回合制游戏。
将这两种姿势都视为额外加分项。不要让任何功能依赖某种用户可能永远不会使用的姿势。
分屏视图
和其他应用一样,游戏也可以参与分屏视图多任务处理——你的游戏可能会缩小到内部显示屏的一半。这样一来,画面会比你设计时考虑的尺寸更小,形状也不同。确保游戏仍能正确渲染,控制项不会被挤出屏幕边缘;你不必保证这种尺寸下的游玩体验出色,但至少不能出现故障。
将铰链用作输入
铰链角度可作为实时连续值获取——包括粗略状态和角度——SwiftUI 中通过 onHingeChange 获取,UIKit 中则通过 UIHingeInteraction 获取。对于游戏引擎,可以像接入其他原生传感器一样进行桥接。
这是一种真正新颖的输入方式,值得考虑用于特效、摄像机视差或游戏机制。请注意两点:由于同一个二进制文件会在所有不可折叠的 iPhone 上运行,因此要处理铰链为 nil 的情况;绝不能让它成为执行某项操作的唯一方式。详情见 ../iphone-duo-hinge-and-scenes/SKILL.md。
引擎说明
大多数引擎都会将视口变化作为调整大小事件公开,并提供安全区域内边距查询。请接入这两项,并将调整大小视为一等事件,而不是只在启动时读取一次的值:
- Unity — 使用
Screen.safeArea,并在运行时处理分辨率变化,而不是只在Start()中读取一次。 - Unreal — 使用安全区/标题安全区数值,并在视口调整大小时重新评估。
- Godot — 使用安全区域 API,并选择能够适应宽高比变化的拉伸模式。
- SpriteKit / Metal — 视图本身会通知你尺寸变化;关键在于让场景对此作出响应,而不是假定绘图区域尺寸始终与初始值相同。
保留区域和铰链角度属于 iOS 27.1 API,没有对应的引擎级功能,因此需要使用原生插件。桥接方式与 ../iphone-duo-flutter/SKILL.md 和 ../iphone-duo-react-native/SKILL.md 中介绍的方式相同。
检查清单
- 将视口调整大小作为实时事件处理,而不是在启动时读取一次。
- 无论采用何种屏幕方向锁定,都要确保各种姿势下屏幕都能填满。
- 优先调整宽高比;如果要加黑边,请用美术素材填充。
- 确保 HUD 文本和触控目标在各种姿势下的实际物理尺寸一致。
- 将交互控件锚定在边缘,并避免放入折叠区域。
- 确认游戏在分屏视图中仍能正确渲染。
- 在 Device Hub 的 iPhone Duo 模拟器中测试每种姿势——展开、闭合、折叠和旋转。