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

目录
  • 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<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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

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

    目录 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

  • springboot 异步调用的实现方法

    说异步调用前,我们说说它对应的同步调用.通常开发过程中,一般上我们都是同步调用,即:程序按定义的顺序依次执行的过程,每一行代码执行过程必须等待上一行代码执行完毕后才执行.而异步调用指:程序在执行时,无需等待执行的返回值可继续执行后面的代码.显而易见,同步有依赖相关性,而异步没有,所以异步可并发执行,可提高执行效率,在相同的时间做更多的事情. 同步 程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 异步 程

  • JavaScript 异步调用框架 (Part 6 - 实例 & 模式)

    封装Ajax 设计Async.Operation的最初目的就是解决Ajax调用需要传递callback参数的问题,为此我们先把Ajax请求封装为Async.Operation.我在这里使用的是jQuery,当然无论你用什么基础库,在使用Async.Operation时都可以做这种简单的封装. 复制代码 代码如下: var Ajax = {}; Ajax.get = function(url, data) { var operation = new Async.Operation(); $.get

  • C#调用SQLite的方法实例分析

    本文实例讲述了C#调用SQLite的方法.分享给大家供大家参考.具体分析如下: 一.SQLite简介: 当我们用到海量数据时一般会用Oracle,SQL Server,DB2,Sybase,MySQL等数据库来保存和管理数据.如果只是程序中需要保存少量数据的话直接整到注册表里,或者保存到一个XML文件中.那如果数据量刚好不多不少,用Oracle这样的数据库有点小题大作,没有必要.有个XML保存的话存取速度又比较慢.咋整呢?这时用SQLite这个小型的嵌入式数据库就是非常理想的选择.它用起来也很简

  • js调用后台servlet方法实例

    1.使用document.form.action方式 相关源码如下: *.js [javascript] 复制代码 代码如下: <span style="white-space:pre">  </span> document.getElementById("sendPerson").value = SendPerson;  document.getElementById("currentTime").value = cur

  • 简单了解python调用其他脚本方法实例

    1.用python调用python脚本 #!/usr/local/bin/python3.7 import time import os count = 0 str = ('python b.py') result1 = os.system(str) print(result1) while True: count = count + 1 if count == 8: print('this count is:',count) break else: time.sleep(1) print('t

  • Java:DocumentBuilderFactory调用XML的方法实例

    首先得到:得到 DOM 解析器的工厂实例      DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance(); 然后从 DOM 工厂获得 DOM 解析器 DocumentBuilder dombuilder=domfac.newDocumentBuilder(); )把要解析的 XML 文档转化为输入流,以便 DOM 解析器解析它 InputStream is= new  FileInputStream("test1.x

  • jquery异步调用页面后台方法&#8207;(asp.net)

    复制代码 代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="JqueryCSMethodForm.aspx.cs" Inherits="JQuerWeb.JqueryCSMethodForm" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&

  • C++生成dll和调用dll的方法实例

    本人根据网络多个相关博客帖子原创 1)生成dll 建立两个文件 xxx.h , xxx.cpp xxx.h内容如下: #ifdef BUILD_XXX_DLL#define EXPORT __declspec(dllexport)#else#define EXPORT __declspec(dllimport)#endif extern "C"{EXPORT void example(void);... ...} xxx.cpp内容如下: #define BUILD_XXX_DLL#i

  • 怎样实现android http-post方法实例说明

    复制代码 代码如下: package com.hl; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Map;

随机推荐