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

这篇具有很好参考价值的文章主要介绍了unity桥接调用Android方法及回调完整流程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、桥接初接触

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

2、工程导出说明

勾选Export导出AS工程
unity桥接调用Android方法及回调完整流程

导出后,工程目录如下,首次导出的工程作为我们的AS出包工程,在这个工程里面进行AS相关SDK接入调用的配置。后续项目更新时,我们导出的工程作为unity资源,替换AS工程中的unity资源。unity资源为unityLibrary文件夹。
unity桥接调用Android方法及回调完整流程

3、AS环境配置

SDK选择: unity工程导出AndroidStudio工程,
打开AS工程弹出提示用哪个SDK时,选择用项目的SDK,如果没有提示,则在setting 面板中看一下,是不是unity编辑器的SDK路径
unity桥接调用Android方法及回调完整流程

Gradle则需要自己手动选择unity编辑器的路径
unity桥接调用Android方法及回调完整流程

确保AS和unity使用同一版本的SDK和gradle。
引用unity jar
引用项目libs下的unity-classes.jar文件,引用代码如下
implementation fileTree(dir:project(‘:unityLibrary’).getProjectDir().toString()+(‘\libs’),includes: [‘*jar’])
unity桥接调用Android方法及回调完整流程

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

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文件夹
unity桥接调用Android方法及回调完整流程

2、创建两个包,com.bridge、pers.study.android2unity
unity桥接调用Android方法及回调完整流程
3、创建类
com.bridge包下创建BridgeActivity类,该类继承于UnityPlayerActivity
pers.study.android2unity包下创建普通类Helper
unity桥接调用Android方法及回调完整流程
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 {
    /**
     * 定义接口返回格式 可自定义 可以定义json  自己解析
     * @param json
     */
    void OnCallback(String json);
}

unity桥接调用Android方法及回调完整流程
完整桥接代码文末附上

5、设置启动Activity

如图,launcher文件夹导出工程自带,我们把桥接的代码放到了launcher/src/main/java下面。对应的,我们需要在AndroidManifest.xml里设置启动BridgeActivity活动页
unity桥接调用Android方法及回调完整流程
核心代码如下,在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://www.toymoban.com/news/detail-476407.html

到了这里,关于unity桥接调用Android方法及回调完整流程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uniapp - 微信小程序接入腾讯视频播放器功能插件,uniapp开发微信小程序端调用引入并使用腾讯视频播放组件完整全流程(详细示例源码,一键复制开箱即用)

    在uniapp 微信小程序项目中,集成腾讯视频功能插件,实现播放腾讯视频效果,附带详细示例源码及注释, 你可以跟着步骤一步步来,保证几分钟就能快速在uniapp小程序项目中植入腾讯视频功能!

    2024年02月12日
    浏览(35)
  • unity调用其它脚本函数方法

       调用    

    2024年02月07日
    浏览(38)
  • js调用android 方法

    客户端

    2024年02月07日
    浏览(26)
  • Unity3d发布android项目,打包apk包流程(unity2021.3.10)

    1、如下图,在安装版本设置里,点击添加模块。如果没有添加模块,证明你安装路径不是目前版本的安装路径,先去设置回来。 2、框选Android Build Support,点击继续,如下图, 3、同意,安装,如下图, 4、等待安装完成即可,如下图。 1、点击菜单栏File→Build Settings,进行编辑

    2023年04月23日
    浏览(37)
  • unity 停止调用InvokeRepeating()的方法

    可以使用CancelInvoke()函数来停止InvokeRepeating()的调用。示例如下: 这个示例代码中,首先在Start()函数中调用InvokeRepeating()函数来循环调用一个自定义的函数RepeatFunction(),时间间隔为repeatTime变量的值。然后在Update()函数中监听键盘按键操作,如果检测到用户按下了空格键,就调

    2024年02月16日
    浏览(23)
  • unity教程||Unity调用安卓方法实现安装apk文件

    记录下,个人之前做一个项目的时候碰到一个需求,安卓端的app中需要做冷更新,这里简单解释下冷更新,其实就是拿当前的app的版本号比对服务器上的版本号,如果服务器上有新版本,就下载新版本的apk,然后安装替换掉整个app,就是冷更新。但是具体实现的时候碰到个问

    2024年02月07日
    浏览(31)
  • JAVA的回调机制、同步/异步调用

    同步调用是最基本的调用方式。类A的a()方法调用类B的b()方法, 类A的方法需要等到B类的方法执行完成才会继续执行 。如果B的方法长时间阻塞,就会导致A类方法无法正常执行下去。 如果A调用B,B的执行时间比较长,那么就需要考虑进行异步处理,使得B的执行不影响A。通常

    2024年02月14日
    浏览(25)
  • Unity3D PC、Android、iOS平台打包流程

    在Unity窗口中,按下Ctrl+Shift+B快捷键,或者在菜单栏选择File-BuildSettings...,打开设置窗口。“Platform”下的选择项默认选择“Windows,Mac,Linux”。单击左下方的“Player Settings...”继续后续设置(应用名、应用分辨率、图标等),如图1-1所示。 图1-1 PC平台选择 接着,点击Add Op

    2023年04月20日
    浏览(44)
  • JS如何调用Android原生方法

    一、引入 JSBridge JSBridge 主要是给 JavaScript 提供调用 Native 功能的接口,让混合开发中的前端部分可以方便地使用 Native 的功能(例如:通讯录、蓝牙)。 而且 JSBridge 的功能不止调用 Native 功能这么简单宽泛。实际上,JSBridge 就像其名称中的Bridge的意义一样,是 Native 和非 Nat

    2024年02月11日
    浏览(25)
  • Unity与原生交互之AndroidStudio篇——Unity导出Android工程,导入AndroidStudio打包APK全流程

          unityLibrary: unity的功能库模块 , android工程用到的重要文件夹 launcher: unity的启动器模块,包含很少的java代码   直接Open unity导出的整个android项目,Launcher模块作为app启动模块  1.AS先New一个空项目:   Empty Activity 不能选择Language,默认为Kotlin语言  Empty Views Activity 可以选择

    2024年02月11日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包