目录
  • 1 Unity如何使用Android插件
  • 2 同步方法如何调用
    • 2.1 例子1
    • 2.2 例子2
  • 3 异步方法如何调用
    • 3.1 Android端
      • 3.1.1 添加依赖
      • 3.1.2 代码逻辑
    • 3.2 Unity端
    • 总结

      1 Unity如何使用Android插件

      很简单,把android的模块,打包成aar或者jar,放到Assets/Plugin/Android即可!

      2 同步方法如何调用

      2.1 例子1

      Android端

      假设Android有一个方法

          public static String GetVideoParams() {        MediaMetadataRetriever retriever = new MediaMetadataRetriever();        retriever.setDataSource(LOCAL_VIDEO_PATH);        String width = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH); //宽        String height = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT); //高        Log.w(TAG, "GetVideoParams, width " + width + " height " + height);        return width +"_" + height;    }

      Unity端

      则Unity的C#脚本,可以这么写:

      AndroidJavaObject androidVideoPlugin = new AndroidJavaObject("com.iqiyi.cutgreenvideosdk.VideoPlugin");String width_height = androidVideoPlugin.CallStatic("GetVideoParams");

      其中com.iqiyi.cutgreenvideosdk.VideoPlugin是Android方法的包名和类名。
      CallStatic即表示,调用某个类的静态方法,且返回值是String。如果返回值要Int或者bool啥的,对应修改即可,例如CallStatic< bool >。

      2.2 例子2

      Android端

      Android有一个方法

      public void start(Context context, int externalTextureId) {....}

      这个不是静态的方法了,但需要传递context对象。

      Unity端

      AndroidJavaObject androidVideoPlugin = new AndroidJavaObject("com.iqiyi.cutgreenvideosdk.VideoPlugin");//get activity AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");            AndroidJavaObject activity = unityPlayer.GetStatic("currentActivity");             androidVideoPlugin.Call("start", activity, 1);

      Call后面是android端的方法名,以及参数。

      3 异步方法如何调用

      异步的话,可以这样:

      Unity发起调用,Android处理调用,并通过消息,通知给Unity。

      具体而言。首先,Java是有办法向C#发消息的:

      UnityPlayer.UnitySendMessage

      这个类的调用方式:

      UnityPlayer.UnitySendMessage(“GameObjectName”, “MethodName”, “parameter to send”);

      第一个参数,是Unity的对象名字,注意,不是脚本名字喔!!!

      第二个参数,是挂载在Unity对象的某个脚本的方法名称

      第三个参数,是方法的参数。

      3.1 Android端

      3.1.1 添加依赖

      首先,要把UnityPlayer依赖进来。在哪里呢?

      在你的Unity安装目录下,Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes
      里面有个classes.jar,拿出来,放到Android工程,具体模块的libs目录下。

      然后android gradle添加依赖:

      dependencies {    compileOnly files('libs/classes.jar')}

      当然了,你开心的话,也可以把jar改个名字。

      注意,需要compileOnly而不是implementation,否则打包aar到Unity后,会把libs目录也打包到aar,最后Unity编译apk会失败,因为有重复的classes.jar。

      3.1.2 代码逻辑

          private static String mGameObject = "";    private static String mCallbackFunction = "";    public static void checkPermission(Context context, String gameObject, String callbackFunction) {        Log.i(TAG, "checkPermission gameObject " + gameObject + " callbackFunction " + callbackFunction);        mGameObject = gameObject;        mCallbackFunction = callbackFunction;        //TODO 做实际处理,例如请求权限    }//处理完事情,通过消息告诉Unity结果    private static void notifyResult(boolean permissionGranted) {        try {            //参数1, 脚本挂载的gameObject名称,参数2, 脚本方法,参数3,返回值            Log.w(TAG, "notifyResult, permissionGranted " + permissionGranted + " mGameObject " + mGameObject + " mCallbackFunction " + mCallbackFunction);            UnityPlayer.UnitySendMessage(mGameObject, mCallbackFunction, permissionGranted ? "1" : "0");            getInstance().mContext = null;        } catch (Exception e) {            e.printStackTrace();        }    }

      上面的checkPermission由Unity调用。notifyResult则是处理完事情,通过消息告诉Unity结果。

      3.2 Unity端

      首先是调用的方法:

          private void checkPermission()    {        Debug.Log(TAG + "checkPermission");        AndroidJavaObject nativeObject = new AndroidJavaObject("com.iqiyi.cutgreenvideosdk.PermissionHelper");        nativeObject.CallStatic("checkPermission", activity, "AndroidVideoScreen", "onPermissionResult");//AndroiwdVideoScreen 为脚本挂载的对象,onPermissionResult为脚本监听回调的函数名称     }

      这里,把脚本所挂载的对象名字,即AndroidVideoScreen,传递给了Android。以及把脚本处理的回调函数名称onPermissionResult,也告诉Android。

      接着,就是实现onPermissionResult, 等着接收回调了:

          public void onPermissionResult(String resultCode)    {       //TODO    }

      总结

      到此这篇关于Unity同步/异步调用Android的文章就介绍到这了,更多相关Unity同步异步调用Android内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

      更多相关文章

      1. AsyncTask研究(以Android(安卓)10.0为准)
      2. Android(安卓)Power Management
      3. Android高级开发面试题以及笞案整理
      4. Android开发新选择:Kotlin
      5. android5.0以上实现录屏功能,并将录屏内容在相册中显示!(unity调用a
      6. Android的消息机制
      7. android中的Context到底是什么?你了解吗
      8. 浅谈Java中Collections.sort对List排序的两种方法
      9. Python list sort方法的具体使用

      随机推荐

      1. Android开发之Android体系架构介绍
      2. android开发笔记之2012版辅助开发工具包(A
      3. Android和Linux的关系
      4. android adb工具
      5. Android(安卓)adb中命令的运行
      6. Android(安卓)串口通信开发笔记01
      7. 如何保证Android设备的安全性
      8. Android使用Jdbc连接远程数据库
      9. Android入门教程(三)之------导入现有And
      10. Android开发手记一 NDK编程实例