【UnityAS】Unity Android Studio 联合开发快速入门:环境配置、AAR 集成与双向调用教程


这是一篇2021年的存档,使用Unity2020版本。
至今,Unity与AS很多通讯方式也是基于此衍生。
作为Unity与AS联合开发的受益者,难得掏出自己的饭碗,诸君共享!


在这里插入图片描述


Unity & Android Studio 联合开发快速入门

——Unity与AS之间的互相调用实战指南

在移动开发中,Unity 常常用于快速构建跨平台的 3D/2D 应用,而 Android Studio(AS)则是调用 Android 原生功能的利器。为了结合二者的优势,我们需要掌握 Unity 与 AS 的互相调用方式。本文将从环境配置开始,逐步讲解 Unity 调用 Android 方法、AS 调用 Unity 方法,以及实际的通信示例。


文章目录

  • Unity & Android Studio 联合开发快速入门
    • 一、Unity 环境配置
      • 1. 开发模块
      • 2. 开发平台
      • 3. 环境配置
    • 二、Visual Studio 配置
      • 方式1:Unity Hub 中勾选
      • 方式2:手动配置 Visual Studio
        • 先决条件
        • 安装 Visual Studio Tools for Unity
        • 检查更新
        • 配置 Unity 使用 VS
    • 三、Unity 调用 AS 导出的 aar
      • 1. AS 导出 aar
      • 2. Unity 导入 aar
      • 3. 编写脚本与绑定
      • 4. 调试与运行
      • 5. 运行结果
    • 四、AS 调用 Unity 导出的工程
      • 1. 示例脚本
      • 2. 导出 Android 工程
      • 3. 调用方式
      • 4. 常见问题
    • 五、Unity 与 AS 互相调用
      • 1. Unity 调用 AS
        • 方式1:继承 UnityPlayerActivity
        • 方式2:调用静态方法
        • 方式3:调用非静态方法 / 单例模式
      • 2.AS 调用 Unity
        • 方式1:UnitySendMessage
        • 方式2:使用 AndroidJavaProxy 实现回调通信
      • 3. Unity 调用 Android Toast 示例
        • Unity 直接调用 Android API
        • Unity 调用 AS 中的 Toast
    • 总结

一、Unity 环境配置

1. 开发模块

打开 Unity Hub → 安装 Unity 版本 → 添加模块时,勾选 Android Build Support
在这里插入图片描述

2. 开发平台

在 Unity 编辑器中切换到 Android 平台:
File → Build Settings → Android → Switch Platform
在这里插入图片描述

3. 环境配置

进入 Edit → Preferences → External Tools,确认 JDK、SDK、NDK 路径正确。
注意 Unity 版本兼容性,例如 Unity 2020 LTS 仅支持:

  • JDK 1.8
  • NDK 19.0.523213
    在这里插入图片描述

二、Visual Studio 配置

方式1:Unity Hub 中勾选

安装 Unity 时直接选择 Visual Studio 组件。
在这里插入图片描述

方式2:手动配置 Visual Studio

先决条件

确保已通过 Unity Hub 安装 Unity。

安装 Visual Studio Tools for Unity
  1. 打开 Visual Studio Installer。
  2. 选择安装或修改现有版本。
  3. 工作负载 中勾选 使用 Unity 的游戏开发
    在这里插入图片描述
检查更新
  • 帮助 → 检查更新,保持 VS 最新,确保 bug 修复与 Unity 支持。
    在这里插入图片描述
配置 Unity 使用 VS
  1. Unity → Edit > Preferences > External Tools
  2. External Script Editor 中选择 VS。
  3. 如未列出,可手动选择 devenv.exe
  4. 勾选 Editor Attaching,保证调试可用。

在这里插入图片描述


三、Unity 调用 AS 导出的 aar

1. AS 导出 aar

  • 在 AS 中编写 Java 方法。
    在这里插入图片描述

  • 执行 Gradle 构建:clean → assemble
    在这里插入图片描述

  • aar 生成路径:build/outputs/aar/
    在这里插入图片描述

2. Unity 导入 aar

将 aar 文件放入:
Assets/Plugins/Android/ 目录下,即可直接在 C# 中访问。
在这里插入图片描述

3. 编写脚本与绑定

  • 在 Unity C# 脚本中调用 aar 方法。
    在这里插入图片描述
  • 将脚本挂载到场景对象(如 Main Camera)。
    在这里插入图片描述

4. 调试与运行

  • 使用 Attach to Unity 调试。
    在这里插入图片描述

  • 注意:PC 模拟时返回值可能与 Android 不同(如布尔值)。
    *在这里插入图片描述

  • 构建 APK,在手机开启开发者模式后运行测试。

在这里插入图片描述

5. 运行结果

场景启动时调用 aar 方法,例如调用 showToast() 在手机端显示 Toast。
在这里插入图片描述


四、AS 调用 Unity 导出的工程

1. 示例脚本

在 Unity 中编写 C# 脚本,供 Android 调用。
在这里插入图片描述

2. 导出 Android 工程

Unity → Build Settings → Export Project
在这里插入图片描述
导出的文件目录如下
在这里插入图片描述

3. 调用方式

  • AS 直接导入:用 AS 打开导出的工程,直接运行。

在这里插入图片描述

  • 作为依赖模块导入:仅导入 unityLibrary 模块,集成到现有 AS 工程。
    在这里插入图片描述

修改安卓清单和gradle配置
该模块主要有一个UnityPlayerActivity,这是Unity官方提供的,它默认是全屏加载Unity工程导出的场景,注意,这是个示例,因此可以自定义修改它。

在这里插入图片描述

4. 常见问题

  • 找不到 so:检查 gradle 是否配置 abiFilters
    在这里插入图片描述
    由于习惯了如此引用,因此将内容修改如下图
    在这里插入图片描述

  • 找不到 aar:检查 dependencies 配置,确认项目级 gradle 是否包含仓库地址。

检查gradle文件中dependencies
在这里插入图片描述

检查工程的gradle(不是模块的gradle)是否有如下配置,(最新的AS创建的工程创建后没有如下内容)在这里插入图片描述

模块的gradle中添加如下内容
在这里插入图片描述


五、Unity 与 AS 互相调用

1. Unity 调用 AS

方式1:继承 UnityPlayerActivity

Android 端继承 UnityPlayerActivity,Unity 通过 AndroidJavaObject 调用。
unity代码:

AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity");
jo.Call ("login","这里是传过去的参数");

Android代码:

package com.example.test;public class MainActivity extends UnityPlayerActivity {public void login( String str )
{      }
方式2:调用静态方法

Unity 端:

AndroidJavaClass jc = new AndroidJavaClass("com.example.test.Test");
jc.CallStatic("login", "参数");

Android 端:

public class Test {public static void login(String str) { ... }
}
方式3:调用非静态方法 / 单例模式

Unity 通过 AndroidJavaObject 调用实例方法,或先调用静态方法获取单例,再调用非静态方法。

unity代码:


AndroidJavaObject jo = new AndroidJavaObject("com.example.test.Test"); 
jo.Call("login","");

Android代码:

package com.example.test;public class Test{public void login( String str ) {      }

2.AS 调用 Unity

把消息发送给Unity场景中指定物体上的指定方法
UnityPlayer.UnitySendMessage(“物体名称”, “方法名称”, 参数);
实例:

方式1:UnitySendMessage
UnityPlayer.UnitySendMessage("GameObjectName", "MethodName", "参数");

方式2:使用 AndroidJavaProxy 实现回调通信

UnitySendMessage 通过字符串传递消息不同,AndroidJavaProxy 提供了一种更稳定、更结构化的通信方式。它允许 Unity 实现 Android 端定义的接口,并将接口实现作为回调传递给 AS,从而实现双向通信,适合复杂场景。

步骤如下:

1. 在 AS 端定义接口
先在 Android 工程中编写一个接口,接口方法将作为回调被 Unity 实现。

package com.example.test;public interface UnityasrEventCallback {void Speechcontent(int a);void Test1(String msg);
}

2. 在 Unity 端实现该接口
在 Unity 中创建一个 C# 脚本,定义一个类继承 AndroidJavaProxy,并在构造方法中指定 AS 端接口的“包名+接口名”。然后实现接口中定义的方法。

public class AsrEventCallback : AndroidJavaProxy
{// 构造方法中传入 AS 端接口的完整类名public AsrEventCallback() : base("com.example.test.UnityasrEventCallback") { }// 实现接口中的方法public void Speechcontent(int content){int a = content;Debug.Log("收到来自AS的整型回调: " + a);}public void Test1(string msg){string b = msg;Debug.Log("收到来自AS的字符串回调: " + b);}
}

3. 在 Unity 中注册回调
在合适的生命周期方法(如 Start())中,将 AndroidJavaProxy 实例传递给 AS 的方法(如 setCallback)。

void Start()
{AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");// 创建代理实例AsrEventCallback asrEventCallback = new AsrEventCallback();// 将代理传递给 ASjo.Call("setCallback", asrEventCallback);
}

这样,AS 端只要调用 mCallback.Test1("xxx")mCallback.Speechcontent(123),就能触发 Unity 端的对应方法,实现回调通信。


3. Unity 调用 Android Toast 示例

Unity 直接调用 Android API
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaClass toast = new AndroidJavaClass("android.widget.Toast");
AndroidJavaObject context = jo.Call<AndroidJavaObject>("getApplicationContext");jo.Call("runOnUiThread", new AndroidJavaRunnable(() => {toast.CallStatic<AndroidJavaObject>("makeText", context, "Hello from Unity", toast.GetStatic<int>("LENGTH_SHORT")).Call("show");
}));
Unity 调用 AS 中的 Toast

Unity 调用:

jo.Call("testToast", "吐司!");

AS 端:

public void testToast(final String msg) {runOnUiThread(() -> Toast.makeText(MainActivity.this, msg, Toast.LENGTH_LONG).show());
}

总结

本文完整介绍了 Unity 与 Android Studio 互相调用的实现方式

  • Unity 环境与 VS 配置
  • Unity 调用 AS aar
  • AS 调用 Unity 工程
  • 双向通信方案(UnityPlayerActivity、静态方法、UnitySendMessage、AndroidJavaProxy)
  • 实际示例(Toast 调用)

通过这些方法,开发者可以在 Unity 中调用 Android 原生能力,同时让 Android 端灵活调用 Unity 的逻辑,实现高效的跨平台应用开发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/920726.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/920726.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前后端联合实现多个文件上传

1、前端 Vue3CommonApplyBasicInfoForm.vue<script setup lang"ts" name"CommonApplyBasicInfoForm"> ...... // 文件输入实例对象 const fileInputRef ref<HTMLInputElement | null>(null); // 选择文件列表 const selectedFiles ref<Fi…

软考高级--系统架构设计师--综合知识真题解析

系列文章目录 文章目录系列文章目录一、2019年真题二、2020年真题三、2021年真题四、2022年真题总结一、2019年真题 二、2020年真题 三、2021年真题 四、2022年真题 总结

“帕萨特B5钳盘式制动器结构设计三维PROE模型7张CAD图纸PDF图“

摘 要本文首先对汽车制动器原理和对各种各样的制动器进行分析,详细地阐述了各类制动器的结构,工作原理和优缺点。再根据轿车的车型和结构选择了适合的方案。根据市场上同系列车型的车大多数是滑钳盘式制动器,而且滑动钳式盘式制动器结构简单,性能居中,设计规范,所以我选择滑动…

SQL注入6----(其他注入手法)

一.前言 本章节来介绍一下其他的注入手法&#xff0c;也就是非常规注入手法&#xff0c;来和大家介绍一下 二.加密注入 前端提交的有些数据是加密之后&#xff0c;到了后台在解密&#xff0c;然后再进行数据库查询等相关操作的&#xff0c;那么既然如 此我们也应该将注入语句…

visual studio2022 配置 PCL 1.13.1

PCL库下载 下载链接&#xff1a; https://github.com/PointCloudLibrary/pcl/releases 下载这两个。 PCL库安装 运行.exe文件进行安装。 环境变量勾第二个&#xff08;其实无所谓&#xff0c;反正还要添加别的环境变量&#xff0c;这里没选之后加也一样&#xff09;。 安装…

金融学-货币理论

前言 前面学习了什么是货币供给&#xff0c;货币供给的决定以及联邦储备体系在货币供给中所起的作用。现在我们要开始探讨经济中货币供给在决定价格水平与全部商品和劳务(总供给)中的作用。关于货币对经济影响的研究&#xff0c;称为货币理论(monetarythe-ory) 货币数量论 古典…

Visio绘图——给多边形增加连接线

每次在画项目框图和各类爪图的时候&#xff0c;连接线是最烦人的&#xff0c;虽然选择的是折线&#xff0c;单往往事与愿违。 下面就记录一下&#xff0c;如何查找各类连接线。 1、先展开左侧菜单栏&#xff0c;点击如下所示的“&#xff1e;”2、在展开的界面&#xff0c;再次…

【开题答辩全过程】以 付费自习室系统小程序为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

开疆智能Profinet转EtherCAT网关连接TR-Electronic传感器配置案例

本案例是通过开疆智能研发的Profinet转EtherCAT网关将传感器数据传送到PLC&#xff0c;由于两边设备采用协议不同&#xff0c;故而使用网关进行转换。网关配置&#xff1a;打开网关配置软件“EtherCAT Manager”并新建项目。根据不通网关型号也可选择ModbusTCP&#xff0c;Ethe…

VSCode中使用Markdown

文章目录1. 背景2. 安装插件3. 基础写作与预览4. 生成PDF文档5. 插入代码6. 插入图片7. 小结1. 背景 编程技术人员&#xff0c;很多人写作习惯用Markdown格式吧。 首先Markdown很简单&#xff0c;第二它的层次结构特别清晰&#xff0c;再然后它对嵌入图片、代码的支持很优秀。…

2024全栈技术栈选型指南

前后端技术栈选择现代前后端技术栈选择需兼顾市场需求与个人兴趣。前端领域React、Vue、Angular形成三足鼎立&#xff0c;React在大型项目占比达58%&#xff0c;Vue在小中型企业更受欢迎。TypeScript采用率年增长25%&#xff0c;已成为工程化标配。后端技术呈现多元化趋势&…

Spring Boot 项目文件上传安全与优化:OSS、MinIO、Nginx 分片上传实战

在实际的 Web 项目中&#xff0c;文件上传是一个常见需求&#xff1a;用户上传头像、企业后台上传资料、视频平台上传大文件等等。然而&#xff0c;文件上传也是最容易引发安全风险的功能之一&#xff0c;比如恶意脚本上传、木马文件伪装、存储空间消耗攻击。同时&#xff0c;当…

智能安防:以AI重塑安全新边界

传统安防依赖人力监控与简单报警&#xff0c;效率低下且易遗漏风险。随着人工智能、物联网及大数据技术的融合&#xff0c;智能安防正重新定义安全管理的范式&#xff0c;从被动响应转向主动预警&#xff0c;成为智慧城市与数字化生活的重要基石。智能安防的核心是人工智能视觉…

【AI】【强化学习】强化学习算法总结、资料汇总、个人理解

前言&#xff1a;自己学习西湖大学赵老师的课、youtube系列的课程相关比较重要的内容&#xff0c;后续不断再进行完善。 YouTube Serrano.academy rlhf讲的很好 合集最后一个没看 强化学习第四章 police没一步需要无穷&#xff0c;值迭代只需要一步 收敛不一样 值迭代:原因在于…

一键掌控三线资源:极简 Shell 脚本实现 CPU·磁盘·内存可视化巡检

目录 前言 数值型 for 循环 语法格式 示例&#xff1a;打印 1 到 5 示例&#xff1a;打印5次Hello World 示例&#xff1a;计算 1 到 100 的累加和 遍历型 for 循环 语法格式 示例&#xff1a;遍历字符串列表 示例&#xff1a;遍历数组 示例&#xff1a;遍历文件列表…

数据结构:创建堆(或者叫“堆化”,Heapify)

目录 最直观的思路 更优化的思路&#xff08;自底向上的构建&#xff09; 第一步&#xff1a;重新审视问题 第二步&#xff1a;找到规律&#xff0c;形成策略 用一个实例来推演 第三步&#xff1a;编写代码 总结与分析 我们来深入探讨“创建堆”&#xff08;或者叫“堆化…

基于 GPT-OSS 的成人自考口语评测 API 开发全记录

1️⃣ 需求与指标 在项目启动前&#xff0c;我们设定了核心指标&#xff1a; 字错率&#xff08;WER&#xff09;< 5%响应延迟 < 800 ms高可用、可扩展 这些指标将贯穿整个开发和测试流程。 2️⃣ 数据准备 准备训练数据是关键步骤&#xff0c;我们使用了 1k 条自考口…

Linux初始——基础指令篇

Linux常用指令pwdlscdtouchmkdirrmmancpmvcatmorelesswhichwhereisaliasgrepfilezip/unzip 指令rzsztarpwd 在xshell中输入pwd并回车&#xff0c;将输出当前用户所存在的目录位置 可看到当前用户是在/home/hhw这个目录下 ls 在xshell中输入ls会显示当前目录所包含的文件 其中…

Vue-24-利用Vue3的element-plus库实现树形结构数据展示

文章目录 1 项目启动 1.1 创建和启动项目(vite+vue) 1.2 清理不需要的代码 1.3 下载必备的依赖(element-plus) 1.4 完整引入并注册(main.sj) 1.5 设置@别名(vite.config.js) 2 el-tree树形控件 2.1 TreeComponents.vue 2.1.1 模板部分 2.1.2 类型定义(Tree) 2.1.3 树形数据(dat…

Kubernetes 部署与发布完全指南:从 Pod 到高级发布策略

引言:告别手动,拥抱声明式 在传统的部署流程中,我们常常需要手动执行一系列命令:SSH 到服务器、拉取新代码、编译、重启服务、检查日志、处理错误…这个过程不仅繁琐低效,而且极易出错,难以保证环境的一致性。 Kubernetes 彻底改变了这一切。它通过一种 “声明式” 的模…