Unity 导出 AAR包 到 Android 项目并以 Fragment渲染显示
很多3D程序都是unity结合android项目开发的,比如车机,xr,数字孪生等。下面实现一个使用Unity开发3d渲染组件,并导入到现有Android项目中,通过fragment显示的例子
一、Unity 端:导出 AAR 包(核心文件)
▶ 第一步:改 Unity 导出设置
- 打开 Unity 项目,点击顶部菜单「File → Build Settings」。
- 在弹出的窗口里,左边平台列表选「Android」(如果没安装 Android 模块,先通过 Unity Hub 装一下)。
- 点击窗口右下角的「Player Settings」,在右侧面板改 3 个关键配置:
- Build Type:必须选「Android Library」(选这个才会导出 AAR,不是装手机的 APK)。
- Package Name:填个库名(比如「com. 你的名字.unitylib」,和后面 Android 项目包名像一点最好)。
- Minimum API Level:选和你 Android 项目一样的版本(比如 API 21,避免版本不兼容)。
▶ 第二步:导出 AAR 文件
- 回到「Build Settings」窗口,点击「Export」按钮,选个文件夹存(比如新建个叫「Unity_AAR」的文件夹)。
- 等 Unity 导出完成,打开刚才选的文件夹,里面会有个叫「unity-library.aar」的文件 —— 这就是我们要的核心包。
二、Android 端:把 AAR 放进自己的项目
▶ 第一步:复制 Unity 导出的文件
- 打开你的 Android 项目(用 Android Studio)。
- 把 Unity 导出的「unity-library.aar」复制到 Android 项目的「app → libs」文件夹里(没有 libs 文件夹就自己建一个)。
- 再把 Unity 导出文件夹里的「AndroidManifest.xml」复制到「app → src → main」文件夹。
- 如果 Unity 导出文件夹里有「libs」子文件夹,把里面的文件(比如「classes.jar」)也复制到 Android 项目的「app → libs」里。
▶ 第二步:改 Android 项目配置(让项目识别 AAR)
- 在 Android Studio 里,打开「app → build.gradle」文件(不是根目录的 build.gradle)。
- 在「android」标签里加一段配置(支持 Java 8,Unity 需要):
android {// 其他原有配置不变,加下面这段compileOptions {sourceCompatibility JavaVersion.VERSION\_1\_8targetCompatibility JavaVersion.VERSION\_1\_8}
}
- 在「dependencies」标签里加 AAR 的依赖:
dependencies {// 引入Unity的AAR包implementation files('libs/unity-library.aar')// 引入刚才复制的其他文件(比如classes.jar)implementation files('libs/classes.jar')// 加个基础依赖(避免报错)implementation 'androidx.appcompat:appcompat:1.6.1'
}
- 改完后,点击顶部的「Sync Now」同步配置(等进度条走完,别让它报错)。
▶ 第三步:处理清单文件冲突(避免报错)
- 打开刚才复制到「app → src → main」里的「AndroidManifest.xml」。
- 删掉里面的「」标签(因为你的 Android 项目已经有自己的 application 配置了,留着会冲突)。
- 保留里面的「权限声明」(比如
<uses-permission android:name="android.permission.INTERNET" />
)和「UnityPlayerActivity 声明」(比如<activity android:name="com.unity3d.player.UnityPlayerActivity" ... />
)—— 这些是 Unity 运行需要的。
三、用 Fragment 显示 Unity 画面(关键步骤)
▶ 第一步:写个 Unity 专属的 Fragment 类
- 在 Android 项目里新建一个 Kotlin 类,名字叫「UnityFragment」(随便起,好记就行)。
- 把下面的代码复制进去(代码里有注释,照着用就行):
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import com.unity3d.player.UnityPlayer
class UnityFragment : Fragment() {
// Unity的核心对象,用来显示画面
private lateinit var unityPlayer: UnityPlayer
// 创建Fragment的视图(把Unity画面放进来)override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?
): View? {// 初始化UnityPlayerunityPlayer = UnityPlayer(requireContext())// 把Unity的画面作为Fragment的视图返回return unityPlayer.view
}// 下面3个方法是生命周期同步,必须加!不然Unity会崩溃override fun onResume() {super.onResume()unityPlayer.resume() // Unity恢复运行}override fun onPause() {super.onPause()unityPlayer.pause() // Unity暂停运行}override fun onDestroy() {unityPlayer.quit() // Unity退出,释放内存(很重要,不然会内存泄漏)super.onDestroy()}
}
▶ 第二步:在 Activity 里加载这个 Fragment
- 打开你要显示 Unity 的 Activity 的布局文件(比如「activity_main.xml」),加一个容器(用来放 Fragment):
\<!-- 其他布局代码不变,加下面这段 -->
\<FrameLayout
android:id="@+id/unity\_container"
android:layout\_width="match\_parent"
android:layout\_height="300dp" /> \<!-- 高度可以自己调,比如match\_parent占满屏幕 -->
- 打开这个 Activity 的 Kotlin 代码(比如「MainActivity.kt」),在「onCreate」方法里加加载 Fragment 的代码:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity\_main)
// 加载UnityFragment到容器里
supportFragmentManager.beginTransaction().replace(R.id.unity\_container, UnityFragment()) // 容器ID和Fragment类对应.commit() // 执行加载
}
四、注意事项(别踩坑)
- 版本要兼容:Unity 的「Minimum API Level」和 Android 项目的「minSdkVersion」必须一样,不然会报错。
- 生命周期别漏:Fragment 里的「onResume」「onPause」「onDestroy」必须加,不然 Unity 画面会卡住或崩溃。
- 内存要释放:退出 Fragment 时,「unityPlayer.quit ()」一定要执行,不然手机内存会被占满。