本文转载自:Unity与Android交互方案优化版
一.本次开发所使用的软件版本如下:
1.Android Studio 4.0
2.Unity 2019.4.15
二.制作aar包
1.新建一个AndroidStudio空工程,名字随意
2.等工程创建完毕,选择File->Project Structure->Module,选中app,点击“-”号,删除app,点击OK确认删除app。
然后在点击选择Project下的app,右击选择Delete删除app整个文件夹
3.右击工程名字“Myapplication2”,New->Module,选择创建Android Library
4.名字随意,我把package name 起名为com.mycompany.mylibrary
5.删除库文件下的无用的测试文件夹androidTest和test
6.选择com.mycompany.mylibrary右击New一个Java Class,类名随意,这个我直接复制上篇参考文章的代码了,他的类名起名为:Unity2Android。代码如下
package com.mycompany.mylibrary;
import android.app.Activity;
import android.widget.Toast;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* Created by Jing on 2018-1-18.
*/
public class Unity2Android {
/**
* unity项目启动时的的上下文
*/
private Activity _unityActivity;
/**
* 获取unity项目的上下文
* @return
*/
Activity getActivity(){
if(null == _unityActivity) {
try {
Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");
Activity activity = (Activity) classtype.getDeclaredField("currentActivity").get(classtype);
_unityActivity = activity;
} catch (ClassNotFoundException e) {
} catch (IllegalAccessException e) {
} catch (NoSuchFieldException e) {
}
}
return _unityActivity;
}
/**
* 调用Unity的方法
* @param gameObjectName 调用的GameObject的名称
* @param functionName 方法名
* @param args 参数
* @return 调用是否成功
*/
boolean callUnity(String gameObjectName, String functionName, String args){
try {
Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");
Method method =classtype.getMethod("UnitySendMessage", String.class,String.class,String.class);
method.invoke(classtype,gameObjectName,functionName,args);
return true;
} catch (ClassNotFoundException e) {
} catch (NoSuchMethodException e) {
} catch (IllegalAccessException e) {
} catch (InvocationTargetException e) {
}
return false;
}
/**
* Toast显示unity发送过来的内容
* @param content 消息的内容
* @return 调用是否成功
*/
public boolean showToast(String content){
Toast.makeText(getActivity(),content,Toast.LENGTH_SHORT).show();
//这里是主动调用Unity中的方法,该方法之后unity部分会讲到
callUnity("Main Camera","FromAndroid", "hello unity i'm android");
return true;
}
}
7.选择Gradle->other->assembleRelease右击Run 'Myapplication2...',从而生成aar文件。生成成功的话,在mylibrary->build->outputs->aar文件夹下会生成mylibrary-release.aar
三.Unity
1.新建一个Unity工程,名字随意,创建目录Assets/Plugins/Android,并将刚才导出的arr文件放到该文件夹下
2.创建一个Text,一个按钮,新建一个C#脚本,把C#脚本绑在摄像机上,同时把text和按钮赋给脚本
代码也是参考上篇博文的
using UnityEngine;
using UnityEngine.UI;
public class Main : MonoBehaviour
{
/// <summary>
/// 场景上的文本框用来显示android发送过来的内容
/// </summary>
public Text text;
public Button btn;
/// <summary>
/// android原生代码对象
/// </summary>
AndroidJavaObject _ajc;
void Start()
{
#if UNITY_ANDROID && !UNITY_EDITOR
//通过该API来实例化导入的arr中对应的类
_ajc = new AndroidJavaObject("com.mycompany.mylibrary.Unity2Android");
#endif
btn.onClick.AddListener(OnBtnClick);
}
/// <summary>
/// 场景上按点击时触发该方法
/// </summary>
public void OnBtnClick()
{
Debug.Log("点击了按钮");
#if UNITY_ANDROID && !UNITY_EDITOR
//通过API来调用原生代码的方法
bool success = _ajc.Call<bool>("showToast", "this is unity");
if (true == success)
{
//请求成功
Debug.Log("请求成功");
}
#endif
}
/// <summary>
/// 原生层通过该方法传回信息
/// </summary>
/// <param name="content"></param>
public void FromAndroid(string content)
{
text.text = content;
}
}
3.生成apk
4.在安卓模块器上安装apk,点击按钮,Unity和Android互调用成功。