zoukankan      html  css  js  c++  java
  • unity3d中dllimport方法的使用,以接入腾讯平台为例!!!

    原地址:http://momowing.diandian.com/post/2012-12-14/40047766982

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

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

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

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

    说说原理吧先~

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


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

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

    用xcode打开他~

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

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

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

    上截图:


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

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

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


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

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

    上dllimport关联的方法


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

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

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



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


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


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

    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
        extern void UnitySendMessage(const char *, const char *, const char *);
                                               
    #if defined(__cplusplus)
    }
    #endif
                                                   
    @implementation TencentConector
                                           
    -(void)TencentInit{
        NSLog(@"***********tencentInit");
        _permissions =  [[NSArray arrayWithObjects:
                          @"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 {
        // 登录成功
        [self unity3dSentor:@"DidLogin" param:@" "];
    }
                                           
    /**
     * Called when the user dismissed the dialog without logging in.
     */
    - (void)tencentDidNotLogin:(BOOL)cancelled
    {
        if (cancelled){
            //@"用户取消登录";
            [self unity3dSentor:@"LoginCancel" param:@" "];
        }
        else {
            //@"登录失败";
            [self unity3dSentor:@"LoginFail" param:@" "];
        }
                                               
    }
                                           
    /**
     * Called when the notNewWork.
     */
    -(void)tencentDidNotNetWork
    {
        //@"无网络连接,请设置网络";
        [self unity3dSentor:@"NotNetWork" param:@" "];
                                           
    }
                                           
    /**
     * Called when the get_user_info has response.
     */
    - (void)getUserInfoResponse:(APIResponse*) response {
        if (response.retCode == URLREQUEST_SUCCEED)
        {
                                                   
                                                   
            NSMutableString *str=[NSMutableString stringWithFormat:@""];
            for (id key in response.jsonResponse) {
                [str appendString: [NSString stringWithFormat:@"%@:%@ ",key,[response.jsonResponse objectForKey:key]]];
            }
            [self unity3dSentor:@"UserInfoResponse" param:str];
                                                   
        }
        else {
            [self unity3dSentor:@"UserInfoResponseFail" param:@" "];
        }
    }
                                           
    -(void)unity3dSentor:(NSString *)methonName param:(NSString *)message{
        UnitySendMessage("TencentReceiver", [methonName UTF8String], [message UTF8String]);
    }
                                           
    @end
                                           
                                           
    #if defined(__cplusplus)
    extern "C"{
    #endif
                                               
        static TencentConector *sTencentConector;
                                               
        void Obj_TencentInit(){
            if(sTencentConector == NULL){
                sTencentConector = [[TencentConector alloc] init];
            }
            [sTencentConector TencentInit];
        }
                                               
        void Obj_TencentOAuth(){
            if(sTencentConector == NULL){
                sTencentConector = [[TencentConector alloc] init];
            }
            [sTencentConector TencentOAuth];
        }
                                               
        void Obj_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
    using System.Runtime.InteropServices;
    using UnityEngine;
                                     
    public class Tencent {
                                     
        [DllImport("__Internal")]
        private static extern void Obj_TencentInit();
                                     
        [DllImport("__Internal")]
        private static extern void Obj_TencentOAuth();
                                     
        [DllImport("__Internal")]
        private static extern void Obj_GetUserInfo();
                                     
                                     
                                     
                                     
        /// <summary>
        /// 初始化接入准备
        /// </summary>
        public static void TencentInit()
        {
            if (Application.platform == RuntimePlatform.IPhonePlayer)
            {
                Obj_TencentInit();
            }
        }
                                     
        /// <summary>
        /// qq登陆验证
        /// </summary>
        public static void TencentOAuth()
        {
            if (Application.platform == RuntimePlatform.IPhonePlayer)
            {
                Obj_TencentOAuth();
            }
        }
                                     
        /// <summary>
        /// 获取用户信息
        /// </summary>
        public static void GetUserInfo()
        {
            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
    using UnityEngine;
    using System.Collections;
    using LitJson;
                    
    public class TencentReceiver : MonoBehaviour {
                    
        public GUIText _Text;
                    
        void DidLogin(string pa)
        {
            this._Text.text = "login ok";
        }
                    
        void LoginCancel(string pa)
        {
            this._Text.text = "LoginCancel";
        }
                    
        void LoginFail(string pa)
        {
            this._Text.text = "LoginFail";
        }
                    
        void NotNetWork(string pa)
        {
            this._Text.text = "NotNetWork";
        }
                    
        void UserInfoResponse(string message)
        {
            this._Text.text = "UserInfoResponse";
                            
            string[] tData = message.Split(new char[1]{':'});
                            
            for(int i = 0; i < tData.Length; i ++){
                Debug.Log(tData[i]);
            }
                            
        }
                    
        void UserInfoResponseFail(string pa)
        {
            this._Text.text = "UserInfoResponseFail";
        }
    }

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

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

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

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

    好了,先拜了,有事qq我吧~344404266

  • 相关阅读:
    个人博客开发之blogapi项目统一结果集api封装
    个人博客开发之blogapi 项目整合JWT实现token登录认证
    C语言I博客作业06
    C语言l博客作业03
    C语言I博客作业04
    C语言I博客作业05
    C语言I博客作业01
    C语言I博客作业07
    C语言I博客作业02
    UVA 11427 Expect the Expected [概率]
  • 原文地址:https://www.cnblogs.com/123ing/p/3854095.html
Copyright © 2011-2022 走看看