第一步:编写android原生代码
首先创建工程,选择Empty Activity,后面也不会用到这个Activity
暂时命名为:Learn,SDK我们选最低的就行,然后点击Finish
创建好工程后在工程里创建Module,并且类型选择为Android Library
module暂时就使用默认命名:Android Library,Minimum SDK能选多低选多低,反正不超过unity发布的版本就行,然后点击finish
然后我们刚才创建的Module下的包里创建一个类,这里暂时命名为:Unity2Android
然后我们直接粘贴该类的代码,讲解直接看注释。这里我们通过Java的反射原理来获取本来导入class.jar类才能引用到的com.unity3d.player.UnityPlayer包下的currentActivity上下文。同理给unity发消息也是反射原理。「getActivity」和「callUnity」这两个方法,有一定的开发经验应该很容易理解。
这里我们实现一个简单的接口「showToast」。
package com.pawn.mylibrary;
import android.app.Activity;
import android.widget.Toast;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* Created by Pawn on 2019-7-30.
*/
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;
}
}
编写完成后开始编译aar包:我们选中module然后选择Build>> Rebuild Project
编译完成后我们就能在Module下的build>>outputs>>aar里看到生成的aar包
第二步:编写unity代码
首先创建unity工程
然后创建目录Assets/Plugins/Android,并将刚才导出的arr文件放到该文件夹下
接下来编写C#脚本
using UnityEngine;
using UnityEngine.UI;
public class Main : MonoBehaviour {
/// <summary>
/// 场景上的文本框用来显示android发送过来的内容
/// </summary>
public Text text;
/// <summary>
/// android原生代码对象
/// </summary>
AndroidJavaObject _ajc;
void Start () {
//通过该API来实例化导入的arr中对应的类
_ajc = new AndroidJavaObject("com.pawn.mylibrary.Unity2Android");
}
void Update () {
}
/// <summary>
/// 场景上按点击时触发该方法
/// </summary>
public void OnBtnClick()
{
//通过API来调用原生代码的方法
bool success = _ajc.Call<bool>("showToast","this is unity");
if(true == success)
{
//请求成功
}
}
/// <summary>
/// 原生层通过该方法传回信息
/// </summary>
/// <param name="content"></param>
public void FromAndroid(string content)
{
text.text = content;
}
}
编写完成后挂在Main Camera上,因为在android代码里指定的回调:
callUnity("Main Camera","FromAndroid", "hello unity i'm android");
然后打包测试
最后查看在手机里的运行日志
在android sdk的安装路径下的Android_SDK\tools文件夹里找到monitor.bat
打开后就能看到运行信息:
但是这里的是手机系统的运行信息,我们需要先筛选出unity的信息。
点击左边绿色的"+"号
然后填写筛选信息,接下来就能看到我们需要的了