如何为 Apple TV 和 MacOS 统一构建 objective-C 本机插件

How to build an objective-C native plugin in unity for appleTV and MacOSX

我正在尝试编写一个本地插件来访问 Social.localUser unity API 尚未公开的一些 GameKit 功能(即本地用户受多人游戏限制的事实).

我写了一个 GameKitWrapper.mm 文件,我在其中声明了一个函数及其对应的 Csharp。在 IOS 上一切正常(找到插件并且方法 return 正确的值),但在 appleTV 和 macOSX 上找不到 .mm 文件。

据我了解,在 macOSX 和 appleTv 上,我应该动态 link 插件,而不是使用代表静态 linked 库的“__Internal”关键字。但是即使我在为 appleTV 或 macOSX 构建时将 [DllImport("__Internal")] 更改为我的插件名称(我尝试了 DllImport["GameKitNativeWrapper"]DllImport["GameKitNativeWrapper.mm"]),它也不起作用并且我收到此错误:

DllNotFoundException: Unable to load DLL 'GameKitNativeWrapper': The specified module could not be found.

正如我在文档中所读到的那样,它应该可以工作。我的设置中是否缺少任何使插件在 appleTV 和 macOSX 上运行的设置?

我应该将 .mm 文件编译成一个包吗?以便当 运行 AppleTV 上的应用程序 and/or Mac?

时可以动态 linked

下面是相关的C#源文件GameKitHelper.cs


    namespace Plugins.GameKit
    {
        using System.Runtime.InteropServices;
        public static class GameKitHelper
        {
            [DllImport("__Internal")]
            private static extern bool IOSIsMultiplayerGamingRestricted();
    
    
            public static bool IsMultiplayerRestricted()
            {
                if (DeviceHelper.IsAppleDevice())
                {
                    return IOSIsMultiplayerGamingRestricted();
                }
                else
                {
                    return false;
                }
            }
        }
    }

这是相关的 GameKitNativeWrapper.mm 文件:

    #import <Foundation/Foundation.h>
    #import <GameKit/GameKit.h>
    #include <Availability.h>
    #include <TargetConditionals.h>
    
    @interface GameKitNativeWrapper: NSObject
    {
    }
    @end
    
    @implementation GameKitNativeWrapper
    static GameKitNativeWrapper *_sharedInstance;
    
    +(GameKitNativeWrapper*) sharedInstance
    {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            NSLog(@"Creating GameKitNativeWrapper shared instance.");
                _sharedInstance = [[GameKitNativeWrapper alloc] init];
        });
        return _sharedInstance;
    }
    
    -(id)init
    {
        self = [super init];
        if (self)
            [self initHelper];
        return self;
    }
    
    -(void)initHelper
    {
        NSLog(@"initHelper called");
    }
    
    -(bool)isMultiplayerGamingRestricted
    {
        GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
        return localPlayer.isMultiplayerGamingRestricted;
    }
    @end
    
    extern "C"
    {
        bool IOSIsMultiplayerGamingRestricted()
        {
            return [[GameKitNativeWrapper sharedInstance] isMultiplayerGamingRestricted];
        }
    }

如果您想使用 Objective-C (.mm) 来实现 Mac OS plug-in for unity,您应该将其部署为一个包。

使用 XCode 创建捆绑项目:

打开 XCode。 Select 文件 > 新建 > 项目 > macOS > 框架和库 > Bundle.