Unity3d Android SDK接入解析(一)

一、前言


论学习心态:

每当进入一个新的工作环境,处于一种新的领域时,人总是会变得急功近利,特别是当任务紧急时,人总是会想着不断的从网上搜寻答案,不断的去寻问他人,十足的拿来主义,竟没有静下来自己思考与尝试过,回头看来,其实很多东西并没有当初认为的那么复杂,只是少了自己的一些总结和深思。

论问题本身:

关于Unity和Android的互相调用,网上的教程太多了,大同小异,抄来抄去。这次我就尝试着慢慢来,讲讲我的理解(简单的我会一笔带过,网上可以轻松找到答案,就不赘述了),希望大家看的时候并不是秉承着“拿来主义”,而是静下心来,一起知其然,知其所以然,如果有错误和不足,请在我的博客留言。

博客地址:http://blog.csdn.net/yang8456211

内容分为三部分,分三篇写完

  1. 前篇:Unity3d 与 Android之间的互相调用
  2. 中篇:Unity3d Android SDK的两种接入方式

    http://blog.csdn.net/yang8456211/article/details/51356193

  3. 后篇:Unity3d 接入Android Libriary的理解与实现

二、前篇:Unity3d 与 Android之间的互相调用


总体来说Unity3d与Android之间的互相调用,是通过Unity3d提供的classes.jar来实现的(具体实现在中篇说)。

那么下面假设已经按照要求建立好了Android的工程,并配置好了classes.jar,开始写调用:

2.1 Unity3d调用Android

最常见的写法:

1)首先在Android层写好接口u3dCall

这个方法只打印成功的提示:

    public void u3dCall() {
        Log.i(U2ATAG, "u3dCall Android Successful");
    }

2)在Unity3d cs脚本中调用Android

通过反射机制拿取对象并调用Android的接口u3dCall,这里我们画了一个Button,点击Button调用u3dCall接口:

        if(GUI.Button(new Rect(100,200,750,200),"U3dToAnd"))
        {
            AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
            jo.Call("u3dCall");
        } 

通过打印看到,我们成功的从Unity3d调用到了Android的代码。

(没有充满疑问?)

  1. 这个com.unity3d.player.UnityPlayer是什么东西?currentActivity又是什么?
  2. Call是个方法吧,那参数和返回值呢?是调用的什么类型的方法?

只有通过实践慢慢探索,才能知道真相

3)Unity3d调用Android接口的api

我们先说第二个问题,Call只是Unity3d调用Android所设置的api之一,还有一些常用的:
方法名 方法类型 说明
Call 实例 调用实例方法
Get 实例 获取实例变量(非静态)
Set 实例 设置实例变量(非静态)
CallStatic 静态 调用静态方法
GetStatic 静态 获取静态变量
SetStatic 静态 设置静态变量

通过这些方法,我们能够方便的调用静态方法、实例方法,还有获取变量的值。

如果Android的方法是需要传入参数的,则如下:

Android:

    public void u3dCallWithArgs(String str, int i) {
        Log.i(U2ATAG, "u3dCall Android Str|int is " + str + "|" + i);
    }

U3d:

            jo.Call("u3dCallWithArgs","Atany",100);  

成功调用:

如果需要返回值:

Android:

    public String u3dCallReturn() {
        return "This is the return Value of Android";
    }

U3d:

            string msg = jo.Call<string>("u3dCallReturn");
            print ("U3d msg is "+msg);

成功调用:

其他的方法类似,可以猜到jo = jc.GetStatic(“currentActivity”);的意思,就是通过GetStatic获取了静态变量currentActivity的值,它的类型是AndroidJavaObject(Unity3d的JavaObject的基本类型)。

4) 那UnityPlayer是什么?

通过反编译Unity3d生成的apk发现,UnityPlayer是FrameLayout的一个子类,而currentActivity则是UnityPlayer类中的静态对象。

致此,就弄明白了,这个UnityPlayer原来就是一个Unity3d生成的一个类,我们通过new(”完整类名”)的方式获取到了这个类,然后通过getStatic获取到了currentActivity这个静态对象。

(那么问题又来了,currentActivity这个类是怎么找到我写的方法的呢?)

5)MyActivity与currentActivity

我刻意的避开了中篇要讲的内容,但如果一点不提,感觉问题始终不能讲明白,所以这里就稍微说明一下。

在写Android工程的时候,网上一般要求我们建立了一个新的MyActivity继承UnityPlayerActivity,并在AndroidManifest中把MyActivity设置为启动的Activity,然后使用currentActivity这个jo来调用方法。

为什么要这么做呢?通过观察发现,他们的继承关系是这样的:

MyActivity <-- UnityPlayerActivity <--UnityPlayerNativeActivity <-- NativeActivity<-- Activity

(然而里面并没有com.unity3d.player.UnityPlayer这个class?)

继续查找源码发现,在 UnityPlayerNativeActivity 这个类中,声明了一个UnityPlayer对象

在oncreate方法里面初始化了这个对象,把UnityPlayerNativeActivity上下文作为参数传了进去

然后在UnityPlayer类的构造方法中,把当前的上下文赋值给了currentActivity

所以,我们使用的currentActivity 就是当前activity的上下文。写到这里,我还有一个疑问,就是currentActivity是拿到的UnityPlayerNativeActivity的上下文,但是是怎么调用到的Myactivity里面的方法的呢?希望知道的人告诉我。

2.2 Android调用Unity

如果想要异步的发送消息回Unity那么应该怎么处理呢?就是使用Unity3d的UnitySendMessage发送回去

Android:

    public void andToU3d() {
        UnityPlayer.UnitySendMessage(OBJNAME, "andToU3dCallback", "exit");
    }

U3d:

    void andToU3dCallback(string str){
        print ("andToU3dCallback string is "+str);
    }

杨光(atany)原创,转载请注明博主与博文链接,未经博主允许,禁止任何商业用途。

博文地址:http://blog.csdn.net/yang8456211/article/details/51331358

博客地址:http://blog.csdn.net/yang8456211

本文遵循“署名-非商业用途-保持一致”创作公用协议

时间: 2024-10-19 18:47:40

Unity3d Android SDK接入解析(一)的相关文章

Unity3d Android SDK接入解析(四)通用的Android SDK接入中间件

一.前言 接入Android SDK正式告一段落,在这段时间里面,依次接入了华为.应用宝.小米.360等等大大小小十来个SDK,也算对Unity接入渠道SDK有了较为全面的理解,对各个渠道的坑也算深有体会....在接入过程中时间比较紧张,没办法抽空来进行总结深思.今天正好有空,便对之前的接入SDK的代码进行了一次重构,写了一个比较通用的Unity接入Android SDK的中间件,前人栽树,后人乘凉. 进入正题 如果有对一些只是有疑问的,可以看看我之前的三篇文章: 传送门: Unity3d An

Unity3d Android SDK接入解析(二)Unity3d Android SDK的设计与两种接入方式

一.前言 上篇说清楚了Unity和Android调用的方式,但很多实际接入的部分没有讲的很详细,因为重头在这篇,会详细讲述具体接入Android SDK的方式,和怎么去做一个方便Unity接入的SDK. 传送门: 前篇:Unity3d 与 Android之间的互相调用 http://blog.csdn.net/yang8456211/article/details/51331358 后篇:Unity3d Android SDK接入解析(三)接入Android Library的理解 http://

unity3d android sdk更新下载

unity3d android sdk下载,在国内来说,访问不了外网,下载不到最新的sdk,对很多访问不了外网的开发者来说带来了很多麻烦,导致打版本各种出问题.这里我决定动态更新Android sdk 最新版本. 1> 版本:android-sdk_r24.0.2-windows 链接:http://pan.baidu.com/s/1mggMEko 密码:pn2c

GoBelieve Android SDK接入备忘

Android SDK版本 目前SDK只支持Android 2.2或以上版本的手机系统. AndroidManifest.xml配置 以下配置可以在IMDemo/AndroidManifest.xml 找到并直接拷贝放置进自己的应用工程中的AndroidManifest.xml文件对应的tag中. manifest 标签下添加: <!-- 必需: 权限配置 --> <uses-permission android:name="android.permission.INTERNE

android sdk目录解析

android sdk目录如下: 下面分别说明一下这些目录都有什么用处. add-ons 这里保存一些扩展库,比如Google Maps,当然如果安装啦OphoneSDK,这里也会有一些类库在里面. docs 安卓sdk api的参考文档,所有的api都可以在这里找到. extras 某些扩展插件 platforms Android的系统版本从1.0到现在的5.0,有好多个版本,每一个版本发布时都会有一个Google提供的sdk platform package供开发者使用.所以这个文件夹就是存

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

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

unity3d如何快速接入渠道SDK之Unity篇

首先我们讲一下,为什么要介绍这个插件? 是因为这个插件极大的简化了我对接渠道SDK的工作量,精力和时间,也避免了我不断的重复的做接入SDK工作这样没有成就感的无聊工作! 所以我就介绍一下这款插件!!!!!! 我的开发环境:windows系统 , eclipse , unity4.3.4 这款插件的工作方式是中间件加插件 这样的组合模式工作的. 所以需要先接入中间件. 对接过程: 1. 准备中间件工程对接(http://www.abctools.cn/documentCenter/toSdkDow

android sdk api结构解析

一.系统级:android.accounts android.app     1.OS 相关         android.os         android.os.storage         android.hardware(传感器)         android.security         android.drm(这个应该是为所有app服务的)     2.VM 相关         dalvik.system         dalvik.bytecode 二.程序框架  

SDK接入(2)之Android Google Play内支付(in-app Billing)接入

SDK接入(2)之Android Google Play内支付(in-app Billing)接入 继上篇SDK接入(1)之Android Facebook SDK接入整理完Facebook接入流程之后,再来整理下Google Play in-app Billing支付的接入流程.众所周知,Google Play是Google Android官方的应用商店,也是将应用发布到世界各地一个重要的渠道.支付作为盈利的一个重要手段,可以借助Google in-app Billing api来达到目的.