天天看點

Unity3d與iOS互動開發——接入平台SDK必備技能

<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 &lt;foundation foundation.h=""&gt;</code>

<code>@</code><code>interface</code>

<code>myiossdk : nsobject</code>

<code>@end&lt;/foundation&gt;</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>@"&amp;%@=%@"</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&lt;</code><code>string</code><code>,</code><code>string</code><code>=</code><code>""</code><code>&gt; 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&lt;</code><code>string</code><code>,</code><code>string</code><code>=</code><code>""</code><code>&gt;();</code>

<code>        </code><code>string</code><code>[] msgarray = msg.split(</code><code>‘&amp;‘</code><code>);</code>

<code>        </code><code>for</code><code>(</code><code>int</code>

<code>i=0; i&lt;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>}&lt;=</code><code>""</code>

<code>pre=</code><code>""</code><code>&gt;&lt;br&gt;</code>

<code>這個我自己都還沒有實際使用過,有錯誤自行解決大緻是這樣。</code>

<code>&lt;p&gt;&lt;/p&gt;</code>

<code>&lt;p&gt;&lt;br&gt;</code>

<code>&lt;/p&gt;</code>

<code>&lt;p&gt;ps:關于sdk的接入還有 android版本的尚未研究網上有很多可以參照;&lt;/p&gt;</code>

<code>&lt;p&gt;pps:sdk多版本管理和研究我也在摸索中,哪位大神比較熟悉不吝賜教,本人萬分感激,之前到是看過這個http:</code><code>//www.xuanyusong.com/archives/2418#comments&lt;/p&gt;</code>

<code>&lt;p&gt;ppps:轉載請注明來自:http:</code><code>//blog.csdn.net/zhao_yin&lt;/p&gt;</code>

<code>&lt;/p&gt;                        &lt;/msgarray.length;&gt;&lt;/</code><code>string</code><code>,&gt;&lt;/</code><code>string</code><code>,&gt;</code>