安卓与Unity通信(1)
通过导入Unity的classes.jar,继承unity的UnityPlayerActivity实现unity与安卓的交互
安卓
1.创建一个安卓空项目
我将其更名为unitytoandroid
记住选择的API等级,在unity中会用到,如图我用的是API21,Android5.0
创建好后,as默认打开是在Android结构下
我们将其切换到Project结构目录下
2.导入classes.jar
- 导入unity的jar包
在unity的安装目录下找到classes.jar文件,并将其复制到as的libs文件下D:\Unity\UntiyDownLoad\2020.3.26f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes
网络异常,图片无法展示|
网络异常,图片无法展示| - 右键classes.jar,选择add as library,点击ok,完成classes.jar文件的导入
网络异常,图片无法展示|
3、编写MainActivity
在MainActivity中编写通信代码,如果显示没有UnityPlayerActivity,则在unity的安装目录下D:\Unity\UntiyDownLoad\2020.3.26f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player
找到UnityPlayerActivity.java
这个类,这是因为在2019版以后的unity中UnityPlayerActivity.java
不再放在classes.jar中
找到这个类之后将其放在com.example.unitytoandroid包目录下,与MainActivity同级
这样就不会再出现报错
然后在MainActivity中编写通信代码,
packagecom.example.unitytoandroid;
importandroidx.appcompat.app.AppCompatActivity;
importandroid.os.Bundle;
importandroid.util.Log;
publicclassMainActivityextendsUnityPlayerActivity {
@Override
protectedvoidonCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
}
//在unity中调用的测试方法,负责打印从unity中传来的字符串
publicvoidTestAndroid(Stringval){
Log.i("unity",val);
}
}
4、src文件
把src文件下的所有文件删除,打开AndroidManifest.xml文件,删除当中的报错代码,有时也不会报错但也要删除否则在unity中运行时也会报错,删除后AndroidManifest.xml文件代码应如下
删除后AndroidManifest.xml文件<application>中应该只有两行代码
5、build.gradle文件
有三处要改
1、 将plugins {
id 'com.android.application'
}
更改为
plugins {
id'com.android.library'
}
2、 并且删除applicationId "com.example.unitytoandroid"
3、 修改implementation files('libs\classes.jar')为compileOnly files('libs\classes.jar')
compileOnlyfiles('libs\\classes.jar')
6、Rebuild Project
在上方工具栏找到Build->Rebuild project,成功运行出来,我们便得到了aar文件
Unity
1、创建一个unity项目
创建一个Unity项目将其切换到安卓平台
2、添加app-debug.aar文件
把app-debug.aar文件添加到unity中,并将其解压获取AndroidManifest.xml文件,同样放在同级文件下
如果电脑没有解压aar格式的软件,可以复制一份aar文件,更改后缀名为zip然后解压,取出AndroidManifest.xml文件,双击打开可以查看AndroidManifest.xml文件里的内容
3、创建一个UI按钮
在unity中创建一个UI按钮,并编写一个脚本
usingSystem.Collections;
usingSystem.Collections.Generic;
usingUnityEngine;
publicclassTest : MonoBehaviour
{
// Start is called before the first frame update
voidStart()
{
}
// Update is called once per frame
voidUpdate()
{
}
publicvoidTestAndroid()
{
AndroidJavaClassjc=newAndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObjectjo=jc.GetStatic<AndroidJavaObject>("currentActivity");
jo.Call("TestAndroid", "this is unity");
}
}
将脚本挂在Button上
4、在unity里build
build之前要确保unity中API的等级设置要与AS中的一样
运行
在手机上点击按钮,as中弹出提示,标识通信成功