Android与Unity互相调用

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

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

2.在AndroidStudio中新建工程

android后台 unity 安卓调用unity_Android


这里我选择的是Empty Activity

android后台 unity 安卓调用unity_android_02


这里注意记录Name与Packagename,后面要用到

android后台 unity 安卓调用unity_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_unity_04

复制到

android后台 unity 安卓调用unity_unity_05


在classes.jar上右键Add As Library…

android后台 unity 安卓调用unity_jdk_06


之后会出现

android后台 unity 安卓调用unity_android_07


找到MainActivity这个类,并引入import com.unity3d.player.UnityPlayerActivity;

android后台 unity 安卓调用unity_unity_08


修改MainActivity继承自UnityPlayerActivity

android后台 unity 安卓调用unity_jdk_09


注释掉setContentView(R.layout.activity_main);

android后台 unity 安卓调用unity_Android_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_jdk_12


添加一句

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


删掉其余的内容,保持和下图一致就行了

android后台 unity 安卓调用unity_jdk_14


找到build.gradle

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


把application改为library

注释掉applicationId "com.company.myandroidtest"与testInstrumentationRunner “androidx.test.runner.AndroidJUnitRunner”

android后台 unity 安卓调用unity_unity_16

把图中这些文件删掉,导入Unity后这些内容有可能会报错

android后台 unity 安卓调用unity_jdk_17


Build->Make Project

android后台 unity 安卓调用unity_Android_18


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

android后台 unity 安卓调用unity_Android_19


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

android后台 unity 安卓调用unity_unity_20


复制这个arr包

android后台 unity 安卓调用unity_Android_21


到Unity工程的这个文件夹下

android后台 unity 安卓调用unity_android_22


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

android后台 unity 安卓调用unity_unity_23


删除libs文件夹下的classes.jar

删除res文件夹,

把AndroidManifest.xml拖出来

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

android后台 unity 安卓调用unity_android后台 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_jdk_26


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