Unity3d Android SDK接入解析(一)Unity3d 与 Android之间的互相调用

本文详细介绍了Unity3D与Android之间的互相调用方法,包括如何在Unity3D中调用Android代码及如何从Android调用Unity3D方法。文章通过具体示例讲解了调用过程及常见API的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

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

  1. 前篇:Unity3d 与 Android之间的互相调用
  2. 中篇:Unity3d Android SDK的两种接入方式 
    http://blog.youkuaiyun.com/yang8456211/article/details/51356193
  3. 后篇:Unity3d 接入Android Libriary的理解与实现 
    http://blog.youkuaiyun.com/yang8456211/article/details/51435465

二、前篇: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");
    }
 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

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");  
        } 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

通过打印看到,我们成功的从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);
    }
 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

U3d:

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

成功调用: 

如果需要返回值: 
Android:

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

U3d:

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

成功调用: 

其他的方法类似,可以猜到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");
    }

 
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

U3d:

    void andToU3dCallback(string str){
        print ("andToU3dCallback string is "+str);
    }感谢博主的分享,博主地址 http://blog.youkuaiyun.com/yang8456211
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值