如何在Unity中构建适配Apple TV及macOS的Objective-C原生插件
Unity GameKit插件适配Apple TV/macOS解决方案
首先明确核心问题:
.mm是Objective-C++源码文件,仅iOS/tvOS的Xcode构建流程会自动将配置过的.mm源码编入主二进制,macOS平台不支持直接识别.mm源码作为插件调用。- macOS平台必须将
.mm编译为.bundle格式的动态库才能完成运行时动态链接,tvOS可选择源码编译方案无需额外打包动态库。
具体操作步骤
1. 修正C#代码的条件编译逻辑
你之前的DllImport存在两个问题:一是没有做平台区分,二是写法语法错误(属性的方括号需包裹整个声明,不是DllImport["xxx"]),修改后代码如下:
namespace Plugins.GameKit { using System.Runtime.InteropServices; public static class GameKitHelper { // iOS、tvOS平台源码编入主二进制,用__Internal调用 #if UNITY_IOS || UNITY_TVOS [DllImport("__Internal")] // macOS平台用预编译的bundle名称调用 #elif UNITY_STANDALONE_OSX [DllImport("GameKitNativeWrapper")] #endif private static extern bool IOSIsMultiplayerGamingRestricted(); public static bool IsMultiplayerRestricted() { if (DeviceHelper.IsAppleDevice()) { return IOSIsMultiplayerGamingRestricted(); } else { return false; } } } }
2. 编译macOS平台bundle插件
打开Xcode执行以下操作:
- 新建项目,选择「macOS > Framework & Library > Bundle」模板,项目名设为
GameKitNativeWrapper - 把你的
GameKitNativeWrapper.mm拖入项目,在Build Phases > Link Binary With Libraries中添加GameKit.framework - 在Build Settings > Architectures中设置为
Standard Architectures (Apple Silicon, Intel)以兼容所有Mac设备 - 编译项目,得到
GameKitNativeWrapper.bundle文件
3. 配置Unity插件属性
- 原有
.mm文件:在Unity检查器中仅勾选「iOS」「tvOS」平台,取消勾选macOS平台,SDK选择「Any SDK」即可 - 编译得到的
.bundle文件:导入Unity后,在检查器中仅勾选「macOS」平台,CPU架构选择「Universal」
4. 异常排查
如果仍出现DllNotFoundException,检查以下项:
- 打开bundle的
Info.plist,确认CFBundleExecutable字段值和DllImport中的名称完全一致 - 编译bundle时确认没有编译错误,依赖的
GameKit.framework已正确添加 - macOS构建完成后,右键查看应用包内容,确认bundle已被复制到
Contents/Plugins目录下
内容的提问来源于stack exchange,提问作者downstroy
相关产品推荐
相关产品推荐

