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

相关推荐
pengyu1 小时前
系统化掌握Dart网络编程之Dio(二):配置管理篇
android·flutter·dart
Yang-Never1 小时前
Open GL ES ->纹理贴图,顶点坐标和纹理坐标组合到同一个顶点缓冲对象中进行解析
android·java·开发语言·android studio·贴图
a3158238062 小时前
SnapdragonCamera骁龙相机源码解析
android·数码相机·framework·高通
IT乐手2 小时前
adb logcat 写文件乱码的解决方案
android·python
xiaoduyyy2 小时前
【Android】View动画—XML动画、帧动画
android·xml
weixin_454102463 小时前
cordova android12+升级一些配置注意事项
android·前端·cordova
兰亭序咖啡4 小时前
学透Spring Boot — 007. 加载外部配置
android·java·spring boot
8931519604 小时前
Android穿山甲banner广告穿插到项目的banner中
android·android开发·android教程·穿山甲banner广告加入项目
利明的博客5 小时前
mediacodec服务启动时加载media_codecs.xml
android·xml·java
chen_song_6 小时前
WebRTC的ICE之TURN协议的交互流程中继转发Relay媒体数据的turnserver的测试
算法·音视频·webrtc·交互·媒体