unity与android原生代码相互调用

第一步:编写android原生代码

首先创建工程,选择Empty Activity,后面也不会用到这个Activity

image.png

暂时命名为:Learn,SDK我们选最低的就行,然后点击Finish

创建好工程后在工程里创建Module,并且类型选择为Android Library

image.png

module暂时就使用默认命名:Android Library,Minimum SDK能选多低选多低,反正不超过unity发布的版本就行,然后点击finish

image.png

然后我们刚才创建的Module下的包里创建一个类,这里暂时命名为:Unity2Android
然后我们直接粘贴该类的代码,讲解直接看注释。这里我们通过Java的反射原理来获取本来导入class.jar类才能引用到的com.unity3d.player.UnityPlayer包下的currentActivity上下文。同理给unity发消息也是反射原理。「getActivity」和「callUnity」这两个方法,有一定的开发经验应该很容易理解。
这里我们实现一个简单的接口「showToast」。

package com.pawn.mylibrary;

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

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

/**
 * Created by Pawn on 2019-7-30.
 */
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;
    }
}

编写完成后开始编译aar包:我们选中module然后选择Build>> Rebuild Project

image.png

编译完成后我们就能在Module下的build>>outputs>>aar里看到生成的aar包

image.png

第二步:编写unity代码

首先创建unity工程


image.png

然后创建目录Assets/Plugins/Android,并将刚才导出的arr文件放到该文件夹下


image.png

接下来编写C#脚本

using UnityEngine;
using UnityEngine.UI;

public class Main : MonoBehaviour {

    /// <summary>
    /// 场景上的文本框用来显示android发送过来的内容
    /// </summary>
    public Text text;

    /// <summary>
    /// android原生代码对象
    /// </summary>
    AndroidJavaObject _ajc;

    void Start () {
        //通过该API来实例化导入的arr中对应的类
        _ajc = new AndroidJavaObject("com.pawn.mylibrary.Unity2Android");
    }
    
    void Update () {
        
    }

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

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

编写完成后挂在Main Camera上,因为在android代码里指定的回调:

 callUnity("Main Camera","FromAndroid", "hello unity i'm android");

然后打包测试


image.png

最后查看在手机里的运行日志

在android sdk的安装路径下的Android_SDK\tools文件夹里找到monitor.bat
打开后就能看到运行信息:

image.png

但是这里的是手机系统的运行信息,我们需要先筛选出unity的信息。
点击左边绿色的"+"号
image.png

然后填写筛选信息,接下来就能看到我们需要的了
image.png


最后感谢大佬:https://www.jianshu.com/p/86b275da600e

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。