Unity 与 Android aar 包交互

新版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) 加入android:name="unityplayer.UnityActivity"android:value="true" />




    
        
            
                

                
            
            
            
        
    


 

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);
    }
}

 

四、测试

你可能感兴趣的:(Unity)