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设备上测试了