Unity 与 Android aar 包交互

新版Unity已经支持与 aar 包交互,相较以前的 jar 包交互在资源管理上更加合理,这里不在赘述。

一、工具版本 

Unity 5.6.4f1

Android Studio 2.3

二、创建Android aar包

1、创建空Android Project,选择 Phone and Tablet 并设置对应的SDK版本

Unity 与 Android aar 包交互 - Mars - MarsZhan

2、选择Empty Activity,其余保持默认即可

Unity 与 Android aar 包交互 - Mars - MarsZhan

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

Unity 与 Android aar 包交互 - Mars - MarsZhan

 

Unity 与 Android aar 包交互 - Mars - MarsZhan

 

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

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.test">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@android:style/Theme.NoTitleBar">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <!-- 一定要加上这句 -->
            <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
        </activity>
    </application>

</manifest>
 

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<AndroidJavaObject>("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<string>("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 与 Android aar 包交互 - Mars - MarsZhan

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值