Unity 与 Android aar 包通讯

一.本次开发所使用的软件版本如下:

1.Android Studio 3.5.1

2.Unity 2019.2.5

二.制作aar包

1.新建一个空的Android Studio 工程,名字随意

Unity 与 Android aar 包通讯_第1张图片

Unity 与 Android aar 包通讯_第2张图片

2.右击app新建module->Android Library,命名为默认名字:My Library

Unity 与 Android aar 包通讯_第3张图片

3、导入Unity classes.jar

(1) 将位于 Unity 安装目录下 “Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes” 的 classes.jar 拷贝到 Android Project 下的 libs 目录

 Unity 与 Android aar 包通讯_第4张图片

 Unity 与 Android aar 包通讯_第5张图片

Unity 与 Android aar 包通讯_第6张图片

(2)粘贴后,右击classes.jar,在弹出的对话框中选择Add As Library

Unity 与 Android aar 包通讯_第7张图片

Unity 与 Android aar 包通讯_第8张图片

默认是mylibrary,确认即可

4.新建Activity

1)展开mylibrary模块下的src目录,选中com.example.mylibrary,然后右键,新建一个Activity,选择Empty Activity,勾掉Generate Layout File。

Unity 与 Android aar 包通讯_第9张图片

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

Unity 与 Android aar 包通讯_第10张图片

成功后会在mylibrary->build->outputs->aar下生成mylibrary->debug.aar文件

Unity 与 Android aar 包通讯_第11张图片

至此,AS的aar已生成完毕

三.Unity工程

1)新建一个Unity工程

2)拷贝Android下生成的mylibrary-debug.aar文件到Unity工程下Plugins/Android下(新建此文件夹)

用RAR 打开 arr 包,删除 libs 中的 classes.jar ,否则 Unity 会报重复引用库的错

Unity 与 Android aar 包通讯_第12张图片

 (2)将mylibrary/src/main下的AndroidManifest.xml文件拷贝到 Assets\Plugins\Android 下

Unity 与 Android aar 包通讯_第13张图片

3)新建一个Canvas,在Canvas下新建一个Text,一个空的Object命名为receiveObj(这个名字要和Android下的一致)

Unity 与 Android aar 包通讯_第14张图片

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("currentActivity");
        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

Unity 与 Android aar 包通讯_第15张图片

7)运行apk,成功显示测试结果

Unity 与 Android aar 包通讯_第16张图片

demo:https://github.com/mJonl/UnityCallAar.git

你可能感兴趣的:(Android,unity3D,Unity,aar)