这是一篇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 & Android Studio 联合开发快速入门)
-
- [一、Unity 环境配置](#一、Unity 环境配置)
-
- [1. 开发模块](#1. 开发模块)
- [2. 开发平台](#2. 开发平台)
- [3. 环境配置](#3. 环境配置)
- [二、Visual Studio 配置](#二、Visual Studio 配置)
- [三、Unity 调用 AS 导出的 aar](#三、Unity 调用 AS 导出的 aar)
-
- [1. AS 导出 aar](#1. AS 导出 aar)
- [2. Unity 导入 aar](#2. Unity 导入 aar)
- [3. 编写脚本与绑定](#3. 编写脚本与绑定)
- [4. 调试与运行](#4. 调试与运行)
- [5. 运行结果](#5. 运行结果)
- [四、AS 调用 Unity 导出的工程](#四、AS 调用 Unity 导出的工程)
-
- [1. 示例脚本](#1. 示例脚本)
- [2. 导出 Android 工程](#2. 导出 Android 工程)
- [3. 调用方式](#3. 调用方式)
- [4. 常见问题](#4. 常见问题)
- [五、Unity 与 AS 互相调用](#五、Unity 与 AS 互相调用)
-
- [1. Unity 调用 AS](#1. Unity 调用 AS)
-
- [方式1:继承 UnityPlayerActivity](#方式1:继承 UnityPlayerActivity)
- 方式2:调用静态方法
- [方式3:调用非静态方法 / 单例模式](#方式3:调用非静态方法 / 单例模式)
- [2.AS 调用 Unity](#2.AS 调用 Unity)
-
- 方式1:UnitySendMessage
- [方式2:使用 AndroidJavaProxy 实现回调通信](#方式2:使用 AndroidJavaProxy 实现回调通信)
- [3. Unity 调用 Android Toast 示例](#3. Unity 调用 Android Toast 示例)
-
- [Unity 直接调用 Android API](#Unity 直接调用 Android API)
- [Unity 调用 AS 中的 Toast](#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
- 打开 Visual Studio Installer。
- 选择安装或修改现有版本。
- 在 工作负载 中勾选 使用 Unity 的游戏开发 。
检查更新
帮助 → 检查更新
,保持 VS 最新,确保 bug 修复与 Unity 支持。
配置 Unity 使用 VS
- Unity →
Edit > Preferences > External Tools
。 - 在 External Script Editor 中选择 VS。
- 如未列出,可手动选择
devenv.exe
。 - 勾选 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代码:
c#
AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity");
jo.Call ("login","这里是传过去的参数");
Android代码:
java
package com.example.test;
public class MainActivity extends UnityPlayerActivity {
public void login( String str )
{
}
方式2:调用静态方法
Unity 端:
csharp
AndroidJavaClass jc = new AndroidJavaClass("com.example.test.Test");
jc.CallStatic("login", "参数");
Android 端:
java
public class Test {
public static void login(String str) { ... }
}
方式3:调用非静态方法 / 单例模式
Unity 通过 AndroidJavaObject
调用实例方法,或先调用静态方法获取单例,再调用非静态方法。
unity代码:
c#
AndroidJavaObject jo = new AndroidJavaObject("com.example.test.Test");
jo.Call("login","");
Android代码:
java
package com.example.test;
public class Test{
public void login( String str ) {
}
2.AS 调用 Unity
把消息发送给Unity场景中指定物体上的指定方法
UnityPlayer.UnitySendMessage("物体名称", "方法名称", 参数);
实例:
方式1:UnitySendMessage
java
UnityPlayer.UnitySendMessage("GameObjectName", "MethodName", "参数");
方式2:使用 AndroidJavaProxy 实现回调通信
与 UnitySendMessage
通过字符串传递消息不同,AndroidJavaProxy
提供了一种更稳定、更结构化的通信方式。它允许 Unity 实现 Android 端定义的接口,并将接口实现作为回调传递给 AS,从而实现双向通信,适合复杂场景。
步骤如下:
1. 在 AS 端定义接口
先在 Android 工程中编写一个接口,接口方法将作为回调被 Unity 实现。
java
package com.example.test;
public interface UnityasrEventCallback {
void Speechcontent(int a);
void Test1(String msg);
}
2. 在 Unity 端实现该接口
在 Unity 中创建一个 C# 脚本,定义一个类继承 AndroidJavaProxy
,并在构造方法中指定 AS 端接口的"包名+接口名"。然后实现接口中定义的方法。
csharp
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
)。
csharp
void Start()
{
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
// 创建代理实例
AsrEventCallback asrEventCallback = new AsrEventCallback();
// 将代理传递给 AS
jo.Call("setCallback", asrEventCallback);
}
这样,AS 端只要调用 mCallback.Test1("xxx")
或 mCallback.Speechcontent(123)
,就能触发 Unity 端的对应方法,实现回调通信。
3. Unity 调用 Android Toast 示例
Unity 直接调用 Android API
csharp
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 调用:
csharp
jo.Call("testToast", "吐司!");
AS 端:
java
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 的逻辑,实现高效的跨平台应用开发。