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

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
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函数:

?
1
2
3
4
5
6
7
8
//  MyIOSSdk.h
 
 
# import <foundation foundation.h= "" >
 
@interface MyIOSSdk : NSObject
 
@end </foundation>

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
//  MyIOSSdk.m
 
# import "MyIOSSdk.h"
 
//这里引用SDK的头文件
# import "SDKPlatform.h"
 
# if defined(__cplusplus)
extern "C" {
#endif
     extern void UnitySendMessage( const char *, const char *, const char *);
     extern NSString* _CreateNSString ( const char * string);
# if defined(__cplusplus)
}
#endif
 
//*****************************************************************************
 
@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];
}
 
@end
 
 
//*****************************************************************************
 
# if defined(__cplusplus)
extern "C" {
#endif
     
     //字符串转化的工具函数
     
     NSString* _CreateNSString ( const char * string)
     {
         if (string)
             return [NSString stringWithUTF8String: string];
         else
             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]);
     }
     
# if defined(__cplusplus)
}
#endif

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

?
1
2
[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函数,我还在消息接受脚本中写过一个消息参数的解析:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
     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 ]);= "" }= "" }<= "" pre= "" ><br>
这个我自己都还没有实际使用过,有错误自行解决大致是这样。
<p></p>
<p><br>
</p>
<p>ps:关于SDK的接入还有 android版本的尚未研究网上有很多可以参照;</p>
<p><br>
</p>
<p>pps:SDK多版本管理和研究我也在摸索中,哪位大神比较熟悉不吝赐教,本人万分感激,之前到是看过这个http: //www.xuanyusong.com/archives/2418#comments</p>
<p><br>
</p>
<p>ppps:转载请注明来自:http: //blog.csdn.net/zhao_yin</p>
<p><br>
</p>                        </msgarray.length;></string,></string,>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值