Android与Unity互相调用详解

Android与Unity互相调用

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

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

2.在AndroidStudio中新建工程
在这里插入图片描述
这里我选择的是Empty Activity
在这里插入图片描述
这里注意记录Name与Packagename,后面要用到
在这里插入图片描述
在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
在这里插入图片描述复制到
在这里插入图片描述
在classes.jar上右键Add As Library…
在这里插入图片描述
之后会出现
在这里插入图片描述
找到MainActivity这个类,并引入import com.unity3d.player.UnityPlayerActivity;
在这里插入图片描述
修改MainActivity继承自UnityPlayerActivity
在这里插入图片描述
注释掉setContentView(R.layout.activity_main);
在这里插入图片描述
添加三个方法,注意需要引入import android.widget.Toast;与import com.unity3d.player.UnityPlayer;,对于Android门外汉的我一开始压根不知道怎么引入,还找了半天
ShowToast,调用Android的一个显示框
callUnityFunc,Android调用Unity的方法
Add,Android的基本方法
在这里插入图片描述
有人手懒,这是上图的源码

// 定义一个显示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
在这里插入图片描述
添加一句
在这里插入图片描述
删掉其余的内容,保持和下图一致就行了
在这里插入图片描述
找到build.gradle
在这里插入图片描述
把application改为library
注释掉applicationId "com.company.myandroidtest"与testInstrumentationRunner “androidx.test.runner.AndroidJUnitRunner”
在这里插入图片描述

把图中这些文件删掉,导入Unity后这些内容有可能会报错
在这里插入图片描述
Build->Make Project
在这里插入图片描述
会生成一个arr的包,在如下图的位置
在这里插入图片描述
右键在文件管理器中找到这个包
在这里插入图片描述
复制这个arr包
在这里插入图片描述
到Unity工程的这个文件夹下
在这里插入图片描述
需要用一个压缩软件打开这个包,我用的是360压缩
在这里插入图片描述
删除libs文件夹下的classes.jar
删除res文件夹,
把AndroidManifest.xml拖出来
这里其实也可以在Androidstudio中设置某些内容不打包,但是我不太会…
在这里插入图片描述
总之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里设置

在这里插入图片描述
最后一步就是BuildSystem的选项要设置成Internal,另外一个选项会报错导致不能发布
在这里插入图片描述
之后就是发布ApK安装在Android设备上测试了

猜你喜欢

转载自blog.csdn.net/weixin_39142676/article/details/107236351