Unity & Android Studio 联合开发快速入门:环境配置、AAR 集成与双向调用教程
【Unity笔记】Unity & Android Studio 联合开发快速入门:环境配置、AAR 集成与双向调用教程
引言
Unity 与 Android Studio 的联合开发是移动应用混合开发的常见模式,允许 Unity 处理 3D/AR/VR 渲染,而 Android Studio 管理原生 UI、传感器和系统集成(如权限、通知)。通过 AAR(Android Archive)格式的插件集成,Unity 可以嵌入 Android App 中,实现无缝切换(如按钮点击打开 Unity 场景)。双向调用(Unity → Android 和 Android → Unity)通过 AndroidJavaObject 和 UnitySendMessage 实现,支持数据传递(如传递位置数据到 Unity 角色)。
本教程基于 Unity 2022.3 LTS+(兼容 Unity 6)和 Android Studio 2025.1(Android SDK 35+),聚焦 Android 平台(iOS 类似,使用 Framework)。预计入门时间:2-4 小时。核心流程:环境配置 → Unity 导出 AAR → Android Studio 集成 → 双向通信测试。适用于 AR 产品展示、游戏内购集成等场景。时间复杂度 O(1),性能开销低(AAR 加载 ~100ms)。
前提:
- Unity Hub 安装 Unity 2022.3+(带 Android Build Support)。
- Android Studio 2025.1+(带 SDK/NDK)。
- 设备:Android 8.0+ 真机(模拟器不支持 Unity 渲染)。
环境配置
1. Unity 环境准备
- 安装 Android 模块:
- Unity Hub > Installs > Add Modules > Android Build Support、Android SDK & NDK Tools、OpenJDK。
- 项目设置:
- 新建 3D 项目(或导入现有)。
- Edit > Project Settings > Player > Android:
- Company Name/Package Name: com.yourcompany.yourapp。
- Minimum API Level: 26+;Target API Level: Automatic(35)。
- Scripting Backend: IL2CPP(性能);Architecture: ARM64。
- Build Settings > Player Settings > Publishing Settings > 创建 Keystore(用于签名)。
- 测试 Unity APK:
- Build Settings > Android > Build and Run(连接设备测试基本场景)。
2. Android Studio 环境准备
- 安装:
- 下载 Android Studio 2025.1(https://developer.android.com/studio)。
- 安装 SDK(API 35+)、NDK(25+)。
- 新项目:
- Create New Project > Empty Activity。
- minSdkVersion = 26;compileSdk = 35。
- 依赖配置(build.gradle (Module: app)):
dependencies {
implementation 'androidx.appcompat:appcompat:1.7.0'
// Unity 相关(后续添加)
}
AAR 集成:Unity 导出为 Android 库
3. Unity 导出 AAR 插件
Unity 支持 “Unity as a Library”(自 2019.4+),导出为 AAR 文件,便于 Android Studio 集成。
- Unity 项目准备:
- 创建简单场景:Cube + 旋转脚本(测试用)。
- 添加 AndroidJavaClass 桥接(后续双向调用)。
- 导出步骤:
- Build Settings > Android > Export Project(生成 Gradle 项目)。
- 打开生成的 Android 项目文件夹(Unity 导出到 build/gradle/)。
- 在 Android Studio 中导入:Open an existing Android Studio project > 选择导出文件夹。
- 修改 build.gradle (unityLibrary 模块):
gradle android { compileSdk 35 defaultConfig { minSdk 26 targetSdk 35 } }
- 构建 AAR:Build > Make Project(生成 unityLibrary-debug.aar,在 app/build/outputs/aar/)。
- Unity 侧桥接代码(AndroidJavaProxy,用于 Android 调用 Unity):
using UnityEngine;
public class AndroidBridge : AndroidJavaProxy
{
public AndroidBridge() : base("com.yourcompany.unitybridge.UnityBridge") { }
public void OnMessageFromAndroid(string message)
{
Debug.Log("Android 发送消息: " + message);
// 处理消息,如旋转 Cube
}
}
// 在 Unity 脚本中注册
public class UnityBridgeRegistrar : MonoBehaviour
{
void Start()
{
AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
activity.Call("registerUnityBridge", new AndroidBridge());
}
}
4. Android Studio 集成 AAR
- 导入 AAR:
- 在 app/libs/ 复制 unityLibrary-debug.aar。
- build.gradle (app):
gradle dependencies { implementation(name: 'unityLibrary-debug', ext: 'aar') }
- settings.gradle:
gradle include ':unityLibrary-debug'
- AndroidManifest.xml 集成:
- 合并 Unity 的 Manifest(复制权限、Activity):
xml <activity android:name="com.unity3d.player.UnityPlayerActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
- 启动 Unity:
- MainActivity.java(或 Kotlin):
import com.unity3d.player.UnityPlayerActivity; import android.content.Intent; public class MainActivity extends UnityPlayerActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Unity 场景加载 Intent intent = new Intent(this, UnityPlayerActivity.class); startActivity(intent); } }
- 构建 APK:Build > Make APK,安装测试。
双向调用:Unity ↔ Android 通信
5. Android → Unity 调用(UnitySendMessage)
Android 通过 UnitySendMessage 调用 Unity MonoBehaviour 方法。
- Unity 侧接收:
public class UnityReceiver : MonoBehaviour
{
public void OnAndroidMessage(string message)
{
Debug.Log("从 Android 接收: " + message);
// 示例:改变 Cube 颜色
GetComponent<Renderer>().material.color = Color.red;
}
}
- Android 侧发送:
// 在 MainActivity 或 Fragment 中
UnityPlayer.UnitySendMessage("GameObjectName", "OnAndroidMessage", "Hello from Android!");
6. Unity → Android 调用(AndroidJavaObject)
Unity 通过 AndroidJavaObject 调用 Java 方法。
- Android 侧准备:
// UnityBridge.java
public class UnityBridge {
public static void showToast(String message) {
Toast.makeText(UnityPlayer.currentActivity, message, Toast.LENGTH_SHORT).show();
}
public static String getDeviceInfo() {
return "Android " + Build.VERSION.RELEASE;
}
}
- Unity 侧调用:
public class AndroidCaller : MonoBehaviour
{
void Start()
{
AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaObject context = activity.Call<AndroidJavaObject>("getApplicationContext");
// 调用静态方法
AndroidJavaClass bridgeClass = new AndroidJavaClass("com.yourcompany.UnityBridge");
bridgeClass.CallStatic("showToast", "Hello from Unity!");
// 获取返回值
string deviceInfo = bridgeClass.CallStatic<string>("getDeviceInfo");
Debug.Log("设备信息: " + deviceInfo);
}
}
测试与调试
- 构建测试:
- Unity: Build Settings > Android > Build and Run(连接设备)。
- Android Studio: Run > Run ‘app’(部署 APK)。
- 调试:
- Unity: Console 窗口查看日志。
- Android: Logcat(Android Studio > View > Tool Windows > Logcat),过滤 “Unity”。
- 常见问题:
- AAR 加载失败:检查 build.gradle 依赖路径;确保 minSdk 匹配。
- 通信异常:GameObject 名/方法名错误;使用 AndroidJavaException 捕获。
- 权限:添加 。
最佳实践
- 模块化:Unity 负责 3D 核心,Android 处理原生 UI/服务。
- 数据序列化:JSON 传递复杂数据。
- 性能:AAR 加载后缓存 AndroidJavaObject 引用。
- 扩展:集成 Firebase/AdMob 等原生 SDK。
此教程提供完整入门框架。如果需要 iOS 版本或特定功能扩展,请提供更多细节!