Unity与Android交互通信系列(3)

这篇具有很好参考价值的文章主要介绍了Unity与Android交互通信系列(3)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  在上两篇文章中,我们已经能够通过直接使用Java,或者通过AndroidJavaClass、AndroidJavaObject这两个类实现在Unity端和Android原生端的通信。这已经可以解决很多问题,但这种方式不够模块化,不够优雅。

  在实际使用中,将Android端代码编译成aar包供Unity端调用更有利于代码管理、人员分工、降低开发工具之间的耦合,而且目前有大量第三方库是通过aar包的形式提供,本节我们主要演示通过Android Studio生成aar包及在Unity中调用aar包中功能的流程及方法。
在Android Studio中生成aar包流程如下:

  (1)创建新Android Studio工程。在Android Studio中,依次选择File →New → New Project,如图1所示。
Unity与Android交互通信系列(3),Unity,unity,android,交互,Unity与Android通信

图1 创建新工程

  选择New Project之后会打开新工程创建面板,如图2所示,在面板左侧列表中选择Phone and Tablet,然后在右侧图像列表中选择No Activity、Basic Activity、Empty Activity模板之一,本节选择Empty Activity模板。
Unity与Android交互通信系列(3),Unity,unity,android,交互,Unity与Android通信

图2 新工程创建面板

  选择好所使用的工程模板后,点击Next进入工程信息填写面板,如图3所示,其中Package name即为所使用的包名,需要认真填写;Minimum SDK建议选择Android 8.0以上(ARCore不支持Android 7.0以下版本);其余项可根据需要填写,点击Finish按钮完成工程创建。

Unity与Android交互通信系列(3),Unity,unity,android,交互,Unity与Android通信

图3 填写工程信息

  工程创建完成后,因为我们希望以模块的形式导出aar包,所以首先创建应用模块。在新创建的工程左侧Project列表面板app目录上鼠标右键,在弹出的级联菜单中依次选择New →Module,如图4所示。

Unity与Android交互通信系列(3),Unity,unity,android,交互,Unity与Android通信

图4 新建Module模块

  在打开的新建模块面板中,因为我们希望创建Android类库,在其左侧列表中选择Android Library,然后在右侧面板中填写Module name(模块名)与其它信息,如图5所示,最后点击Finish按钮完成android2unity模块的创建[ 在本示例中,工程名与模块名重名,实际使用中建议根据模块功能命名并避免与工程重名]。

Unity与Android交互通信系列(3),Unity,unity,android,交互,Unity与Android通信

图5 Module模块信息填写面板

  Android Studio会自动生成模块的层级结构,依次选择android2unity模块下的java →com.davidwang.android2unity包名,并在其上鼠标右键打开级联菜单,如图6所示。

Unity与Android交互通信系列(3),Unity,unity,android,交互,Unity与Android通信

图6 在模块下新建Java类

  在弹出的级联菜单中依次选择New →Java Class创建新类,本节类名命名为example,并编写代码如下:

//代码片段1
//Java端代码
package com.davidwang.android2unity;

import android.app.Activity;
import android.widget.Toast;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class example {
    private Activity _unityActivity;
    private String _unityObject;
private String _unityMethod;
//初始化,注册Unity对象与回调方法
    public void Init(String unityObject,String unityMethod){
        try {
            Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");
            Activity activity = (Activity) classtype.getDeclaredField("currentActivity").get(classtype);
            _unityActivity = activity;
        }
        catch (ClassNotFoundException e) { }
        catch (IllegalAccessException e) { }
        catch (NoSuchFieldException e) { }
        _unityObject = unityObject;
        _unityMethod = unityMethod;
}
//通过UnitySendMessage方法传播消息
    private boolean callUnity(String args){
        try {
            Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");
            Method method =classtype.getMethod("UnitySendMessage", String.class,String.class,String.class);
            method.invoke(classtype,_unityObject,_unityMethod,args);
            return true;
        }
        catch (ClassNotFoundException e) {}
        catch (NoSuchMethodException e) {}
        catch (IllegalAccessException e) {}
        catch (InvocationTargetException e) {}
        return false;
}
//调用Android端本地方法
    public boolean showToast(String content){
        Toast.makeText(_unityActivity,content,Toast.LENGTH_SHORT).show();
        callUnity("Call from android");
        return true;
    }
}

  在上述代码中,我们采用UnitySendMessage()消息传播方式回调Unity端的方法,由于UnitySendMessage()方法需要明确的场景中游戏对象、游戏对象脚本中方法名作为参数,为方便Unity中的调用,这里通过Init()方法由Unity端注入这两个参数,从而不需要一一绑定游戏对象与脚本方法名。同时,为避免引入Unity引擎的Classes.jar包,这里采用了反射的方式获取当前Activity。

  至此,Android端的模块已完成,在左侧Project列表中选中android2unity模块,然后在Android Studio菜单中依次选择Build →Rebuild Project开始构建模块aar包,如图7所示,构建完成后,可以在android2unity模块下的build →outputs →aar目录中找到生成的aar包。

Unity与Android交互通信系列(3),Unity,unity,android,交互,Unity与Android通信

图7 构建模块aar包

  将该aar包文件复制到Unity工程Assets/Plugins/Android目录或其子目录下,完成aar包的导入。为测试其功能,在Unity中新建Android2Unity.cs脚本文件,代码如下:

//代码片段2
//C#端代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Android2Unity : MonoBehaviour
{
    void Start()
    {
        using(AndroidJavaObject jo = new AndroidJavaObject("com.davidwang.android2unity.example"))
        {
            jo.Call("Init",gameObject.name, "AndroidCallback");
            bool success = jo.Call<bool>("showToast", "Content from unity");
            if (true == success)
            {
                Debug.Log("Method executed");
            }
        }
}
//Android端回调的方法
    public void AndroidCallback(string str)
    {
        Debug.Log(str);
    }
}

  该脚本逻辑比较简单,首先通过实例化Android端的类,并通过其Init()方法注入回调游戏对象名及脚本方法名。将该脚文件挂载到场景中的任意对象上,连接手机,打包运行,可以看到,Unity端的方法参数可以正确传递到Android端,Android端也可以正确回调Unity端的脚本方法。

  由于UnitySendMessage()方法需要遍历场景中的游戏对象,效率并不很高,特别是在频繁调用或者场景比较复杂的情况下可能会导致性能问题,在实际开发中,建议通过AndroidJavaProxy类交互。通过构建模块aar包的形式,有利于代码管理,并且可以方便的整合第三方类库,提供一个整体的模块方案,简化Unity端的调用形式。

  通过这种包/库的方式调用就舒服多了。文章来源地址https://www.toymoban.com/news/detail-766911.html

到了这里,关于Unity与Android交互通信系列(3)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【Unity3D】Unity与Android交互

            本文主要介绍 Unity 打包发布 Android apk 流程、基于 AndroidJavaObject(或 AndroidJavaClass)实现 Unity 调用 Java 代码、基于 UnityPlayer 实现 Java 调用 Unity 代码,官方介绍见→Android。         Unity 项目 C# 中获取平台的代码如下,需要引入 UnityEngine 命名空间。         Ru

    2024年02月07日
    浏览(44)
  • Unity与Android交互(4)——接入SDK

    【前言】 unity接入Android SDK有两种方式,一种是把Unity的工程导出google project的形式进行接入,另一种是通过把Android的工程做成Plugins的形式进行接入。我们接入SDK基本都是将SDK作为插件的形式接入的。 对我们接入SDK的人来说,SDK也是分等级的: 第一等级:只有so文件,这种

    2024年02月16日
    浏览(41)
  • Unity与Android交互(3)——需要了解的Andorid基础知识

    【前言】 在上一篇文章中只是说了如何实现unity和android交互的问题,要了解其中的原理还必须要先了解一些Android的基础知识,了解后也能搞清楚如何接入SDK或者写Native插件。 (以下只是简要介绍,详细的内容需要自己去看链接) 【Android四大组件】 Activitiy 它提供了一个窗口

    2024年02月10日
    浏览(44)
  • 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日
    浏览(42)
  • 【unity与android的交互】移动游戏发布更安心!Unity安卓平台打包相关的常见参数全详解

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 :Unity基础实战 首先需要切换到安卓平台 step1 :打包前的基础参数的设置 step2:包名的设置需要勾选,必须要去设置的内容 打包后进行测

    2024年04月17日
    浏览(72)
  • Unity3D2020+导出Android工程中使用并交互

    , 目录 1,版本信息 2,前期准备 Unity方面: Android方面: 3,Android与Unity3D交互 unity2020+ android studio 2021 *不要用android studio 2020系列,存在不能导入Library的bug 1,先配置打包的一些必要要素,包括包名之类 2,修改打包选项,将其打包为Android工程  3,打包出来的工程如下,其中

    2023年04月08日
    浏览(60)
  • Unity3d使用Netcode实现Hololens、Android和Pc端通信

    在Unity3d中使用现有的Netcode/Mirror组件实现Hololens、Android和Pc端的三方通信,可以指定一平台为服务器端,其他的两平台多为客户端,不过通常是进行两个平台的通信即可。在这片文章中,可以实现平移、缩放以及旋转的同步 具体步骤如下: 版本:unity2020.3LTS、VS2019 一、配置

    2024年02月09日
    浏览(49)
  • Unity与Js通信交互

    目录 1.Js给Unity传递消息 2.Unity给Js传递消息 其中,__objectName__ 是场景中的对象名称;__methodName__ 是当前附加到该对象的脚本中的方法名称;__value__ 可以是字符串、数字,也可为空。   unityInstance在打包之后index.html的位置  在别的地方用unityInstance,要在图片红框位置后面打括号

    2024年02月03日
    浏览(26)
  • Unity3D开发之unity和js通信交互

    官方 方法分享:Unity - 手动:与浏览器脚本的交互 (unity3d.com) 首先需要写一个JS的脚本,主要是调用mergeInto();方法,第一个参数不用变,第二个参数就是JS的方法集合。写完之后将这个文件的后缀改为.jslib,放到Plugins文件夹中  Test  内容: 2.C#(挂在场景 任意物体上) 3.Uni

    2024年02月12日
    浏览(40)
  • 基于Unity+Vue3通信交互的WebGL项目发布实践

    问题背景 我们最近需要把unity开发的pc项目迁移到web端,因为unity支持发布webgl。所以按照以往的开发流程,都是项目开发完成就发布webgl部署到服务器。 突然有一天,测试人员提出说为什么我们做的网页跟别人的不太一样呢?具体看下面两张图: 1、unity使用ugui做的界面发布

    2024年04月17日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包