Android后台调用Unity:实现无缝交互

Android与Unity互相调用

本人只会Unity开发对于Android系统与Java一窍不通,因为缺乏Java和Android的一些基础知识,在网上看了十几篇帖子照着做都各种报错。花了一天的时间终于把所有错误解决了,部分内容借鉴了其他大神的做法,现将具体步骤与注意事项总结如下:

1.下载并安装AndroidStudio,我下载的版本是3.5.2。JDK是Java的开发环境,SDK是Android的开发环境,一开始我也不太明白,看了点帖子跟着做一做就弄好了。

2.在AndroidStudio中新建工程

android后台 unity 安卓调用unity_android后台 unity


这里我选择的是Empty Activity

android后台 unity 安卓调用unity_android_02


这里注意记录Name与Packagename,后面要用到
android后台 unity 安卓调用unity_android后台 unity_03


在C:\Program Files\UnityFamily\Unity-2018.2.1f1\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Release\Classes中找到classes.jar,这个包,包含了许多Unity提供给Java的API,我们需要把这个包添加到我们的工程里

这里需要注意Unity的版本问题,我使用的是2018.2.1f。2019版的Unity关于JDK,SDK的配置有坑我还没趟完。小伙伴们准备使用哪个版本的Unity就复制哪个版本的classes.jar
android后台 unity 安卓调用unity_Android_04

复制到
android后台 unity 安卓调用unity_jdk_05


在classes.jar上右键Add As Library…
android后台 unity 安卓调用unity_jdk_06


之后会出现
android后台 unity 安卓调用unity_jdk_07


找到MainActivity这个类,并引入import com.unity3d.player.UnityPlayerActivity;
android后台 unity 安卓调用unity_android_08


修改MainActivity继承自UnityPlayerActivity
android后台 unity 安卓调用unity_unity_09


注释掉setContentView(R.layout.activity_main);
android后台 unity 安卓调用unity_jdk_10


添加三个方法,注意需要引入import android.widget.Toast;与import com.unity3d.player.UnityPlayer;,对于Android门外汉的我一开始压根不知道怎么引入,还找了半天

ShowToast,调用Android的一个显示框

callUnityFunc,Android调用Unity的方法

Add,Android的基本方法
android后台 unity 安卓调用unity_android后台 unity_11


有人手懒,这是上图的源码

// 定义一个显示Toast的方法,在Unity中调用此方法
public void ShowToast(final String mStr2Show){
// 同样需要在UI线程下执行
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),mStr2Show, Toast.LENGTH_LONG).show();
}
});
}

登录后复制

// 第一个参数是unity中的对象名字,记住是对象名字,不是脚本类名
// 第二个参数是函数名
// 第三个参数是传给函数的参数,目前只看到一个参数,并且是string的,自己传进去转吧
public void callUnityFunc(String _objName , String _funcStr, String _content)
{
    UnityPlayer.UnitySendMessage(_objName, _funcStr, "Come from:" + _content);
}

public int Add(int a,int b)
{
    return  a+b;
}

找到这个Manifest
android后台 unity 安卓调用unity_android_12


添加一句
android后台 unity 安卓调用unity_unity_13


删掉其余的内容,保持和下图一致就行了
android后台 unity 安卓调用unity_unity_14


找到build.gradle
android后台 unity 安卓调用unity_jdk_15


把application改为library

注释掉applicationId "com.company.myandroidtest"与testInstrumentationRunner “androidx.test.runner.AndroidJUnitRunner”
android后台 unity 安卓调用unity_unity_16

把图中这些文件删掉,导入Unity后这些内容有可能会报错
android后台 unity 安卓调用unity_android_17


Build->Make Project
android后台 unity 安卓调用unity_Android_18


会生成一个arr的包,在如下图的位置

android后台 unity 安卓调用unity_unity_19


右键在文件管理器中找到这个包

android后台 unity 安卓调用unity_android后台 unity_20


复制这个arr包

android后台 unity 安卓调用unity_android后台 unity_21


到Unity工程的这个文件夹下

android后台 unity 安卓调用unity_android_22


需要用一个压缩软件打开这个包,我用的是360压缩

android后台 unity 安卓调用unity_Android_23


删除libs文件夹下的classes.jar

删除res文件夹,

把AndroidManifest.xml拖出来

这里其实也可以在Androidstudio中设置某些内容不打包,但是我不太会…

android后台 unity 安卓调用unity_unity_24


总之Android部分算是完成啦

3.Unity工程中新建一个脚本,直接贴代码了
using UnityEngine;
using UnityEngine.UI;

public class UnityCallAndroidScriptSecond : MonoBehaviour {

登录后复制

public Text _text;

public void Add()
{
    AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
    AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");

    int sum = jo.Call<int>("Add", 2, 3);
    _text.text = sum.ToString();
}

//调用安卓的Toast
public void CallAndroidShowToast()
{
    AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
    AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
    jo.Call("ShowToast", "Showing on Toast");
}

/// <summary>
/// 测试 unity->java->unity
/// </summary>
public void CallJavaCallBack()
{
    AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
    AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
    jo.Call("callUnityFunc", "Canvas", "BeCallFunc", "Unity传递过去的参数");
}

//设置一个回掉方法
private void BeCallFunc(string _content)
{
    Debug.Log("调用Java之后回调C#成功");
    _text.text = _content;
}

}

我当看帖子的人都具备Unity基础知识了,怎么调用方法,怎么绑Text我就不说了。
想要测试一定要用Unity发布Apk包再安装到Android设备上测,
这里发布Apk的时候Unity有几个名称需要注意,就是一开始我说后面要用到的包的名称
在PlayerSettings里设置

android后台 unity 安卓调用unity_Android_25


最后一步就是BuildSystem的选项要设置成Internal,另外一个选项会报错导致不能发布

android后台 unity 安卓调用unity_android后台 unity_26


之后就是发布ApK安装在Android设备上测试了

               


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空