我的编程空间,编程开发者的网络收藏夹
学习永远不晚

unity桥接调用Android方法及回调完整流程

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

unity桥接调用Android方法及回调完整流程

1、桥接初接触

作为一个完整的游戏,在unity开发完成后,需要接入SDK。SDK就是手游渠道(如应用宝、小米应用商店、华为应用商店等)提供的集成了账号注册登录、充值、防沉迷、游戏公告、分享、社区入口、push消息、数据上报、礼包或折扣券等功能的一个集合。
而大多数情况下,作为unity开发是不熟悉Android Studio开发环境的。网上也有一些桥接的案例,但是自己做的时候会由于对Android Studio不熟悉而出现各种问题。我浏览过一些Android Studio的教程,感觉太过于专注细节,适合AS开发的人员专门学习。AS官方的部分文档更适合我们去看,特别是应用文件清单和应用架构,当然了解更多,更有利于我们的理解以及解决更深层次的bug,但是作为初次接触,为了跑通桥接,花费大量的精力是不值得的,后续可以有计划地循序渐进地学习。这是官方链接,下面具体说一下桥接的内容。

2、工程导出说明

勾选Export导出AS工程
[图片]

导出后,工程目录如下,首次导出的工程作为我们的AS出包工程,在这个工程里面进行AS相关SDK接入调用的配置。后续项目更新时,我们导出的工程作为unity资源,替换AS工程中的unity资源。unity资源为unityLibrary文件夹。
[图片]

3、AS环境配置

SDK选择: unity工程导出AndroidStudio工程,
打开AS工程弹出提示用哪个SDK时,选择用项目的SDK,如果没有提示,则在setting 面板中看一下,是不是unity编辑器的SDK路径
[图片]

Gradle则需要自己手动选择unity编辑器的路径
[图片]

确保AS和unity使用同一版本的SDK和gradle。
引用unity jar
引用项目libs下的unity-classes.jar文件,引用代码如下
implementation fileTree(dir:project(‘:unityLibrary’).getProjectDir().toString()+(‘\libs’),includes: [‘*jar’])
[图片]

设置启动Activity
如下图是导出工程默认的启动过滤器,我们需要启动我们自己接入SDK的Activity,否则继承于UnityPlayerActivity的Activity无法启动,对应的activity里的方法也无法完成桥接调用。Activity配置前,首先我们要有一个activity。这个配置放到最后再讲。
[图片]

4、unity调用Android及回调

unity端

unity端调用方式有以下4种:
1、调用Android普通class的静态方法
AndroidJavaObject helper = new AndroidJavaObject(“包名.类名”);
helper.CallStatic(“方法名”, 参数1,参数2…);
example:
AndroidJavaObject helper = new AndroidJavaObject(“pers.study.android2unity.Helper”);
helper.CallStatic(“getMessageFormUnity”, “我是 unity ===”);
使用时,我们要确保,Android端有对应的包、类、方法,且参数一一对应。
2、调用Android普通class的非静态方法
AndroidJavaObject helper = new AndroidJavaObject(“包名.类名”);
helper.Call(“方法名”, 参数1,参数2…);
example:
AndroidJavaObject helper = new AndroidJavaObject(“pers.study.android2unity.Helper”);
helper.Call(“setAndroudForUntiyListener”, listener);
3、调用Android继承于unityplayerActivity的activity静态方法
下面两行是必写的,且参数“com.unity3d.player.UnityPlayer”,“currentActivity”是固定的,不能更改。用于获取UnityPlayer和当前Activity。
AndroidJavaClass jclass = new AndroidJavaClass(“com.unity3d.player.UnityPlayer”);
AndroidJavaObject jcontext = jclass.GetStatic(“currentActivity”);
//BridgeActivity是继承于unityplayerActivity的类
AndroidJavaClass loginObject = new AndroidJavaClass(“com.bridge.BridgeActivity”);
loginObject.CallStatic(“showToast”, jcontext)
4、调用Android继承于unityplayerActivity的activity非静态方法
//同上,下面两行必写
AndroidJavaClass jclass = new AndroidJavaClass(“com.unity3d.player.UnityPlayer”);
AndroidJavaObject jcontext = jclass.GetStatic(“currentActivity”);
//安卓端add方法有两个参数,且返回值为int类型
jcontext.Call(“add”, 15, 9);

安卓端

按照unity端调用的形式,我们需要一个类继承于UnityPlayerActivity,一个为普通类。先创建包和类
1、创建java文件夹
[图片]

创建两个包,com.bridge、pers.study.android2unity
[图片]
3、创建类
com.bridge包下创建BridgeActivity类,该类继承于UnityPlayerActivity
pers.study.android2unity包下创建普通类Helper
[图片]
BridgeActivity下创建两个方法用于unity调用

public int add(int a,int b) {    return a + b;}public static void showToast(Context context){    Toast.makeText(context, "安卓发起 土司", Toast.LENGTH_SHORT).show();}

Helper下创建两个方法用于unity调用

public void setAndroudForUntiyListener(AndroidSendMessageToUnityListener listener2) {}public static void getMessageFormUnity(String json){}

完整回调

unity端
创建类,用于实现回调功能
AndroidJavaProxy类可用于实现任何 Java 接口。与代理对象中的接口匹配的任何 Java vm 方法调用都将自动传递给 c# 实现

public class AndroidSendMessageToUnityListener : AndroidJavaProxy{    private Action<string> callback;    public AndroidSendMessageToUnityListener(Action<string> callback) : base("pers.study.android2unity.AndroidSendMessageToUnityListener")    {        this.callback = callback;    }    public void OnCallback(string json)    {        if (callback != null)        {            callback(json);        }    }}

Android端
创建接口

package pers.study.android2unity;public interface AndroidSendMessageToUnityListener {        void OnCallback(String json);}

[图片]
完整桥接代码文末附上

5、设置启动Activity

如图,launcher文件夹导出工程自带,我们把桥接的代码放到了launcher/class="lazy" data-src/main/java下面。对应的,我们需要在AndroidManifest.xml里设置启动BridgeActivity活动页

核心代码如下,在com.bridge.BridgeActivity里面添加intent-filter启动过滤器即可启动,

<activity android:name="com.bridge.BridgeActivity">  <intent-filter>    <action android:name="android.intent.action.MAIN" />    <category android:name="android.intent.category.LAUNCHER" />  </intent-filter></activity>

放一个官网链接,官方解释如下
每个 Intent 过滤器均由应用清单文件中的 元素定义,并嵌套在相应的应用组件(例如, 元素)中。在 内部,您可以使用以下三个元素中的一个或多个指定要接受的 Intent 类型:
在 name 属性中,声明接受的 Intent 操作。该值必须是操作的文本字符串值,而不是类常量。
使用一个或多个指定数据 URI(scheme、host、port、path)各个方面和 MIME 类型的属性,声明接受的数据类型。
在 name 属性中,声明接受的 Intent 类别。该值必须是操作的文本字符串值,而不是类常量。

此时,桥接便完成了,在unity中导出工程,将资源文件夹复制到出包工程,替换出包工程中的资源。
代码链接

来源地址:https://blog.csdn.net/qq_37619255/article/details/129464734

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

unity桥接调用Android方法及回调完整流程

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

unity桥接调用Android方法及回调完整流程

1、桥接初接触 作为一个完整的游戏,在unity开发完成后,需要接入SDK。SDK就是手游渠道(如应用宝、小米应用商店、华为应用商店等)提供的集成了账号注册登录、充值、防沉迷、游戏公告、分享、社区入口、push消息、数据上报、礼包或折扣券等
2023-08-25

python网络编程调用recv函数完整接收数据的三种方法

最近在使用python进行网络编程开发一个通用的tcpclient测试小工具。在使用socket进行网络编程中,如何判定对端发送一条报文是否接收完成,是进行socket网络开发必须要考虑的一个问题。这里,简要介绍一下判别数据接收接收完成常用
2022-06-04

微信小程序分享及授权获取用户信息接口调整的方法

这篇文章主要介绍了微信小程序分享及授权获取用户信息接口调整的方法的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇微信小程序分享及授权获取用户信息接口调整的方法文章都会有所收获,下面我们一起来看看吧。调整方案具体如
2023-06-26

Android编程实现调用相册、相机及拍照后直接裁剪的方法

本文实例讲述了Android编程实现调用相册、相机及拍照后直接裁剪的方法。分享给大家供大家参考,具体如下:package com.cvte.health.phone; import java.io.File; import java.tex
2022-06-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录