说到有关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:@""
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[]{':'}); for(int i = ; 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方法的使用,以接入腾讯平台为例!!!的更多相关文章

  1. Unity3d中Update()方法的替身

    在网上看到一些资料说Unity3d的Update方法是如何如何不好,影响性能.作为一个菜鸟,之前我还觉得挺好用的,完全没用什么影响性能的问题存在.现在发现确实有很大的问题,我习惯把一大堆检测判断放在U ...

  2. 一不注意,在Unity3D中DllImport 引起的Bug.

    单要说这个Bug是很简单,但是得从头说起. 一些大型的网络游戏,或者加载比较多的一些场景时,如果要等待所有模型,贴图等各种资源文件加载完毕才能执行游戏,对用户将会是一个很头大的事情.所以就需要用到动态 ...

  3. Unity3D中C#和js方法相互调用

    通过查找资料,Unity3D中C#和js要相互调用彼此的方法,js文件必须放在"Standard Assets". "Pro Standard Assets" ...

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

    1. 简介 在unity3d中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position. 2. 通过Transform组件移动物体 Transform 组件用于描述物体在 ...

  5. 在Unity3d中解析Lua脚本的方法

    由于近期项目中提出了热更新的需求,因此本周末在Lua的陪伴下度过.对Lua与Unity3d的搭配使用,仅仅达到了一个初窥门径的程度,记录一二于此.水平有限,欢迎批评指正. 网络上关于Lua脚本和Uni ...

  6. Unity3D中C#和JS的方法互相調用

    因为Unity3D中一些腳本的方法仅仅能用在JS中.在C#中是無效的,而C#能够與服務器端通訊,JS本身卻不行.所以勢必會遇到這兩種語言腳本中方法的互相調用,下面是演示样例. 兩個文件 test1.j ...

  7. Unity3d中模型导入轴向不对的解决方法

    在unity3d中导入模型,经常会遇到模型的轴向与unity中默认的轴向不符合的情况. 网上有很多解决办法都是说在3dmax中导出模型时修改模型的轴向,那么我接下来讲的就是如何在unity里面修改模型 ...

  8. UE4/Unity3D中同时捕获多高清摄像头的高效插件

    本文主要讲实现过程的一些坑. 先说下要实现的目标,主要功能在UE4/Unity中都要用,能同时捕获多个摄像头,并且捕获的图片要达到1080p25桢上,并且需要经过复杂的图片处理后丢给UE4/Unity ...

  9. 【Unity3d游戏开发】Unity3D中的3D数学基础---向量

    向量是2D.3D数学研究的标准工具,在3D游戏中向量是基础.因此掌握好向量的一些基本概念以及属性和常用运算方法就显得尤为重要.在本篇博客中,马三就来和大家一起回顾和学习一下Unity3D中那些常用的3 ...

随机推荐

  1. SSD1306驱动的OLED实验

    [转]http://bbs.21ic.com/icview-434543-1-1.html 前面几章的实例,均没涉及到液晶显示,这一章,我们将向大家介绍OLED的使用.在本章中,我们将使用战舰STM3 ...

  2. [转]命令行 Subversion 入门

    http://omyyal.iteye.com/blog/1762831 命令行 Subversion 入门 如果您参与的项目正在使用 Subversion 进行版本控制,您将需要使用 Subvers ...

  3. 博客导出工具(C++实现,支持sina,csdn,自定义列表)

    操作系统:windowAll 编程工具:visual studio 2013 编程语言:VC++ 最近博文更新的较频繁,为了防止账号异常引起csdn博文丢失,所以花了点时间做了个小工具来导出博文,用做 ...

  4. [目录]Pentaho Kettle解决方案:使用PDI构建开源ETL解决方案

    第一部分:开始 1         ETL入门 1.1   OLTP和数据仓库对比 1.2   ETL是什么 1.2.1          ETL解决方案的演化过程 1.2.2          ET ...

  5. Android 文档之viewAnimator

    一.结构 public class ViewAnimator extends FrameLayout java.lang.Object android.view.View android.view.V ...

  6. ios中怎么样转行大小写

    转换大小写:lowercaseString(小写) uppercaseString(大写)

  7. Linux 进程(一):环境及其控制

    进程环境 main启动 当内核执行C程序时,在调用main前先调用一个特殊的启动例程.可执行程序将此启动例程指定为程序的起始地址,接着启动例程从内核中取出命令行参数和环境变量值,然后执行main函数. ...

  8. Linux C 文件与目录4 将缓冲区数据写入磁盘

    将缓冲区数据写入磁盘 所谓缓冲区,是Linux系统对文件的一种处理方式.在对文件进行写操作时,并没有立即把数据写入到磁盘,而是把数据写入到缓冲区.如果需要把数据立即写入到磁盘,可以使用sync函数.用 ...

  9. [shell基础]——算术运算

    shell只支持整数运算.一般可用let.expr.declare.$[]实现. 更精准的运算建议使用Linux下的bc工具——一款高精度计算语言. 1. let是shell内建的整数运算命令 ## ...

  10. 【BZOJ 2324】 [ZJOI2011]营救皮卡丘

    Description 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的踏上了营救皮卡丘的道路. 火箭队一共有N个据点,据点 ...