Unity同步/异步调用Android的方法实例

 更新时间:2021年08月29日 14:59:04   作者:长江很多号  
unity在Android端开发的时候,免不了要调用Java,下面这篇文章主要给大家介绍了关于Unity同步/异步调用Android的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

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

其中com.iqiyi.cutgreenvideosdk.VideoPlugin是Android方法的包名和类名。
CallStatic<String>即表示,调用某个类的静态方法,且返回值是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<AndroidJavaObject>("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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android中自定义view实现侧滑效果

    Android中自定义view实现侧滑效果

    这篇文章主要介绍了Android中自定义view实现侧滑效果的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-11-11
  • FragmentTabHost使用方法详解

    FragmentTabHost使用方法详解

    这篇文章主要为大家详细介绍了Android中FragmentTabHost的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • android图像绘制(七)ClipRect局部绘图/切割原图绘制总结

    android图像绘制(七)ClipRect局部绘图/切割原图绘制总结

    这几天开始学游戏地图制作,今天小小的总结一下Canvas的clipRect()接口的使用,接下来介绍ClipRect局部绘图/切割原图绘制感兴趣的朋友可以了解下
    2013-01-01
  • Android动态修改ToolBar的Menu菜单示例

    Android动态修改ToolBar的Menu菜单示例

    本篇文章主要介绍了Android动态修改ToolBar的Menu菜单示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • 代码分析Android消息机制

    代码分析Android消息机制

    本文通过代码实例详细分析了Android消息机制的相关知识点,对此有需要的朋友可以参考学习下。
    2018-03-03
  • android杂记:C++文件的添加log方法分享

    android杂记:C++文件的添加log方法分享

    这篇文章介绍了android杂记:C++文件的添加log方法,有需要的朋友可以参考一下
    2013-09-09
  • Flutter持久化存储之数据库存储(sqflite)详解

    Flutter持久化存储之数据库存储(sqflite)详解

    这篇文章主要给大家介绍了关于Flutter持久化存储之数据库存储的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Flutter具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • 深入解析Android中的事件传递

    深入解析Android中的事件传递

    这篇文章主要介绍了关于Android中的事件传递,文中介绍的非常详细,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-03-03
  • android USB如何修改VID具体实现

    android USB如何修改VID具体实现

    在android 设备的Linux 内核中把 USB 驱动的 PID VID 修改以后,也许之前的adb工具就不能识别设备了,会打印出"device not found"的提示
    2013-06-06
  • 详解Android的内存优化--LruCache

    详解Android的内存优化--LruCache

    LruCache是基于Lru算法实现的一种缓存机制。本文对LruCache的概念和实现原理进行介绍,通过实例分析和使用介绍,让大家更好的了解LruCache,下面跟着小编一起来看下吧
    2016-12-12

最新评论