Unity3D入门(四) : Android和Unity3D交互 - Unity调用Android

1. 前言

上篇文章,我们讲了如何通过Android调用Unity3D。这篇文章,我们来讲一下Unity3D怎么调用Android。

1.1 unity和Android的三种通信方式

  • Unity官方提供的接口 : 有一个弊端,它有一个传输内容量的一个限制,传输内容过大或过快的时候,会出现丢东西或崩溃的情况。
  • tcp / udp 通信: 通过socket发送和接收,通过本机地址127.0.0.1进行通讯。
  • jni : 用C++写一个中转站,生成so库,Android和Unity C#脚本分别调用这个so库。

这里我们只具体介绍一下Unity官方提供的接口,其他方式感兴趣的童鞋可以自行去了解。

2. Unity调用Android

Unity中调用Android,需要Android 新建一个Module,相关的java类放到这个Module中,然后打包生成aarjar包,再放到Unity项目下。

Unity中通过AndroidJavaClassAndroidJavaObject这两个类来调用Java方法。

2.1 Android打包生成aar/jar

新建一个Android项目,并新建一个module,在这个module中新建一个类MyTest.java

java 复制代码
package com.heiko.mylibrary;

import android.util.Log;

public class MyTest {
    public static String LOG = "MY-LOG3";

    public String name= "Heiko3";

    public static void setLog(String log) {
        LOG = log;
        Log.d(LOG, "SetLog:" + log);
    }

    public static String getLog() {
        Log.d(LOG, "GetLog:" + LOG);
        return LOG;
    }

    public void setName(String name) {
        this.name = name;
        Log.d(LOG, "setName:" + name);
    }

    public String getName() {
        Log.d(LOG, "getName:" + name);
        return this.name;
    }
}

然后Android打包生成aar或jar包

jar包位于这个路径

aar位于这个路径

如果要用到resources资源文件,那就用aar包。如果只用到java代码,就用jar包。

2.2 将aar/jar复制到Unity项目中

这里以aar包为例,事实上aar和jar包的操作是一样的。

Unity中,Android aar/jar包的存放位置是有要求的,我们需要在Assets目录下,新建Plugins/Android目录,存在在这个目录下

2.3 Unity中新增一个Text

在Unity中,我们创建一个Text文本,用来展示从Android上获取的内容。

调整文本的颜色和位置,改成红色并改变x和y坐标,效果如下

Camera Controller中定义这个Text

c# 复制代码
public TextMeshProUGUI text1 = null;

然后把这个Text拖动到Main CameraCamera Controller脚本的text1变量上,让TextCamera Controller关联起来

2.4 在Unity中调用Android方法

Camera Controller脚本的Start方法中,我们增加如下代码

c# 复制代码
AndroidJavaObject javaObject = new AndroidJavaObject("com.heiko.mylibrary.MyTest");
//调用MyTest的getName方法
string name = javaObject.Call<string>("getName");
//将字符串复制给text1
text1.text = name;

运行Unity项目 (注意 : 这里需要将Unity项目打包成apk,然后运行在Android上,因为调用Android方法必须要在Android上调用,如果在电脑上运行是不会有效果的)

可以看到有个红色的文本,显示出来了Heiko3

2.5 其他Unity调用Android的方法

C# 复制代码
AndroidJavaClass javaclass = new AndroidJavaClass("com.heiko.mylibrary.MyTest");
AndroidJavaObject javaObject = new AndroidJavaObject("com.heiko.mylibrary.MyTest");
  • javaclass.CallStatic : 调用静态方法
C# 复制代码
string log = javaclass.CallStatic<string>("getLog");
javaclass.CallStatic("setLog", "NewLog");
  • javaclass.SetStatic: 设置静态变量
C# 复制代码
javaclass.SetStatic("LOG", "FiledLog");
  • javaObject.Call:调用方法
C# 复制代码
string name = javaObject.Call<string>("getName");
javaObject.Call("setName", "zhk");
  • javaObject.Set:设置变量
C# 复制代码
javaObject.Set("name", "kai");

3. Unity3D入门系列文章

Unity3D入门(一) : 第一个Unity3D项目,实现矩形自动旋转,并导出到Android运行
Unity3D入门(二) :Unity3D过渡切换视角
Unity3D入门(三) : Android和Unity3D交互 - Android调用Unity
Unity3D入门(四) : Android和Unity3D交互 - Unity调用Android

参考
将Unity用作Android应用中的库_哔哩哔哩_bilibili
【Unity安卓】使用AndroidStudio与Unity进行简单通讯_哔哩哔哩_bilibili
Unity和Android通信_哔哩哔哩_bilibili
Unity与Android之间的通信交互_哔哩哔哩_bilibili
如何使用AndroidStudio和Untiy3D交互?_哔哩哔哩_bilibili

相关推荐
半条咸鱼13 分钟前
如何通过 ADB 连接安卓设备(USB + 无线 TCP/IP)
android
huwuhang34 分钟前
斐讯盒子N1_YYFROM固件_webview119更新版附安卓专用遥控器刷机固工具USB_Burning_Tool
android
qq_3520186839 分钟前
android 状态栏高度获取
android
AirDroid_cn1 小时前
安卓15平板分屏比例能到1:9吗?极限分屏设置教程
android·智能手机
菜鸟国国1 小时前
还在为 Compose 屏幕适配发愁?一个 Density 搞定所有机型!
android
卡尔特斯1 小时前
Android Studio 代理配置指南
android·前端·android studio
sunbofiy231 小时前
去掉安卓的“读取已安装应用列表”,隐私合规
android
Sator11 小时前
Unity AStarPath的踩坑点
unity
cch89181 小时前
DCATAdmin后台框架极速上手
android
Ehtan_Zheng2 小时前
ActivityMetricsLogger 深度剖析:系统如何追踪启动耗时
android