U3D iOS SDK Wrapper
很多游戏使用U3D引擎,比如《忍者必须死》、《影之刃》… 所以,iOS NtUniSDK需要一个U3D的wrapper。
U3D的C#可以调用外部C接口,故需要为NtUniSDK包装一个C语言层,下面给出简化的项目示例代码。
#import "UnityAppController.h"
#import "UniHead.h"
#pragma mark __NtNotificationWrapper
#define GameObject "Main Camera"
#if defined(__cplusplus)
extern "C"{
#endif
extern void UnitySendMessage(const char *, const char *, const char *);
#if defined(__cplusplus)
}
#endif
@interface __NtNotificationWrapper : NSObject
@end
static __NtNotificationWrapper *__inst = nil;
@implementation __NtNotificationWrapper
+ (void) initialize
{
if (__inst) {
return;
}
__inst = [[__NtNotificationWrapper alloc] init];
//初始化通知
[[NSNotificationCenter defaultCenter] addObserver:__inst selector:@selector(finishInitNotification:) name:NT_NOTIFICATION_FINISH_INIT object:nil];
}
//初始化完成处理
- (void)finishInitNotification:(NSNotification *)notification
{
NSLog(@"[NtUniSdk] Notification finishInit.");
UnitySendMessage(GameObject,"NT_NOTIFICATION_FINISH_INIT","");
}
+ (void) doNothing{}
@end
#pragma mark - __NtSdkMgr_X
#if defined(__cplusplus)
extern "C"{
#endif
char* __makeCString(NSString* string)
{
if (string == nil) {
return NULL;
}
const char* cstring = [string cStringUsingEncoding:NSUTF8StringEncoding];
if (NULL == cstring) {
return NULL;
}
char* res = (char*)malloc(strlen(cstring)+1);
strcpy(res, cstring);
return res;
}
NSString* __makeNSString(const char* cstring)
{
if (cstring == NULL) {
return nil;
}
NSString* nsstring = [[NSString alloc] initWithCString:cstring encoding:NSUTF8StringEncoding];
return nsstring;
}
void __NtSdkMgr_ntInit()
{
[__NtNotificationWrapper doNothing];
[NtSdkMgr ntInit];
}
#if defined(__cplusplus)
}
#endif
注意上述代码中,对Notification的传递使用了
extern void UnitySendMessage(const char *, const char *, const char *);
调用GameObject上的回调函数。
回到U3D,新建一个C#文件,实现SDK的C# Wrapper。下面是简化的代码示例:
using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
namespace NtUniSdk{
namespace Unity3d{
public class SdkU3d : MonoBehaviour
{
public static void ntInit()
{
__NtSdkMgr_ntInit();
}
[DllImport("__Internal")]
private static extern void __NtSdkMgr_ntInit();
};
}
}
在U3D中即可使用该Wrapper操作SDK。
在U3D中将工程导出为Xcode工程,向Xcode中添加上述完成的C包装层,同时,按文档正常接入NtUniSDK。