【Unity&AS】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 & Android Studio 联合开发快速入门)
    • [一、Unity 环境配置](#一、Unity 环境配置)
      • [1. 开发模块](#1. 开发模块)
      • [2. 开发平台](#2. 开发平台)
      • [3. 环境配置](#3. 环境配置)
    • [二、Visual Studio 配置](#二、Visual Studio 配置)
      • [方式1:Unity Hub 中勾选](#方式1:Unity Hub 中勾选)
      • [方式2:手动配置 Visual Studio](#方式2:手动配置 Visual Studio)
        • 先决条件
        • [安装 Visual Studio Tools for Unity](#安装 Visual Studio Tools for Unity)
        • 检查更新
        • [配置 Unity 使用 VS](#配置 Unity 使用 VS)
    • [三、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
  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代码:

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 的逻辑,实现高效的跨平台应用开发。

相关推荐
世洋Blog9 小时前
更好的利用ChatGPT进行项目的开发
人工智能·unity·chatgpt
evolution_language18 小时前
Unity场景(Scene)的注意事项和易错点
unity·游戏引擎·scene
EQ-雪梨蛋花汤21 小时前
【AI工具】使用 Doubao-Seed-Code 优化 Unity 编辑器插件:从功能实现到界面美化的完整实践
人工智能·unity·编辑器
Ryan ZHENG1 天前
[Android][踩坑]Android Studio导入core-libart.jar
android·android studio·jar
g***B7381 天前
元宇宙游戏引擎
游戏引擎
BoomHe1 天前
车载应用配置系统签名
android·android studio
Dr.勿忘1 天前
开源Unity小框架:高效单例与模块化设计
游戏·unity·开源·c#·游戏引擎·游戏程序·gamejam
路人甲ing..1 天前
用 Android Studio 自带的模拟 Android Emulator 调试
android·java·ide·ubuntu·kotlin·android studio
路人甲ing..1 天前
Android Studio 模拟器报错 The emulator process for AVD xxxxx has terminated.
android·java·ide·kotlin·android studio
bqliang2 天前
从喝水到学会 Android ASM 插桩
android·kotlin·android studio