原生 visionOS 平台支持
[来自网页的内容]
对话
**rsanchezsaez ** 评论 Apr 21, 2025 •
已编辑
加载中
尊敬的 Godot 社区,
我是 Apple 的 visionOS 工程团队成员,我们希望为 Godot 引擎贡献 Vision Pro 支持。这是为此奠定基础的第一个 PR。
首先,我想说我们非常高兴能与 Godot 社区合作,添加 visionOS 支持。我们努力遵循 Godot 的编码标准,并对我们的贡献保持高质量。我们希望我们的贡献与 Godot 的目标一致。最后,即使我们尝试将更改拆分为较小的自包含 PR,我们也承认其中一些 PR 的规模可能相当大。
我们非常乐意在收到社区的反馈和建议后对我们的 PR 进行迭代。
高级概述
我们贡献的直接目标是:
- 支持当前的 Godot 游戏在 visionOS 上的平面窗口上原生运行。
- 通过使用新的 Godot 的 visionOS VR 插件来支持创建沉浸式体验。
为了实现这一目标,并为了使审查更容易,我们已将我们的贡献结构化为三个增量 PR。
- 添加原生
visionOS
平台。使用 iOS 作为起点。尽可能多地重用 iOS 和 Vision Pro 平台之间的代码。(此 PR)。 - 添加在 Godot 中编译和链接 Swift 文件的能力,并将
visionOS
平台上的main.mm
替换为 SwiftUI 应用程序生命周期。这是在 visionOS 上启动沉浸式场景的要求。 - 引入 Vision Pro VR 插件以实现沉浸式支持。
即使我们有一个包含第 2 点和第 3 点的工作版本,这些 PR 尚未发布。我们目前的计划是在每个先前的 PR 合并后按顺序打开它们。
技术讨论
此 PR 实现了新的原生 visionOS
平台。
在实现方面,它非常接近 iOS
平台。为了尽可能多地重用代码,它引入了一个新的 drivers/apple_embedded
文件夹,用于托管 iOS
和 visionOS
(但不是 macOS
)平台之间共享的代码。我们从新的 drivers/apple
文件夹中汲取了灵感,该文件夹托管适用于所有 Apple 平台的代码。
平台特定的逻辑(包括应用程序实例化、客户端代码、显示服务器、OS 支持和导出插件)已重构,现在大部分实现都在 drivers/apple_embedded
上。这些平台提供了小型子类,这些子类专门针对平台之间不同的具体方面。我们在进行此重构时非常小心,尽量不要更改现有的 iOS 功能。
visionOS
平台没有 OpenGL 支持,因为它不受 visionOS 支持。
为了使审查更容易,我们已尝试在有意义时将此 PR 拆分为单独的自包含提交,并且我们已向大多数提交添加了有关每个提交中包含的内容的详细说明。逐个提交进行审查更容易,以查看更改是如何逐步实现的。
文档注意事项
现在,iOS
和 visionOS
的导出插件共享大部分代码和大多数选项(启动情节提要支持除外,该支持仅适用于 iOS;以及特定平台图标支持)。因此,我们已将 EditorExportPlatformIOS.xml
重命名为 EditorExportPlatformAppleEmbedded.xml
,并将其移动到 drivers/apple_embedded
。
我们想问社区从文档工具的角度来看这是否合适,并且我们正在请求有关如何修改此文件或文档工具以为每个平台提供特定文档的进一步指导。
测试
我们主要使用 Platformer 演示项目 测试了此 PR。我们已验证该项目继续在 iOS 上运行,并且现在可以在 visionOS 上原生运行。我们已经在两个平台上使用 Metal 渲染驱动程序测试了 Mobile 和 Forward+ 渲染器。
开放性问题
在我们所有的测试中,我们都使用相应的导出插件和模板导出了一个 Xcode 项目,然后我们将该项目直接运行到 iOS 或 visionOS 设备。
我们想请社区提供指导,或者帮助测试以下功能:
- 我们尚未测试 iOS/visionOS 导出模板在导出时嵌入和链接插件的能力。我们尝试在
visionOS
平台上保留此功能,并且我们假设它将以与 iOS 相同的方式工作。如果有人可以附加一个使用此功能的项目,我们可以帮助测试它。 - 我们尚未使直接 Archive/IPA 导出以及 One-Click-Deploy 工作,即使在
master
中也是如此。我们的开发者帐户与外部开发者使用的帐户之间存在一些差异,因此很难查明问题。如果目前有 One-Click-Deploy 正常工作的人员能够在两个平台上进行测试,我们将不胜感激。 - 同样,我们尚未测试使用
ios_deploy
(与 14.0 之前的 Xcode 版本一起使用)直接部署到 iOS 设备。如果有人使用此方法设置了正常运行的环境,我们将不胜感激。或者,如果由于ios_deploy
已经过时不再需要支持,我们将很乐意删除这些代码路径以简化代码。
缺少的功能
- visionOS 上的 DPI 指标目前是硬编码的。它们可能会在运行时更改,具体取决于窗口与查看者的距离。我们将在添加 SwiftUI 的 PR 中解决此问题,因为这些指标来自 SwiftUI API。
- 我们尚未实现将 visionOS 图标资源目录构建到导出器中。如果社区中的某个人可以介入并实现它,那就太棒了。否则,我们可能会将其作为以后的 PR 提交。目前,您可以通过在导出 Xcode 项目后手动创建 visionOS 图标来解决此问题。此处 您可以阅读 visionOS 图标的工作原理。这是显示资源目录结构的示例图标:visionOS-icon.xcassets.zip
- visionOS 平台的 SVG 徽标只是文本,如果有人可以提出一个漂亮的图形,那就太好了。
我们很乐意回答任何问题或解决任何疑虑。我们期待与大家合作。
@BastiaanOlij @clayjohn @coppolaemilio @stuartcarnie 随意提及任何对该更改感兴趣的人。
很抱歉,出现了一些问题。
👍 113 hsvfan-jan, passivestar, Swarkin, joshdholtz, bossoverdose, jaydensipe, afk-mario, Geometror, knotbin, dog-on-moon, 以及其他 103 人对竖起大拇指表情符号做出了反应 🎉 108 stuartcarnie, marcosc90, jaydensipe, H3XAGON3ST, hsvfan-jan, passivestar, Swarkin, jrbj, migueldeicaza, mgratzer, 以及其他 98 人对欢呼表情符号做出了反应 ❤️ 101 stuartcarnie, jaydensipe, H3XAGON3ST, Ivorforce, hsvfan-jan, boruok, joshdholtz, dgovil, knotbin, rtemoni, 以及其他 91 人对心形表情符号做出了反应 🚀 69 stuartcarnie, jaydensipe, H3XAGON3ST, hsvfan-jan, Repiteo, jrbj, joshdholtz, lodetrick, dgovil, knotbin, 以及其他 59 人对火箭表情符号做出了反应 👀 40 JoNax97, Repiteo, joshdholtz, lodetrick, jaydensipe, dsnopek, ryi3r, BradyAJohnston, Yu266426, dannflor, 以及其他 30 人对眼睛表情符号做出了反应
所有反应
- 👍 113 个反应
- 🎉 108 个反应
- ❤️ 101 个反应
- 🚀 69 个反应
- 👀 40 个反应
rsanchezsaez 添加了 22 个提交 2025 年 4 月 21 日 12:30
[ios target] 将工具链参数重命名为 APPLE_TOOLCHAIN_PATH 并自动检测…[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/f3fb28aab51eedc8732f58517839435c632c4ed9> "\[ios target\] 将工具链参数重命名为 APPLE_TOOLCHAIN_PATH 并自动检测")
…
f3fb28a[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/f3fb28aab51eedc8732f58517839435c632c4ed9>)
…dd auto-detection
[SConstruct] 在日志消息中指定是否正在为模拟器构建[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/38f4ceaacafe1b992b19c17b7fd8e8b198d8ddfe> "\[SConstruct] 在日志消息中指定是否正在为模拟器构建")
38f4cea[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/38f4ceaacafe1b992b19c17b7fd8e8b198d8ddfe>)
[core] 修复初始化时所有渲染驱动程序都出错时的错误访问…[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/737a9026097fffed0f3ad44f8b4cab64edd845d8> "\[core] 修复初始化时所有渲染驱动程序都出错时的错误访问")
…
737a902[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/737a9026097fffed0f3ad44f8b4cab64edd845d8>)
…alizing
[ios] 将大部分 iOS 代码移动到新的 apple_embedded 驱动程序[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/c9a35f5915ca7e224712d5bd87f43f44b9172a38> "\[ios] 将大部分 iOS 代码移动到新的 apple_embedded 驱动程序 除了文件重命名之外,没有有意义的代码更改。")
…
c9a35f5[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/c9a35f5915ca7e224712d5bd87f43f44b9172a38>)
除了文件重命名之外,没有有意义的代码更改。
[apple embedded] 将 iOS 和 os_iOS 重命名为 AppleEmbedded[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/1f3084a8377b1962ad2ba2bed8391810d36c17d2> "\[apple embedded] 将 iOS 和 os_iOS 重命名为 AppleEmbedded")
1f3084a[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/1f3084a8377b1962ad2ba2bed8391810d36c17d2>)
[apple embedded] 重命名大多数类[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/38857878c3ad039f7f5657c87d880bd4a36544c4> "\[apple embedded] 重命名大多数类 遵循 Obj-C 命名约定")
…
3885787[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/38857878c3ad039f7f5657c87d880bd4a36544c4>)
遵循 Obj-C 命名约定
[apple embedded] 修复标头注释[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/55a1c0c30d92e491deb740fa51cc6f4fe65377ff> "\[apple embedded] 修复标头注释")
55a1c0c[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/55a1c0c30d92e491deb740fa51cc6f4fe65377ff>)
[apple embedded] 重命名 DisplayServer[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/f60ae60d9d6232106712688c3b5ce496ad2c5f8e> "\[apple embedded] 重命名 DisplayServer")
f60ae60[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/f60ae60d9d6232106712688c3b5ce496ad2c5f8e>)
[apple embedded/ios] 子类化“DisplayServer”、“os”和“apple_embedded”[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/05845c5bfea13c6836c6d2830c15f4c135b8d3fe> "\[apple embedded/ios] 子类化“DisplayServer”、“os”和“apple_embedded”")
…
05845c5[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/05845c5bfea13c6836c6d2830c15f4c135b8d3fe>)
…ded'
[visionos] 添加平台启动器文件(“ios”的副本)[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/12738748d3cbf12a3531bd75b9339ce71dcee177> "\[visionos] 添加平台启动器文件(“ios”的副本)")
1273874[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/12738748d3cbf12a3531bd75b9339ce71dcee177>)
[ios] 修复标头[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/14c817cb3e303c1e6aadd54a171433f749e714e0> "\[ios] 修复标头")
14c817c[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/14c817cb3e303c1e6aadd54a171433f749e714e0>)
[visionos] 添加平台 xcode 模板(“ios”的副本)[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/1ddcf8c8dd94f2a0bfd4cbc803537ce0f810b47a> "\[visionos] 添加平台 xcode 模板(“ios”的副本)")
1ddcf8c[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/1ddcf8c8dd94f2a0bfd4cbc803537ce0f810b47a>)
[visionos] 调整平台 xcode 模板[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/74e9e57736a1134fdc9c60415a8eac031fe179cc> "\[visionos] 调整平台 xcode 模板")
74e9e57[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/74e9e57736a1134fdc9c60415a8eac031fe179cc>)
` [visionOS] 实现平台(仅支持“Metal”驱动程序)[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/857052b5b2ae125a1e8060f3f939d94fe930a38e> "[visionOS] 实现平台(仅支持“Metal”驱动程序)
TODO:改进“export_plugin”iOS/visionOS 代码重用,并概括“EditorExportPlatformIOS.xml”文档。
包括:
- [SCons] 添加 visionOS SDK。
- [iOS/visionOS] 为通用代码路径添加通用“APPLE_EMBEDDED_ENABLED”预处理器宏。
- [drivers/apple_embedded] 专门化唯一的 iOS/visionOS 功能。
- [editor/export] 将所有“ios”方法重命名为“apple_platform”。
- [editor/export] 将 visionOS 平台添加到 macho.h(基于 https://github.com/llvm/llvm-project/pull/83031/files)。
- [visionOS] 添加 logo.svg。
- [main] 添加 visionOS 驱动程序设置。
- [core/input] 将“iOS”平台重命名为“AppleEmbedded”,因为它由 iOS 和 visionOS 共享。
- [servers/rendering/renderer_rd/effects] 在 visionOS 上禁用“MTLFXTemporalScaler”(不支持)。")
…
857052b `
TODO:改进“export_plugin”iOS/visionOS 代码重用,并概括“EditorExportPlatformIOS.xml”文档。
包括:
- [SCons] 添加 visionOS SDK。
- [iOS/visionOS] 为通用代码路径添加通用“APPLE_EMBEDDED_ENABLED”预处理器宏。
- [drivers/apple_embedded] 专门化唯一的 iOS/visionOS 功能。
- [editor/export] 将所有“ios”方法重命名为“apple_platform”。
- [editor/export] 将 visionOS 平台添加到 macho.h(基于 <https://github.com/llvm/llvm-project/pull/83031/files>)。
- [visionOS] 添加 logo.svg。
- [main] 添加 visionOS 驱动程序设置。
- [core/input] 将“iOS”平台重命名为“AppleEmbedded”,因为它由 iOS 和 visionOS 共享。
- [servers/rendering/renderer_rd/effects] 在 visionOS 上禁用“MTLFXTemporalScaler”(不支持)。
[ios/visionos] 代码重用:将“ios”导出插件文件移动到“apple_embedded”[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/c794884dbf2ee493b756c9df6967c48420b64664> "\[ios/visionos] 代码重用:将“ios”导出插件文件移动到“apple_embedded” 没有代码更改。此提交允许下一个提交仅显示相关的更改。")
…
c794884[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/c794884dbf2ee493b756c9df6967c48420b64664>)
…mbedded'
没有代码更改。此提交允许下一个提交仅显示相关的更改。
[apple embedded/export] 重命名类并在 iOS 导出插件上采用[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/08211925199a4d01adac306f35e5b2e114b4b66b> "\[apple embedded/export] 重命名类并在 iOS 导出插件上采用")
0821192[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/08211925199a4d01adac306f35e5b2e114b4b66b>)
[ios] 从 Apple Embedded 完全采用导出插件[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/61a30dafe7bcead92ed2b7c86de1ac0de9831990> "\[ios] 从 Apple Embedded 完全采用导出插件")
61a30da[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/61a30dafe7bcead92ed2b7c86de1ac0de9831990>)
[visionos] 从 Apple Embedded 采用导出插件[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/f1abee9ae900fa3a3ecdfe28af82eb817e976a97> "\[visionos] 从 Apple Embedded 采用导出插件")
f1abee9[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/f1abee9ae900fa3a3ecdfe28af82eb817e976a97>)
[visionos] 删除 iOS 部署选项(不适用)[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/0ac013c3aba7d9ffde4514ddd2c4dfa0ec96efdb> "\[visionos] 删除 iOS 部署选项(不适用)")
0ac013c[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/0ac013c3aba7d9ffde4514ddd2c4dfa0ec96efdb>)
[ios export plugin] 将 iOS 特定的图标导出从 AppleEmbedded 移动到 iOS[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/2c8309e0ab4694e6c7be1bb4c659e5440d7b7d82> "\[ios export plugin] 将 iOS 特定的图标导出从 AppleEmbedded 移动到 iOS")
…
2c8309e[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/2c8309e0ab4694e6c7be1bb4c659e5440d7b7d82>)
…to iOS
[apple embedded/export] 使用新的 Apple Development/Apple Distribution 自动签名标识名称[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/7d70c97103ac3447b43741f2f449293901196d3c> "\[apple embedded/export] 使用新的 Apple Development/Apple Distribution 自动签名标识名称")
…
7d70c97[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/7d70c97103ac3447b43741f2f449293901196d3c>)
…automatic signing identity names
[visionos] 更新平台徽标[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/7901df424253a29b806c1c0022e21969c43677e4> "\[visionos] 更新平台徽标")
7901df4[](https://github.com/godotengine/godot/pull/</godotengine/godot/pull/105628/commits/7901df424253a29b806c1c0022e21969c43677e4>)
rsanchezsaez 请求 [代码所有者](https://