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

说到有关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他一下

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

//
//  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:@"%@:%@\n",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的类,直接上代码:

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();
        }
    }

}
 

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

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


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。

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

unity3d中dllimport方法的使用,以接入腾讯平台为例!!!,布布扣,bubuko.com

时间: 2024-08-24 12:48:54

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

Unity3d中Update()方法的替身

在网上看到一些资料说Unity3d的Update方法是如何如何不好,影响性能.作为一个菜鸟,之前我还觉得挺好用的,完全没用什么影响性能的问题存在.现在发现确实有很大的问题,我习惯把一大堆检测判断放在Update中去执行,这种检测判断每帧都在执行,而往往其中的方法可能只执行一次或几次,这样确实对性能有很大的影响. 下面这种是我经常使用的写法: [javascript] view plaincopyprint? function Update () { if (!wait) { transform.

(转)Unity3D中移动物体位置的几种方法

1. 简介 在unity3d中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position. 2. 通过Transform组件移动物体 Transform 组件用于描述物体在空间中的状态,它包括 位置(position), 旋转(rotation)和 缩放(scale). 其实所有的移动都会导致position的改变,这里所说的通过Transform组件来移动物体,指的是直接操作Transform来控制物体的位置(position). 2.1 Transform.Tra

Unity3D中的系统调用方法

在Unity3D中有一些方法不是程序员手动调用的,而是Unity3d工具自身设计时就决定自动调用的,不过调用的时机和场合不同,下面就一一介绍一下: Awake:顾名思义,Unity3D的脚本苏醒时需要调用的方法,这个方法比Start方法执行的还要早,也是执行一次. Start:可以理解为类的构造函数,或者是init函数,用于初始化各种变量,仅执行一次. Update:类似于flash as3 onframe的回调函数,每帧均回调. Fixedupdate:每一帧都执行,处理Rigidbody时,

在Unity3d中解析Lua脚本的方法

由于近期项目中提出了热更新的需求,因此本周末在Lua的陪伴下度过.对Lua与Unity3d的搭配使用,仅仅达到了一个初窥门径的程度,记录一二于此.水平有限,欢迎批评指正. 网络上关于Lua脚本和Unity3d的配合使用的资料不多,例子工程大多相同.大概了解到针对性的插件有uLua.UniLua.KopiLua三种.试用了前两种,抛开效率与安全性不说,感觉uLua试用起来比较简单,本文只介绍uLua的使用步骤. uLua的原理是在Unity3d中解析字符串形式的Lua脚本,让Lua与C#相互传递参

ShareREC在Unity3D中无法录制视频的解决方法

最近有一些同学问到ShareREC集成到Unity3D中提示:#warning:无法录制当前应用! 这是由于Unity3D在4.6.3之后加入了对Metal框架的支持,导致ShareREC无法进行录制(目前ShareREC不支持录制Metal框架). 解决的办法就是把Metal给禁用掉,操作方法如下: 1.先从Unity3D中导出XCode工程 2.定位到UnityAppController+Rendering.mm文件,找到IsMetalSupported方法,把里面的内容注释掉,只保留ret

Unity3D中的Coroutine详解

Unity中的coroutine是通过yield expression;来实现的.官方脚本中到处会看到这样的代码. 疑问: yield是什么? Coroutine是什么? unity的coroutine程序执行流程怎么那么奇怪? unity中的coroutine原理是什么,怎么实现的? 使用unity的coroutine需要注意什么问题? 一.yield的在几种语言中的程序执行特性: Lua中的yield是使得协同函数运行->挂起并且传递参数给resume.resume使得协同函数挂起->运行

Unity3D中定时器的使用

源地址:http://unity3d.9tech.cn/news/2014/0402/40149.html 在游戏设计过程中定时器是必不可少的工具,我们知道update方法是MonoBehavior中一个人人皆知的定时器方法,每帧都在调用,那还有其他什么定时器的方法呢,这里介绍一下. 1.Invoke(string methodName,float time) 在一定时间调用methodName函数 1 2 3 4 5 6 7 8 9 10 11 12 13 using UnityEngine;

Unity3D中灵活绘制进度条

有时我们需要在Unity3D中绘制进度条,如:           或        如果使用4.6版本以下的unity绘制环形的进度条可能需要费点劲.我搜到的大多数方法都是用NGUI插件,但有时只是为了简单的画一个环形UI,使用NGUI反而还增加了学习成本.有一个利用CutOut材质的方法能够利用alpha值,灵活的控制进度条中需要显示的部分,以环形进度条为例,方法如下: 1.在PS中制作一张如下所示的图,RGB为进度条想要的颜色,alpha值从5-250环形渐变(如果从0-255,在进度为0

Unity3D中使用KiiCloud总结一

Kii Cloud简介 Kii Cloud提供一系列的服务,来帮助你为你的App获取用户,留住用户,以及创造利润.它为移动App提供了用户管理以及快捷安全可扩展的数据存储服务. 现在你可以在短短几分钟内为你的App添加一个后端服务.Kii Cloud通过为你提供一个可扩展的后端服务,来帮助你节省大量的时间和金钱.因为不需要写一行服务端的代码,你不必去招聘(或者变成)一个服务端工程师或者DBA.我们会保证提供安全,可靠以及可扩展的服务,这样你只需要专注于优化你的App,改善用户体验以及在App S