unity3d中dllimport方法的使用,以接入腾讯平台为例!!!

摘要:
说到dllimport方法,可能很多人都不熟悉,其实我自己也说不清楚。我可能会说什么时候使用它。事实上,该功能类似于调用Android的第三个包。如果我们想在苹果或第三平台上使用特定的API,我们将使用这个叫做dllimport的函数。我们可以将这里的方法理解为ios自己的方法。这些方法不能统一调用,因此我们现在引用dllimport方法来引用这三种方法。对于与dllimport相关的方法,请注意,我在@end之后开始编写外链方法。方法名为Obj_开头表示统一引用的Obj-c方法。

   转载自:http://momowing.diandian.com/post/2012-12-14/40047766982

  如果有侵权,请通知我尽快删除!

说到有关dllimport方法可能还有很多人比较陌生,其实我自己也说不太清楚,大概说说什么时候要用它。

事实上功能类似于调用android的第三包,我们想要使用苹果上特定的api或者第三方平台的一些东西(现在很少第三方平台会为unity做独立的插件吧),我们就会用到这个叫dllimport的功能。

今天接了一下腾讯的平台,就拿它来做一个记录好了,免得我到时候又忘记了。

ios用的是obj-c,说实话对这个语言一窍不通还,大概看了一下,把握了一下demo里面的使用方法,所以有一些SB的地方也请原谅。

说说原理吧先~

在xcode中创建一个类文件,里面写好我们需要调用的方法,比如登陆啊,获取个人信息啊之类的方法,这些都是调用第三方包里腾讯封装好的功能:

unity3d中dllimport方法的使用,以接入腾讯平台为例!!!第1张

熟悉obj-c的应该一眼就明白了。这个就是需要登陆验证的方法,就先来试试怎么调用这个方法吧~

现在把您手上的unity项目切换一下平台到ios,然后把他build出来,事实上这个时候我们得到的是一个xcode项目。(我这里习惯这个顺序,您也可以等会儿把我的方法倒过来顺序做)。

用xcode打开他~

在class文件夹下建一个obj-c的普通类,取名叫TencentConector得了。在xcode我们会得到两个文件一个“TencentConector.h”一个“TencentConector.m”。

现在按照腾讯的在线文档说的加入sdk中的三个文件夹(怎么加入就不细说了,或者我有空会补充)。

接着在同样按照官方说明在头文件(.h那个)里面创建两个变量。

上截图:

unity3d中dllimport方法的使用,以接入腾讯平台为例!!!第2张

到这里其实跟官方的demo是一样的,没有说明差别。

接着是书写.m这个文件了:

我这里需要调用到3个方法,分别是初始化、验证、和获取个人信息。

unity3d中dllimport方法的使用,以接入腾讯平台为例!!!第3张

这三个方法其实除了名称我变一下,内容就是抄demo里面的了,都是调用腾讯自己的api。

我们可以把这里的方法理解成是ios自己的方法,这些方法由于unity里面不能调用,所以我们现在引用dllimport的方法引用这三个方法。

上dllimport关联的方法

unity3d中dllimport方法的使用,以接入腾讯平台为例!!!第4张

注意我这里是在@end后面开始写外链方法,方法名都以Obj_开头表示是给unity引用的obj-c方法。

我创建了一个静态变量,用来调用上面所写的方法。

接着补充一下腾讯的一些回调方法,和调用方法放在一块:

unity3d中dllimport方法的使用,以接入腾讯平台为例!!!第5张

unity3d中dllimport方法的使用,以接入腾讯平台为例!!!第6张

大家可能注意到我这里使用了之前说的UnitySendMassage方法。

unity3d中dllimport方法的使用,以接入腾讯平台为例!!!第7张

好吧,为了调用这个方法,我们需要同样dllimport他一下

unity3d中dllimport方法的使用,以接入腾讯平台为例!!!第8张

于是整个文件就是这样了:

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
130
131
132
133
134
//
//  TencentConector.m
//  tencentOAuthDemo
//
//  Created by MacMini on 12-12-14.
//
//
                                        
#import "TencentConector.h"
                                        
#if defined(__cplusplus)
extern"C"{
#endif
    externvoidUnitySendMessage(constchar*, constchar*, constchar*);
                                            
#if defined(__cplusplus)
}
#endif
                                                
@implementationTencentConector
                                        
-(void)TencentInit{
    NSLog(@"***********tencentInit");
    _permissions =  [[NSArrayarrayWithObjects:
                      @"get_user_info",@"add_share", @"add_topic",@"add_one_blog", @"list_album",
                      @"upload_pic",@"list_photo", @"add_album", @"check_page_fans",nil] retain];
                                            
                                            
    _tencentOAuth = [[TencentOAuth alloc] initWithAppId:@"100266567"
                                            andDelegate:self];
    _tencentOAuth.redirectURI = @"www.qq.com";
                                        
}
                                        
-(void)TencentOAuth{
     NSLog(@"***********tencentAuth");
    [_tencentOAuth authorize:_permissions inSafari:NO];
}
                                        
-(void)GetUserInfo{
    [_tencentOAuth getUserInfo];
}
                                        
/**
 * Called when the user successfully logged in.
 */
- (void)tencentDidLogin {
    // 登录成功
    [selfunity3dSentor:@"DidLogin"param:@" "];
}
                                        
/**
 * Called when the user dismissed the dialog without logging in.
 */
- (void)tencentDidNotLogin:(BOOL)cancelled
{
    if(cancelled){
        //@"用户取消登录";
        [selfunity3dSentor:@"LoginCancel"param:@" "];
    }
    else{
        //@"登录失败";
        [selfunity3dSentor:@"LoginFail"param:@" "];
    }
                                            
}
                                        
/**
 * Called when the notNewWork.
 */
-(void)tencentDidNotNetWork
{
    //@"无网络连接,请设置网络";
    [selfunity3dSentor:@"NotNetWork"param:@" "];
                                        
}
                                        
/**
 * Called when the get_user_info has response.
 */
- (void)getUserInfoResponse:(APIResponse*) response {
    if(response.retCode == URLREQUEST_SUCCEED)
    {
                                                
                                                
        NSMutableString*str=[NSMutableStringstringWithFormat:@""];
        for(idkey in response.jsonResponse) {
            [str appendString: [NSStringstringWithFormat:@"%@:%@\n",key,[response.jsonResponse objectForKey:key]]];
        }
        [selfunity3dSentor:@"UserInfoResponse"param:str];
                                                
    }
    else{
        [selfunity3dSentor:@"UserInfoResponseFail"param:@" "];
    }
}
                                        
-(void)unity3dSentor:(NSString*)methonName param:(NSString*)message{
    UnitySendMessage("TencentReceiver", [methonName UTF8String], [message UTF8String]);
}
                                        
@end
                                        
                                        
#if defined(__cplusplus)
extern"C"{
#endif
                                            
    staticTencentConector *sTencentConector;
                                            
    voidObj_TencentInit(){
        if(sTencentConector == NULL){
            sTencentConector = [[TencentConector alloc] init];
        }
        [sTencentConector TencentInit];
    }
                                            
    voidObj_TencentOAuth(){
        if(sTencentConector == NULL){
            sTencentConector = [[TencentConector alloc] init];
        }
        [sTencentConector TencentOAuth];
    }
                                            
    voidObj_GetUserInfo(){
        if(sTencentConector == NULL){
            sTencentConector = [[TencentConector alloc] init];
        }
        [sTencentConector GetUserInfo];
    }
                                        
#if defined(__cplusplus)
    }
#endif

需要的话可以下载:

头文件:http://www.kuaipan.cn/file/id_12421281643248500.htm

m文件:http://www.kuaipan.cn/file/id_12421281643248503.htm

最后就是在unity里面通过调用申明好的外链方法实现两部分关联了:

创建一个Tencent的类,直接上代码:

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
usingSystem.Runtime.InteropServices;
usingUnityEngine;
                                  
publicclassTencent {
                                  
    [DllImport("__Internal")]
    privatestaticexternvoidObj_TencentInit();
                                  
    [DllImport("__Internal")]
    privatestaticexternvoidObj_TencentOAuth();
                                  
    [DllImport("__Internal")]
    privatestaticexternvoidObj_GetUserInfo();
                                  
                                  
                                  
                                  
    /// <summary>
    /// 初始化接入准备
    /// </summary>
    publicstaticvoidTencentInit()
    {
        if(Application.platform == RuntimePlatform.IPhonePlayer)
        {
            Obj_TencentInit();
        }
    }
                                  
    /// <summary>
    /// qq登陆验证
    /// </summary>
    publicstaticvoidTencentOAuth()
    {
        if(Application.platform == RuntimePlatform.IPhonePlayer)
        {
            Obj_TencentOAuth();
        }
    }
                                  
    /// <summary>
    /// 获取用户信息
    /// </summary>
    publicstaticvoidGetUserInfo()
    {
        if(Application.platform == RuntimePlatform.IPhonePlayer)
        {
            Obj_GetUserInfo();
        }
    }
                                  
                                      
}

对于外链方法我们再用一个静态方法进一步封装,方便其他类调用。

比如我可以通过按钮点击触发:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if(GUILayout.Button("Tencent Init"))
{
    Tencent.TencentInit();
}
                              
if(GUILayout.Button("QQ Author"))
{
    Tencent.TencentOAuth();
}
                              
if(GUILayout.Button("QQ Info"))
{
    Tencent.GetUserInfo();
}

现在在build一个版本到刚刚的位置,注意:不要覆盖(replace),而是整合(append)。

现在就可以实现基本的调用了,然后是回调。

回调时我们通过UnitySendMassage方法想一个叫TencentReceiver的gameobject发送了信息,所以我们在unity当前场景需要创建一个同名的gameobject,为他附上一个脚本,姑且也叫TencentReceiver。

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
usingUnityEngine;
usingSystem.Collections;
usingLitJson;
                 
publicclassTencentReceiver : MonoBehaviour {
                 
    publicGUIText _Text;
                 
    voidDidLogin(stringpa)
    {
        this._Text.text = "login ok";
    }
                 
    voidLoginCancel(stringpa)
    {
        this._Text.text = "LoginCancel";
    }
                 
    voidLoginFail(stringpa)
    {
        this._Text.text = "LoginFail";
    }
                 
    voidNotNetWork(stringpa)
    {
        this._Text.text = "NotNetWork";
    }
                 
    voidUserInfoResponse(stringmessage)
    {
        this._Text.text = "UserInfoResponse";
                         
        string[] tData = message.Split(newchar[1]{':'});
                         
        for(inti = 0; i < tData.Length; i ++){
            Debug.Log(tData[i]);
        }
                         
    }
                 
    voidUserInfoResponseFail(stringpa)
    {
        this._Text.text = "UserInfoResponseFail";
    }
}

姑且草草写了一下,赶着下班。现在发布吧,试试就知道了~

然后是刚刚几个源码文件:

Tencent.cs:http://www.kuaipan.cn/file/id_12421281643248499.htm

TencentReceiver:http://www.kuaipan.cn/file/id_12421281643248502.htm

免责声明:文章转载自《unity3d中dllimport方法的使用,以接入腾讯平台为例!!!》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇微信小程序——data-*自定义属性应用开发框架之——数据字典、原数据、模板下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用AVPro Video在Unity中播放开场视频(CG)笔记

游戏需要添加开场CG,调研在Unity中播放视频,采用的插件为AVPro Video,Unity版本为2018.4.0f1 Asset Store:AVPro Video - Core Android Edition 官方文档:https://www.renderheads.com/content/docs/AVProVideo/articles/intr...

【Unity】透明物体显示问题

总结一下Shader开启透明渲染后的一些显示问题的解决方案,考虑Zwrite,Ztest,Queue这三个属性的设置问题。 首先需要记住的是: 对于不透明物体,渲染的正确顺序是从前往后; 对于半透明物体。渲染的顺序是从后往前。 这样才能实现正确的渲染输出。 注意:Alpha Test,Alphato Coverage不在讨论之列。这里涉及到的是使用Alph...

Unity3D获取系统当前时间,并格式化显示

Unity 获取系统当前时间,并格式化显示。通过“System.DateTime”获取系统当前的时间,然后通过格式化把获得的时间格式化显示出来,具体如下: 1、打开Unity,新建一个空工程,Unity界面如下图 2、在工程中新建一个脚本,可以命名为“CurrrentTimeTest”,选中“CurrrentTimeTest”,双击打开脚本。 3、在打...

Unity小知识点大全(二)

51.Inspector调试模式 在Inspector面板右上角的下拉菜单中,选择Debug命令,启动调试模式,此时将显示组件包含的所有变量,包括私有变量,当运行编辑器时,可以实时查看各组件所有变量的变化。 52.高亮显示Debug.Log对应的游戏对象 当使用Debug.Log方法输出信息时,可将gameObject作为此方法的第二个参数,当程序运行时...

Unity + NGUI 实现人物头顶UI的信息展示

1、思路:   (1)信息数据:需要展示属性信息   (2)信息的展示:负责显示UI属性信息   (3)UI的跟随:负责实现UI对人物的跟随   (4)UI的管理:负责对UI进行创建于回收,游戏中需要用到UI的地方都是与该脚本的交互。 2、将需要用到的UI资源打到一个图集中,以免出现大量人物的时候图集穿插造成不良的影响。 3、创建一个头顶UI预设,当道对应...

Unity 实用的设置技巧

一、高亮选择 在 Scene 面板右上角的Gizom 下拉列表中,可以通过设置 Selection Outline 选项决定是否在选中物体时显示边缘的高亮标识。 二、Pixel Perfect Camera 在摄像机上挂载 Pixel Perfect Camera 组件能够使2D 像素风格的游戏画面更加整洁。但这个组件需要使用 Package Manag...