创建iOS插件

本页说明iOS插件可以为你做什么,如何使用现有的插件,以及编写一个新插件的步骤.

iOS插件允许你使用第三方库,并支持iOS特定功能,如应用内购买、GameCenter集成、ARKit支持等.

加载和使用现有的插件

一个iOS插件需要一个 .gdip 配置文件,一个二进制文件,它可以是 .a 静态库,也可以是 .xcframework 包含 .a 静态库,可能还有其他依赖关系.要使用它,你需要:

  1. 将插件的文件复制到Godot项目的 res://ios/plugins 目录中.你也可以将文件分组在一个子目录中,比如 res://ios/plugins/my_plugin .

  2. Godot编辑器自动检测并导入 res://ios/plugins 及其子目录中的 .gdip 文件.

  3. 你可以通过进入项目->导出...->iOS,在选项卡中,滚动到插件部分,找到并激活检测到的插件.

../../../_images/ios_export_preset_plugins_section.png

当插件处于活动状态时,您可以使用 Engine.get_singleton() 访问插件:

if Engine.has_singleton("MyPlugin"):
    var singleton = Engine.get_singleton("MyPlugin")
    print(singleton.foo())

创建iOS插件

Godot iOS插件的核心是一个iOS库( .a 档文件或 .xcframework 包含静态库),其要求如下:

  • 该库必须依赖Godot引擎头文件.

  • 该库必须附带一个 .gdip 配置文件.

一个iOS插件可以拥有与Godot模块相同的功能,但提供了更多的灵活性,并且不需要重新构建引擎.

下面是开始开发插件的步骤.我们建议使用 Xcode 作为你的开发环境.

参见

Godot iOS 插件 .

`Godot iOS插件模板<https://github.com/naithar/godot_ios_plugin>`_ 为您提供了启动iOS插件所需的所有样板.

要构建一个iOS插件:

  1. 在Xcode中为您的插件创建一个Objective-C静态库.

  2. HEADER_SEARCH_PATHS 中添加Godot引擎头文件作为插件库的依赖.你可以在 Build Settings 选项卡中找到这个设置:

    • Godot GitHub page <https://github.com/godotengine/godot> _下载Godot引擎源代码.

    • 运行SCons来生成头文件.通过阅读 为iOS平台编译 来了解这个过程.不需要等待编译完成就可以继续,因为在引擎开始编译之前就会生成头文件.

    • 你应该为iOS插件和iOS导出模板使用相同的头文件.

  3. Build Settings 选项卡中, OTHER_CFLAGS 中指定静态库的编译标志.最重要的是 -fcxx-modules-fmodules-DDEBUG ,如果你需要调试支持.其他标志应该和你编译Godot时使用的一样.例如, -DPTRCALL_ENABLED -DDEBUG_ENABLED, -DDEBUG_MEMORY_ALLOC -DDISABLE_FORCED_INLINE -DTYPED_METHOD_BIND .

  4. 为你的插件添加所需的逻辑,并建立你的库以生成一个 .a 文件.你可能需要同时建立 debugrelease 目标 .a 文件.根据你的需要,选择其中一个或两个.如果你同时需要调试和发布 .a 文件,它们的名字应该符合以下模式: [PluginName].[TargetType].a .你也可以用SCons配置来构建静态库.

  5. iOS插件系统也支持``.xcframework``文件.你可以使用命令来生成它,例如:xcodebuild -create-xcframework -library [DeviceLibrary].a -library [SimulatorLibrary].a -output [PluginName].xcframework.

  6. 创建一个Godot iOS插件配置文件,以帮助系统检测和加载你的插件:

    • 配置文件的扩展名必须是 gdip (e.g.: MyPlugin.gdip ).

    • 配置文件格式如下:

      [config]
      name="MyPlugin"
      binary="MyPlugin.a"
      
      initialization="init_my_plugin"
      deinitialization="deinit_my_plugin"
      
      [dependencies]
      linked=[]
      embedded=[]
      system=["Foundation.framework"]
      
      capabilities=["arkit", "metal"]
      
      files=["data.json"]
      
      linker_flags=["-ObjC"]
      
      [plist]
      PlistKey="Some Info.plist key you might need"
      

      config 部分和字段是必须的,定义如下:

      • 名称(name) :(插件的名称)

      • binary: 这应该是插件库( axcframework )文件的路径.

        • 文件路径可以是相对的(例如: MyPlugin.a , MyPlugin.xcframework ),在这种情况下,它是相对于 gdip 文件所在的目录.

        • 文件路径可以是绝对的: res://some_path/MyPlugin.ares://some_path/MyPlugin.xcframework .

        • 如果你需要多目标库使用,文件名应该是 MyPlugin.a , .a 文件应该命名为 MyPlugin.release.aMyPlugin.debug.a .

        • 如果你使用多目标库 xcframework ,它们在配置中的文件名应该是 MyPlugin.xcframework. .xcframework``文件应该被命名为 ``MyPlugin.release.xcframeworkMyPlugin.debug.xcframework .

      dependenciesplist 部分是可选的,定义如下:

      • 依赖:

        • linked(链接): 包含iOS应用应该包含的iOS框架列表.

        • embedded: 嵌入包含一个iOS框架或库的列表,这些框架或库将被链接并嵌入到最终的iOS应用程序中.

        • system :包含插件所需的iOS系统框架的列表.

        • capabilities(功能):包含插件所需的iOS功能列表,可用功能列表可以在 Apple UIRequiredDeviceCapabilities documentation page 找到.

        • files(文件):包含导出时应复制的文件列表.这对数据文件或图像很有用.

        • linker_flags :包含一个链接器标志的列表,在导出插件时添加到Xcode项目中.

      • plist:应该出现在``Info.plist``文件中的键和值,模式如下: 键名="键值"