如何简单的使用Unity调用原生Android插件

Unity调用原生Android

Foldcc
Unity version:2018.1
Android Studio version : 3.1.2

简介

由于自己需要使用Android原生的一些功能,但是发现网上对接原生的方法实在太麻烦太复杂,因此自己打算发这篇博客供大家参考 ,没有那么多复杂操作,不需要什么导出unity的class.jar、不需要继承UnityPlayerActivity、不需要修改什么xml也不需要同步包名什么的。

整体流程:

先大概讲一遍整体流程 在逐一细讲:
1. 使用Android Studio写一个工具类
2. 将工具类导出为aar或者jar,这里我导出的为aar也推荐使用
3. 将插件导入到Unity的Plugins/Android下
4. 创建用于与创建对接的工具类

Android工具类

这里用一个震动工具类给大家演示,不需要创建Activity,直接创建一个普通的class文件就行了,然后将他导出为aar,放到Unity 项目中,一定要放在Plugins/Android下 如果没有对应文件夹直接创建,Android如何导出插件请自行百度,工具类参考代码如下(工具类就一个简单的调用系统震动没有注释也不需要过多注意,本文着重讲Unity端):

public class Vibrator {
    private android.os.Vibrator vibratorService;
    public boolean Init (Context context){
        vibratorService = (android.os.Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
        return (vibratorService != null);
    }

    public boolean HasVibrator(){
        if(vibratorService == null) return false;
        return vibratorService.hasVibrator();
    }

    public void StartVibrator(int ms){
        if(vibratorService == null) return;
        vibratorService.vibrate(ms);
    }

    public void LoopStartVibrator(long[] pattern, int repeat) {
        if(vibratorService == null) return;
        vibratorService.vibrate(pattern, repeat);
    }

    public void  StopVibrator(){
        if(vibratorService == null) return;
        vibratorService.cancel();
    }
}

Unity对接Android

对接的核心需要以下两个类:

  • AndroidJavaClass : 获取指定路径下的javaClass对象
  • AndroidJavaObject : 获取指定路径下的javaObject对象

现在我们第一步是要把写好的工具给拿到手,因此直接使用new AndroidJavaObject(“工具类地址全名”)即可, 通过这一句代码我们就已经拿到工具类并实例化了,但由于我的震动类需要一个Activity上下文对象不然没法使用,我们可以通过直接获取Unity自己的Activity来初始化震动类。
以下代码是获取Unity的Activity后传入到工具类的代码演示:

 //获取Unity的Activity Class
 using (AndroidJavaClass activityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
                {
                    //获取对应的实例化对象,这两句都是固定写法
                    using (AndroidJavaObject activityContext = activityClass.GetStatic<AndroidJavaObject>("currentActivity"))
                    {
                        //拿到我自己的工具类并实例化
                        AndroidJavaObject  VibratorInstance = new AndroidJavaObject("tool.foldcc.unitytools.Vibrator");
                        //向工具类里的Init方法传入Unity的activity对象用于初始化工具类
                        VibratorInstance .Call<bool>("Init", activityContext);
                    }
                }

这里的 Call 方法第一个参数表示执行的指定方法名后面的是一个可变参数,可以写方法需要的对应参数。

调用原生工具类的方法

执行原生工具类的关键就是Call方法,以下是Cal方法的几种说明:

  • Call : 调用指定非静态方法
  • Call<指定类型> : 调用指定非静态方法并返回指定类型(基础类型)
  • CallStatic : 调用指定静态方法
  • CallStatic<指定类型> : 调用指定静态方法并返回指定类型(基础类型)

关于参数问题: 第一个参数为 方法名 必须传, 第二个为一个可变长参数,可以传多个参数也可以不传,根据对应方法的需求来定。

最后贴出Unity端对接Android代码:

using UnityEngine;

public class VibratorImp{

    private AndroidJavaObject VibratorInstance = null;

    private static VibratorImp vibratorImp;

    public static VibratorImp Instance {
        get {
            if (vibratorImp == null) {
                vibratorImp = new VibratorImp();
                using (AndroidJavaClass activityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
                {
                    using (AndroidJavaObject activityContext = activityClass.GetStatic<AndroidJavaObject>("currentActivity"))
                    {
                        using (AndroidJavaClass pluginClass = new AndroidJavaClass("tool.foldcc.unitytools.Vibrator"))
                        {
                            if (pluginClass != null)
                            {
                                vibratorImp.VibratorInstance = new AndroidJavaObject("tool.foldcc.unitytools.Vibrator");
                                vibratorImp.VibratorInstance.Call<bool>("Init", activityContext);
                            }
                        }
                    }
                }
                if (vibratorImp.VibratorInstance == null)
                {
                    Debug.LogError("Init vibrator service err");
                }
            }
            return vibratorImp;
        }
    }

    /// <summary>
    /// 启动震动
    /// </summary>
    /// <param name="ms">震动时间(毫秒)</param>
    public void StartVibrator(int ms) {
        VibratorInstance.Call("StartVibrator", ms);
    }

    /// <summary>
    /// 启动高级震动 可自行控制震动间隔来间接控制震动强度
    /// </summary>
    /// <param name="msArray">数组下标从0开始第一个为震动时长第二个为停顿时长以此循环</param>
    /// <param name="repeat">从指定下标开始 -1表示从头开始 默认为-1</param>
    public void LoopStartVibrator(long[] msArray , int repeat = -1) {
        VibratorInstance.Call("LoopStartVibrator", msArray , repeat);
    }

    /// <summary>
    /// 停止震动
    /// </summary>
    public void StopVibrator() {
        VibratorInstance.Call("StopVibrator");
    }

}

在Unity游戏逻辑中任何一个地方调用该工具类即可实现自定义震动效果!麻烦点个赞哟!

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页