一.本次开发所使用的软件版本如下:
1.Android Studio 3.5.1
2.Unity 2019.2.5
二.制作aar包
1.新建一个空的Android Studio 工程,名字随意
2.右击app新建module->Android Library,命名为默认名字:My Library
3、导入Unity classes.jar
(1) 将位于 Unity 安装目录下 “Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes” 的 classes.jar 拷贝到 Android Project 下的 libs 目录
(2)粘贴后,右击classes.jar,在弹出的对话框中选择Add As Library
默认是mylibrary,确认即可
4.新建Activity
1)展开mylibrary模块下的src目录,选中com.example.mylibrary,然后右键,新建一个Activity,选择Empty Activity,勾掉Generate Layout File。
2)
现将MainActivity脚本内容修改为继续自UnityPlayerActivity ,并添加两个方法 UnityCallAndroid 和 AndroidCallUnity,
UnityCallAndroid 用来接受Unity的调用,AndroidCallUnity用于向unity发起调用。具体代码如下:
package com.example.mylibrary;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;
public class MainActivity extends UnityPlayerActivity {
private static final String TAG_UNITY = "Unity";
//Unity 回调对象
private String _strCallbackGameObjectName = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
//初始化回调对象
public void Init(String callbackGoName){
this._strCallbackGameObjectName = callbackGoName;
//Log.i(TAG_UNITY, "Init " + callbackGoName);
Toast.makeText(this,"Init" + callbackGoName, Toast.LENGTH_LONG).show();
}
//unity调用Android
public void UnityCallAndroid(){
//Log.i(TAG_UNITY, "TestFunc1");
Toast.makeText(this,"unity调用android成功", Toast.LENGTH_LONG).show();
AndoridCallUnity();
}
//Android调用Unity
public void AndoridCallUnity(){
//第1个参数为Unity场景中用于接收android消息的对象名称
//第2个参数为对象上的脚本的一个成员方法名称(脚本名称不限制)
//第3个参数为unity方法的参数
UnityPlayer.UnitySendMessage("receiveObj", "OnMessage", "Android调用Unity成功");
}
}
5、修改AndroidManifest.xml
1)打开mylibrary/src/main下的AndroidManifest.xml文件,修改为
6、Build->Rebuild Project
成功后会在mylibrary->build->outputs->aar下生成mylibrary->debug.aar文件
至此,AS的aar已生成完毕
三.Unity工程
1)新建一个Unity工程
2)拷贝Android下生成的mylibrary-debug.aar文件到Unity工程下Plugins/Android下(新建此文件夹)
用RAR 打开 arr 包,删除 libs 中的 classes.jar ,否则 Unity 会报重复引用库的错
(2)将mylibrary/src/main下的AndroidManifest.xml文件拷贝到 Assets\Plugins\Android 下
3)新建一个Canvas,在Canvas下新建一个Text,一个空的Object命名为receiveObj(这个名字要和Android下的一致)
4)新建一个脚本TestScript,如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class TestScript : MonoBehaviour
{
private AndroidJavaObject _androidObj = null;
Text tex;
void Start()
{
tex = GameObject.Find("Canvas/Text").GetComponent
tex.text = "";
#if UNITY_ANDROID && !UNITY_EDITOR
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
_androidObj = jc.GetStatic
if (null != _androidObj)
{
_androidObj.Call("Init", this.gameObject.name);
}
#endif
}
void OnGUI()
{
if (GUI.Button(new Rect(500, 500, 200, 60), "Button"))
{
if (null != _androidObj)
{
Debug.LogError("Unity Call TestFunc1");
_androidObj.Call("UnityCallAndroid");
}
}
}
public void OnMessage(string message)
{
Debug.LogError("The Message call form Andriod ! message : " + message);
tex.text = message;
}
}
5)把TestScript赋给receiveObj
6)Build Android
7)运行apk,成功显示测试结果
demo:https://github.com/mJonl/UnityCallAar.git