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,>

  


Unity3d与iOS交互开发——接入平台SDK必备技能,布布扣,bubuko.com

时间: 2024-12-26 14:02:17

Unity3d与iOS交互开发——接入平台SDK必备技能的相关文章

Unity3d与iOS交互开发

一.Unity3d  To  iOS: 最近要做一个商品和人体模型T台秀相关的功能,要用到Unity3D,搜集了一些资料先保存下来. 1.创建一个C#文件 SdkToIOS.cs 这是调用iOS函数的接口: [csharp] view plain copy print? public class SdkToIOS: MonoBehaviour { //平台接入开关 public static bool isOpenPlatform = false; //导入定义到.m文件中的C函数 [DllIm

UNITY3D与iOS交互解决方案

原地址:http://bbs.18183.com/thread-456979-1-1.html 本帖最后由 啊,将进酒 于 2014-2-27 11:17 编辑 "授人以鱼,不如授人以渔",以UNITY3D调用iOS版的91SDK为例,利用C# / C / OBJ-C 交互原理,本文将详细介绍UNITY3D与iOS之间交互的解决方案. 首先,打开XCODE新建一个空项目,参照91SDK开发文档将91SDK引入并进行环境配置. 配置完毕后创建一个名为"LsSdkConector

iOS应用开发 iOS开发 iOS软件定制

ios应用开发入门课程:ios安装工具 要开发一个应用,就必须用到 iOS 软件开发套件(SDK)以及苹果公司的集成式开发环境(IDE)Xcode.要创建一款优秀的 iPhone.iPod touch 和 iPad 应用,Xcode 可以满足你所有 的需要.其内容有源代码编辑器.图形用户界面编辑器以及其他多种功能,从可定制构建到源代码仓库管理等.Xcode 采用单窗口的形式,并将这种形式称为"工作区窗口",你所需要的大 部分数据都在这个工作区窗口里面.熟悉 Xcode 以后,你就能轻松

iOS 平台 Cocos2d-x 项目接入新浪微博 SDK 的坑

iOS 平台 Cocos2d-x 项目接入新浪微博 SDK 的坑 最近在做一个 iOS 的 cocos2d-x 项目接入新浪微博 SDK 的时候被“坑”了,最后终于顺利的解决了.发现网上也有不少人遇到一样的问题,但是能找到的数量有限的解决办法写得都不详细,很难让人理解,我来深入的写一写. 我的开发环境 Mac OS X 10.10.1 Xcode 6.1.1 (6A2008a) Cocos2d-x 3.2 新浪微博 SDK for iOS 2015 年 1 月 5 日从 github clone

《转》iOS 平台 Cocos2d-x 项目接入新浪微博 SDK 的坑

最近在做一个 iOS 的 cocos2d-x 项目接入新浪微博 SDK 的时候被“坑”了,最后终于顺利的解决了.发现网上也有不少人遇到一样的问题,但是能找到的数量有限的解决办法写得都不详细,很难让人理解,我来深入的写一写. 我的开发环境 Mac OS X 10.10.1 Xcode 6.1.1 (6A2008a) Cocos2d-x 3.2 新浪微博 SDK for iOS 2015 年 1 月 5 日从 github clone 的版本 遇到的问题 根据新浪微博 SDK 附带的文档接入项目后,

开发腾讯移动游戏平台SDK ios版Ane扩展 总结

本文记录了在开发 腾讯移动游戏平台SDK(MSDK) ios版Ane扩展 过程中所遇到的问题 文中非常多问题都是基础的问题.对object c和xcode配置了解不深入导致的.(没办法,开发ane的程序猿大部分都是做ActionScript的,一般对c/c++都没有开发经验) 问题一.编译报错:Unexpected '@' in program 代码例如以下: @try{ } @catch{ } 原因是高版本号xcode代码放在低版本号xcode下跑,低版本号ios 不支持这样的写法(ios 7

福利:unity3d对接SDK神器50家渠道全覆盖,一站式接入渠道SDK插件 abctools

在游戏开发完成后,最烦最累的活是什么?  ----------------就是接入联运渠道SDK,为什么呢?  ----------------第一,接入时要看文档,接入出现问题要问对方,如果对方有空还好,没空就只能等或者自己看着办.  ----------------第二,每个渠道都有自己的小要求,比如,ICON中加个角标,启动页,退出页,暂停页,悬浮框等等要求,他们提供的接口可以说最好是全部接入,不然就有被渠道测试人员踢回来的风险.  ----------------第三,当你开心的接好了一

iOS之 接入新浪微博 SDK(微信支付) 的坑(registerApp 的问题)

最近在做一个 iOS 的 cocos2d-x 项目接入新浪微博 SDK 的时候被"坑"了,最后终于顺利的解决了.发现网上也有不少人遇到一样的问题,但是能找到的数量有限的解决办法写得都不详细,很难让人理解,我来深入的写一写. 我的开发环境 Mac OS X 10.10.1 Xcode 6.1.1 (6A2008a) Cocos2d-x 3.2 新浪微博 SDK for iOS 2015 年 1 月 5 日从 github clone 的版本 遇到的问题 根据新浪微博 SDK 附带的文档接

Unity3d使用蓝牙(bluetooth)开发IOS点对点网络游戏

著作权声明:本文由http://www.cnblogs.com/icker 原创,欢迎转载分享.转载时请保留该声明和作者博客链接,谢谢! 最近使用Unity3d制作的IOS游戏需要加入联网对战功能功能,因此使用ObjC语言利用IOS SDK的GameKit.framework的Peer-to-peer Connectivity实现了网络连接,在此分享. 啥话都不说,先上代码.点我下载工程文件, 类NetWorkP2P,继承自NSObject.提供GKSessionDelegate和GKPeerP