如何为 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.
我正在尝试编写一个本地插件来访问 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.