Unity同步或异步调用Android的方法
Posted 长江很多号
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的方法的主要内容,如果未能解决你的问题,请参考以下文章