新版Unity已经支持与 aar 包交互,相较以前的 jar 包交互在资源管理上更加合理,这里不在赘述。
一、工具版本
Unity 5.6.4f1
Android Studio 2.3
二、创建Android aar包
1、创建空Android Project,选择 Phone and Tablet 并设置对应的SDK版本
2、选择Empty Activity,其余保持默认即可
3、导入Unity classes.jar
(1) 将位于 Unity 安装目录下 “Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes” 的 classes.jar 拷贝到 Android Project 下的 libs 目录
(2) 引用lib包,工程目录下右键-> Open Module Settings,然后找到Dependencies按下图添加classes.jar
4、编辑MainActivity 继承 UnityPlayerActivity
package com.example.test;
import android.os.Bundle;
import android.util.Log;
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);
}
public void TestFunc1() {
Log.i(TAG_UNITY, "TestFunc1");
}
public String TestFunc2() {
Log.i(TAG_UNITY, "TestFunc2");
return "Android TestFunc2";
}
public void TestFunc3() {
Log.i(TAG_UNITY, "TestFunc3");
Log.i(TAG_UNITY, "_strCallbackGameObjectName : " + _strCallbackGameObjectName.toString());
UnityPlayer.UnitySendMessage(_strCallbackGameObjectName, "OnMessage", "SendMessage TestFunc3");
}
}
5、修改AndroidManifest.xml
(1) 修改 android:theme="@style/AppTheme"为 android:theme="@android:style/Theme.NoTitleBar"
(2) 加入
6、编辑Build.gradle
(1) apply plugin: 'com.android.application' 为 apply plugin: 'com.android.lib'
(2) 注释或删除掉 applicationId "com.example.test"
apply plugin: 'com.android.library'
android {
compileSdkVersion 27
buildToolsVersion "27.0.3"
defaultConfig {
// applicationId "com.example.test"
minSdkVersion 16
targetSdkVersion 27
versionCode 1
versionName "1.0"
// testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:+'
compile 'com.android.support.constraint:constraint-layout:+'
}
7、删除多余的资源
(1)删除 activity_main.xml
(2)删除 styles.xml
8、编译输入 aar 包
(1)编译后将 output 目录下的 aar 文件拷贝到 Unity 的 Assets\Plugins\Android 目录中
(2)用RAR 打开 arr 包,删除 libs 中的 classes.jar ,否则 Unity 会报重复引用库的错
(3)将 aar 包的 AndroidManifest.xml 拷贝到 Assets\Plugins\Android 下
三、联调
这里比较简单直接上代码,将脚本直接挂载在活跃的 GameObject 上即可。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TestScript : MonoBehaviour
{
private AndroidJavaObject _androidObj = null;
void Start()
{
#if UNITY_ANDROID && !UNITY_EDITOR
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
_androidObj = jc.GetStatic("currentActivity");
if (null != _androidObj)
{
_androidObj.Call("Init", this.gameObject.name);
}
#endif
}
void OnGUI()
{
if (GUI.Button(new Rect(10, 10, 100, 30), "TestFunc1"))
{
if (null != _androidObj)
{
Debug.LogError("Unity Call TestFunc1");
_androidObj.Call("TestFunc1");
}
}
if (GUI.Button(new Rect(10, 110, 100, 30), "TestFunc2"))
{
if (null != _androidObj)
{
Debug.LogError("Unity Call TestFunc2");
string result = _androidObj.Call("TestFunc2");
Debug.LogError("---------------- TestFunc2 result : " + result);
}
}
if (GUI.Button(new Rect(10, 210, 100, 30), "TestFunc3"))
{
if (null != _androidObj)
{
Debug.LogError("Unity Call TestFunc3");
_androidObj.Call("TestFunc3");
}
}
}
public void OnMessage(string message)
{
Debug.LogError("The Message call form Andriod ! message : " + message);
}
}
四、测试