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内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!
相关文章
- 这篇文章主要介绍了Spring AOP 对象内部方法间的嵌套调用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-08-29
- <?php require('path.inc.php'); header('content-Type: text/html; charset=utf-8'); $borough_id = intval($_GET['id']); if(!$borough_id){ echo ' ...2016-11-25
- 这篇文章主要介绍了c# 三种方法调用WebService接口的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-07-07
- 这篇文章主要介绍了js实现调用网络摄像头及常见错误处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-07
- 这篇文章主要介绍了解决Vue watch里调用方法的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-07
- 这篇文章介绍了c#动态调用Webservice的两种方法实例,有需要的朋友可以参考一下...2020-06-25
- 这篇文章主要给大家介绍了关于c#中的WebService及其调用方式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
- 这篇文章主要介绍了解决vue watch数据的方法被调用了两次的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-07
- 这篇文章主要介绍了C#中异步和多线程的相关资料,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下...2021-01-16
- 下面小编就为大家带来一篇C#中加载dll并调用其函数的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- 多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性。甚至有些时候我们就认为多线程和异步操作是等同的概念。但是,多线程和异步操作还是有一些区别的。而这些区别造成了使用多线程和异步操作的时机的区别...2020-06-25
- 本篇文章主要介绍了C# Socket异步通信,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- 这篇文章主要介绍了javascript实现方法调用与方法触发小结的相关资料,需要的朋友可以参考下...2016-03-30
- 本文章来给大家详细介绍在php中如何来调用执行mysql存储过程然后返回由存储过程返回的值了,有需要了解的同学可进入参考。 。调用存储过程的方法。 a。如果存储过...2016-11-25
- 这篇文章主要为大家详细介绍了Unity时间戳的使用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要给大家介绍了关于JS异步的执行原理和回调的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-08
- 我们要明确,为什么要进行异步回调?众所周知,普通方法运行,是单线程的,如果中途有大型操作(如:读取大文件,大批量操作数据库,网络传输等),都会导致方法阻塞,表现在界面上就是,程序卡或者死掉,界面元素不动了,不响应了...2020-06-25
- 这篇文章主要介绍了C#调用python脚本的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
- 这篇文章主要给大家介绍了关于c# winform异步不卡界面的实现方法,文中通过示例代码介绍的非常详细,对大家学习或者使用c#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-06-25
- 这篇文章主要介绍了JQuery基于FormData异步提交数据文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-02