Unity同步/异步如何调用Android的方法

这篇文章主要介绍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的方法”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!