Unity 与 Android aar 包通讯

本文转载自:Unity与Android交互方案优化版

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

1.Android Studio 4.0

2.Unity 2019.4.15

二.制作aar包

1.新建一个AndroidStudio空工程,名字随意

2.等工程创建完毕,选择File->Project Structure->Module,选中app,点击“-”号,删除app,点击OK确认删除app。

然后在点击选择Project下的app,右击选择Delete删除app整个文件夹

3.右击工程名字“Myapplication2”,New->Module,选择创建Android Library

4.名字随意,我把package name 起名为com.mycompany.mylibrary

5.删除库文件下的无用的测试文件夹androidTest和test

6.选择com.mycompany.mylibrary右击New一个Java Class,类名随意,这个我直接复制上篇参考文章的代码了,他的类名起名为:Unity2Android。代码如下

package com.mycompany.mylibrary;

import android.app.Activity;
import android.widget.Toast;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * Created by Jing on 2018-1-18.
 */
public class Unity2Android {

    /**
     * unity项目启动时的的上下文
     */
    private Activity _unityActivity;
    /**
     * 获取unity项目的上下文
     * @return
     */
    Activity getActivity(){
        if(null == _unityActivity) {
            try {
                Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");
                Activity activity = (Activity) classtype.getDeclaredField("currentActivity").get(classtype);
                _unityActivity = activity;
            } catch (ClassNotFoundException e) {

            } catch (IllegalAccessException e) {

            } catch (NoSuchFieldException e) {

            }
        }
        return _unityActivity;
    }

    /**
     * 调用Unity的方法
     * @param gameObjectName    调用的GameObject的名称
     * @param functionName      方法名
     * @param args              参数
     * @return                  调用是否成功
     */
    boolean callUnity(String gameObjectName, String functionName, String args){
        try {
            Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");
            Method method =classtype.getMethod("UnitySendMessage", String.class,String.class,String.class);
            method.invoke(classtype,gameObjectName,functionName,args);
            return true;
        } catch (ClassNotFoundException e) {

        } catch (NoSuchMethodException e) {

        } catch (IllegalAccessException e) {

        } catch (InvocationTargetException e) {

        }
        return false;
    }

    /**
     * Toast显示unity发送过来的内容
     * @param content           消息的内容
     * @return                  调用是否成功
     */
    public boolean showToast(String content){
        Toast.makeText(getActivity(),content,Toast.LENGTH_SHORT).show();
        //这里是主动调用Unity中的方法,该方法之后unity部分会讲到
        callUnity("Main Camera","FromAndroid", "hello unity i'm android");
        return true;
    }
}

7.选择Gradle->other->assembleRelease右击Run 'Myapplication2...',从而生成aar文件。生成成功的话,在mylibrary->build->outputs->aar文件夹下会生成mylibrary-release.aar

三.Unity

1.新建一个Unity工程,名字随意,创建目录Assets/Plugins/Android,并将刚才导出的arr文件放到该文件夹下

2.创建一个Text,一个按钮,新建一个C#脚本,把C#脚本绑在摄像机上,同时把text和按钮赋给脚本

代码也是参考上篇博文的

using UnityEngine;
using UnityEngine.UI;

public class Main : MonoBehaviour
{
    /// <summary>
    /// 场景上的文本框用来显示android发送过来的内容
    /// </summary>
    public Text text;
    public Button btn;
    /// <summary>
    /// android原生代码对象
    /// </summary>
    AndroidJavaObject _ajc;

    void Start()
    {
#if UNITY_ANDROID && !UNITY_EDITOR
        //通过该API来实例化导入的arr中对应的类
        _ajc = new AndroidJavaObject("com.mycompany.mylibrary.Unity2Android");
#endif
        btn.onClick.AddListener(OnBtnClick);
    }

    /// <summary>
    /// 场景上按点击时触发该方法
    /// </summary>
    public void OnBtnClick()
    {
        Debug.Log("点击了按钮");
        #if UNITY_ANDROID && !UNITY_EDITOR
        //通过API来调用原生代码的方法
        bool success = _ajc.Call<bool>("showToast", "this is unity");
        if (true == success)
        {
            //请求成功
            Debug.Log("请求成功");
        }
        #endif
    }

    /// <summary>
    /// 原生层通过该方法传回信息
    /// </summary>
    /// <param name="content"></param>
    public void FromAndroid(string content)
    {
        text.text = content;
    }
}

3.生成apk

4.在安卓模块器上安装apk,点击按钮,Unity和Android互调用成功。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值