<dl></dl>
<dd></dd>
原地址:http://www.2cto.com/kf/201401/273337.html#
前言废话:开发手机游戏都知道,你要接入各种平台的sdk。那就需要unity3d与ios中objective-c的函数有交互,所以你就需要用到如下内容:
一、unity3d to ios:
1、创建一个c#文件 sdktoios.cs 这是调用ios函数的接口:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<code>public</code>
<code>class</code> <code>sdktoios: monobehaviour</code>
<code>{</code>
<code> </code><code>//平台接入开关</code>
<code> </code><code>public</code>
<code>static</code> <code>bool</code> <code>isopenplatform =</code><code>false</code><code>;</code>
<code> </code>
<code> </code><code>//导入定义到.m文件中的c函数</code>
<code> </code><code>[dllimport(</code><code>"__internal"</code><code>)]</code>
<code> </code><code>private</code>
<code>static</code> <code>extern</code> <code>void</code> <code>_platforminit();</code>
<code> </code><code>//定义接口函数供游戏逻辑调用</code>
<code> </code><code>public</code>
<code>static</code> <code>void</code> <code>initsdk()</code>
<code> </code><code>{</code>
<code> </code><code>if</code>
<code>(isopenplatform)</code>
<code> </code><code>{</code>
<code> </code><code>_platforminit();</code>
<code> </code><code>}</code>
<code> </code><code>} </code>
<code>}</code>
2、编写与接口对应的objective-c函数:
<code>// myiossdk.h</code>
<code> </code>
<code>#import <foundation foundation.h=""></code>
<code>@</code><code>interface</code>
<code>myiossdk : nsobject</code>
<code>@end</foundation></code>
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
<code>// myiossdk.m</code>
<code>#import "myiossdk.h"</code>
<code>//这里引用sdk的头文件</code>
<code>#import "sdkplatform.h"</code>
<code>#if defined(__cplusplus)</code>
<code>extern</code>
<code>"c"</code><code>{</code>
<code>#endif</code>
<code> </code><code>extern</code>
<code>void</code> <code>unitysendmessage(</code><code>const</code>
<code>char</code> <code>*,</code><code>const</code>
<code>char</code> <code>*);</code>
<code>nsstring* _creatensstring (</code><code>const</code>
<code>char</code><code>*</code><code>string</code><code>);</code>
<code>//*****************************************************************************</code>
<code>@implementation myiossdk</code>
<code>//**********************</code>
<code>//message tools</code>
<code>+ (</code><code>void</code><code>)sendu3dmessage:(nsstring *)messagename param:(nsdictionary *)dict</code>
<code> </code><code>nsstring *param =</code><code>@""</code><code>;</code>
<code> </code><code>if</code>
<code>( nil != dict ) {</code>
<code> </code><code>for</code>
<code>(nsstring *key</code><code>in</code>
<code>dict)</code>
<code> </code><code>if</code>
<code>([param length] == 0)</code>
<code> </code><code>{</code>
<code> </code><code>param = [param stringbyappendingformat:</code><code>@"%@=%@"</code><code>, key, [dict valueforkey:key]];</code>
<code> </code><code>}</code>
<code> </code><code>else</code>
<code> </code><code>param = [param stringbyappendingformat:</code><code>@"&%@=%@"</code><code>, key, [dict valueforkey:key]];</code>
<code> </code><code>}</code>
<code> </code><code>unitysendmessage(</code><code>"sdk_object"</code><code>, [messagename utf8string], [param utf8string]);</code>
<code>//sdk fun</code>
<code>//初始化sdk</code>
<code>-(</code><code>void</code><code>)sdkinit</code>
<code> </code><code>sdkcfg *cfg = [[[sdkcfg alloc] init] autorelease];</code>
<code> </code><code>cfg.appid =123456;</code>
<code> </code><code>cfg.appkey =</code><code>@"aoaoaoaoaoaoaoaoaoaoaoaoaaoaoaoaoaoaoao"</code><code>;</code>
<code> </code><code>cfg.orientation = uideviceorientationlandscapeleft;</code>
<code> </code><code>//调用sdk的初始化函数</code>
<code> </code><code>[[sdkplatform defaultplatform] sdkinit:cfg];</code>
<code> </code><code>//添加回调监听</code>
<code> </code><code>[[sdkplatform defaultplatform] addobserver:self selector:@selector(snsinitresult:) name:(nsstring *)kinitnotification</code><code>object</code><code>:nil];</code>
<code>//获取用户id</code>
<code>-(nsstring*)sdkgetuserid</code>
<code> </code><code>[[sdkplatform defaultplatform] sdkgetuserid];</code>
<code>//call back fun</code>
<code>//初始化更新回调</code>
<code>- (</code><code>void</code><code>)snsinitresult:(nsnotification *)notify</code>
<code> </code><code>[myiossdk sendu3dmessage:</code><code>@"sdkmsginit"</code>
<code>param:nil];</code>
<code>@end</code>
<code> </code><code>//字符串转化的工具函数</code>
<code> </code><code>nsstring* _creatensstring (</code><code>const</code>
<code>char</code><code>*</code><code>string</code><code>)</code>
<code>(</code><code>string</code><code>)</code>
<code> </code><code>return</code>
<code>[nsstring stringwithutf8string:</code><code>string</code><code>];</code>
<code> </code><code>else</code>
<code>[nsstring stringwithutf8string:</code><code>""</code><code>];</code>
<code> </code><code>char</code><code>* _makestringcopy(</code><code>const</code>
<code>(null ==</code><code>string</code><code>) {</code>
<code>null;</code>
<code> </code><code>char</code><code>* res = (</code><code>char</code><code>*)malloc(strlen(</code><code>string</code><code>)+1);</code>
<code> </code><code>strcpy(res,</code><code>string</code><code>);</code>
<code> </code><code>return</code>
<code>res;</code>
<code> </code><code>static</code>
<code>myiossdk *mysdk;</code>
<code> </code><code>//供u3d调用的c函数</code>
<code> </code>
<code> </code><code>void</code>
<code>_platforminit()</code>
<code> </code><code>if</code><code>(mysdk==null)</code>
<code> </code><code>mysdk = [[myiossdk alloc]init];</code>
<code> </code><code>[lssdk sdkinit];</code>
<code> </code><code>//注意这个函数是返回字符串</code>
<code> </code><code>const</code>
<code>char</code><code>* _platformgetuin()</code>
<code> </code><code>if</code><code>(lssdk==null)</code>
<code> </code><code>lssdk = [[myiossdk alloc]init];</code>
<code>_makestringcopy([[lssdk sdkgetuserid] utf8string]);</code>
值得一提的是在上面的代码中特意写了一个返回字符串的例子,因为你要获取用户id
、昵称什么的。对应在cs文件中导入函数如下:
<code>[dllimport (</code><code>"__internal"</code><code>)]</code>
<code>private</code>
<code>static</code> <code>extern</code> <code>string</code> <code>_platformgetuin();</code>
这里的const
char* 会被c#自动转换成string因为在m文件中使用了内存申请,该段内存自然是处在堆内存中,这样转成string符合的内存管理机制,我们不用担心它的释放问题。
3、在你的工程目录中找个地方保存ios的文件
打包出xcode工程后导入进去,加入你的sdk就可以了。
有一点需要说明,如果存放目录为\assets\plugins\ios,那么unity3d会自动将该目录下的所有文件(暂不支持子文件夹)当做插件文件打包到xcode工程下的libraries目录下,这样你就不需要在手动添加了,否则会报错重复声明什么的。
这种文件各个平台会有多个,可以使用同一头文件且定义的c函数名也都相同,这样更有利于多版本管理。
二、ios to unity3d:
这个在上面的 mysdk.m 文件中已经有剧透了,就是利用unity3d
的unitysendmessage函数,其中参数1是场景中接受消息的对象,参数2是要执行的函数名,参数3为传入参数,只要按照如下步骤就可以实现这个机制:
1、在场景中创建一个对象用于接受ios消息,或者用现有的也可以;
2、为sdk消息写一个脚本,里面包含各种消息函数;
3、将脚本挂到之前创建的对象上完事;
需要注意:这个对象在场景切换时候要始终存在,或者你在每个场景中都加个这玩意也可以,总之只要能收到消息就行了;
另外,针对参数的传递对应上面的sendu3dmessage函数,我还在消息接受脚本中写过一个消息参数的解析:
<code>parsemsg(</code><code>string</code>
<code>msg,</code><code>out</code>
<code>dictionary<</code><code>string</code><code>,</code><code>string</code><code>=</code><code>""</code><code>> dicmsg){</code>
<code> </code><code>if</code><code>(</code><code>null</code>
<code>== msg || 0 == msg.length ){</code>
<code> </code><code>dicmsg =</code><code>null</code><code>;</code>
<code> </code><code>return</code><code>;</code>
<code> </code><code>dicmsg =</code><code>new</code>
<code>dictionary<</code><code>string</code><code>,</code><code>string</code><code>=</code><code>""</code><code>>();</code>
<code> </code><code>string</code><code>[] msgarray = msg.split(</code><code>‘&‘</code><code>);</code>
<code> </code><code>for</code><code>(</code><code>int</code>
<code>i=0; i<msgarray.length; i++){=</code><code>""</code>
<code>string</code><code>[]=</code><code>""</code>
<code>elementarray=</code><code>"msgarray[i].split(‘=‘);"</code>
<code>dicmsg.add(elementarray[0],elementarray[1]);=</code><code>""</code>
<code>}=</code><code>""</code>
<code>}<=</code><code>""</code>
<code>pre=</code><code>""</code><code>><br></code>
<code>这个我自己都还没有实际使用过,有错误自行解决大致是这样。</code>
<code><p></p></code>
<code><p><br></code>
<code></p></code>
<code><p>ps:关于sdk的接入还有 android版本的尚未研究网上有很多可以参照;</p></code>
<code><p>pps:sdk多版本管理和研究我也在摸索中,哪位大神比较熟悉不吝赐教,本人万分感激,之前到是看过这个http:</code><code>//www.xuanyusong.com/archives/2418#comments</p></code>
<code><p>ppps:转载请注明来自:http:</code><code>//blog.csdn.net/zhao_yin</p></code>
<code></p> </msgarray.length;></</code><code>string</code><code>,></</code><code>string</code><code>,></code>