天天看点

Unity3d与iOS交互开发—接入平台SDK必备技能

  一、unity3d  to  ios:

  1、创建一个c#文件 sdktoios.cs 这是调用ios函数的接口:

public class sdktoios: monobehaviour

{

//平台接入开关

public static bool isopenplatform = false;

//导入定义到.m文件中的c函数

[dllimport("__internal")]

private static extern void _platforminit();

//定义接口函数供游戏逻辑调用

public static void initsdk()

if (isopenplatform)

_platforminit();

}

  2、编写与接口对应的objective-c函数:

//  myiossdk.h

#import <foundation/foundation.h>

@interface myiossdk : nsobject

@end

//  myiossdk.m

#import "myiossdk.h"

//这里引用sdk的头文件

#import "sdkplatform.h"

#if defined(__cplusplus)

extern "c"{

#endif

extern void unitysendmessage(const charchar *, const charchar *, const charchar *);

extern nsstring* _creatensstring (const char* string);

//*****************************************************************************

@implementation myiossdk

//**********************

//message tools

+ (void)sendu3dmessage:(nsstring *)messagename param:(nsdictionary *)dict

nsstring *param = @"";

if ( nil != dict ) {

for (nsstring *key in dict)

if ([param length] == 0)

param = [param stringbyappendingformat:@"%@=%@", key, [dict valueforkey:key]];

else

param = [param stringbyappendingformat:@"&%@=%@", key, [dict valueforkey:key]];

unitysendmessage("sdk_object", [messagename utf8string], [param utf8string]);

//sdk fun

//初始化sdk

-(void)sdkinit

sdkcfg *cfg = [[[sdkcfg alloc] init] autorelease];

cfg.appid =123456;

cfg.appkey =@"aoaoaoaoaoaoaoaoaoaoaoaoaaoaoaoaoaoaoao";

cfg.orientation = uideviceorientationlandscapeleft;

//调用sdk的初始化函数

[[sdkplatform defaultplatform] sdkinit:cfg];

//添加回调监听

[[sdkplatform defaultplatform] addobserver:self selector:@selector(snsinitresult:) name:(nsstring *)kinitnotification object:nil];

//获取用户id

-(nsstring*)sdkgetuserid

[[sdkplatform defaultplatform] sdkgetuserid];

//call back fun

//初始化更新回调

- (void)snsinitresult:(nsnotification *)notify

[myiossdk sendu3dmessage:@"sdkmsginit" param:nil];

//字符串转化的工具函数

nsstring* _creatensstring (const char* string)

if (string)

return [nsstring stringwithutf8string: string];

return [nsstring stringwithutf8string: ""];

char* _makestringcopy( const char* string)

if (null == string) {

return null;

char* res = (char*)malloc(strlen(string)+1);

strcpy(res, string);

return res;

static myiossdk *mysdk;

//供u3d调用的c函数

void _platforminit()

if(mysdk==null)

mysdk = [[myiossdk alloc]init];

[lssdk sdkinit];

//注意这个函数是返回字符串

const char* _platformgetuin()

if(lssdk==null)

lssdk = [[myiossdk alloc]init];

return _makestringcopy([[lssdk sdkgetuserid] utf8string]);

  值得一提的是在上面的代码中特意写了一个返回字符串的例子,因为你要获取用户id 、昵称什么的。对应在cs文件中导入函数如下:

  [dllimport ("__internal")]

  private static extern string _platformgetuin();

  这里的const char* 会被c#自动转换成string因为在m文件中使用了内存申请,该段内存自然是处在堆内存中,这样转成string符合c#的内存管理机制,我们不用担心它的释放问题。

  3、在你的工程目录中找个地方保存ios的文件

  打包出xcode工程后导入进去,加入你的sdk就可以了。

  有一点需要说明,如果存放目录为\assets\plugins\ios,那么unity3d会自动将该目录下的所有文件(暂不支持子文件夹)当做插件文件打包到xcode工程下的libraries目录下,这样你就不需要在手动添加了,否则会报错重复声明什么的。

  这种文件各个平台会有多个,可以使用同一头文件且定义的c函数名也都相同,这样更有利于多版本管理。

  二、ios to  unity3d:

  这个在上面的 myiossdk.m 文件中已经有剧透了,就是利用unity3d 的unitysendmessage函数,其中参数1是场景中接受消息的对象,参数2是要执行的函数名,参数3为传入参数,只要按照如下步骤就可以实现这个机制:

  1、在场景中创建一个对象用于接受ios消息,或者用现有的也可以;

  2、为sdk消息写一个脚本,里面包含各种消息函数;

  3、将脚本挂到之前创建的对象上完事;

  需要注意:这个对象在场景切换时候要始终存在,或者你在每个场景中都加个这玩意也可以,总之只要能收到消息就行了;

  另外,针对参数的传递对应上面的sendu3dmessage函数,我还在消息接受脚本中写过一个消息参数的解析:

void parsemsg(string msg, out dictionary<string, string> dicmsg){

if( null == msg || 0 == msg.length ){

dicmsg = null;

return;

dicmsg = new dictionary<string, string>();

string[] msgarray = msg.split('&');

for( int i=0; i<msgarray.length; i++){

string[] elementarray = msgarray[i].split('=');

dicmsg.add(elementarray[0],elementarray[1]);

  这个我自己都还没有实际使用过,有错误自行解决大致是这样。

  ps:关于sdk的接入还有 android版本的尚未研究网上有很多可以参照;

  pps:这种交互方式在ios的模拟器上貌似不行,测试请使用真机;

最新内容请见作者的github页:http://qaseven.github.io/

继续阅读