Android中加载unity aar包实现方案
一、加载unity包
1.将准备好的unity包放到libs文件夹中
app :-libs-unityLibrary-release.aar //放到这里-src-main
2.在build.gradle.kts(app:)中加载
...android{...sourceSets["main"].jniLibs.srcDir("libs")
}dependencies{...implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("unityLibrary-release.aar"))))...
}
二、在activity中加载unity
package com.base.exampleimport android.os.Bundle
import android.widget.Toast
import com.unity3d.player.UnityPlayer
import com.unity3d.player.UnityPlayerActivityclass MainActivity : UnityPlayerActivity() {companion object {var currentActivity : MainActivity? = null}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)if (mUnityPlayer == null) {mUnityPlayer = UnityPlayer(this)UnityPlayer.currentActivity = thiscurrentActivity = this}// 请求焦点以确保Unity能够接收输入mUnityPlayer?.requestFocus()// 确保Unity知道窗口获得焦点mUnityPlayer?.windowFocusChanged(true)/*** @param 调用unity 的onRewarded方法* 第一个参数 是和unity开发沟通确定的命名* 第二个参数 要调用的方法名* 第三个参数 传递给unity的方法参数*/UnityPlayer.UnitySendMessage("Android", "onRewarded", "")}fun showAd() {Toast.makeText(this, "被unity触发的方法", Toast.LENGTH_SHORT).show()}override fun onStart() {super.onStart()mUnityPlayer?.windowFocusChanged(true)}// 活动暂停时的回调override fun onPause() {super.onPause()mUnityPlayer?.pause()}// 活动恢复时的回调override fun onResume() {super.onResume()mUnityPlayer?.resume()}// 活动停止时的回调override fun onStop() {super.onStop()mUnityPlayer?.windowFocusChanged(false)}// 活动销毁时的回调override fun onDestroy() {super.onDestroy()
// mUnityPlayer?.quit() // 退出 UnityPlayermUnityPlayer = null // 释放 UnityPlayer 实例}}
在AndroidManifest.xml中,建议添加configChanges配置
<activity android:name=".MainActivity"android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density"android:exported="false"android:hardwareAccelerated="true"android:launchMode="singleTask"android:resizeableActivity="false"android:screenOrientation="portrait" />
注意事项:
1. unity那边需要知道androdi端加载unity的activity的路径,如:上面示例中的应该是:com.base.example.MainActivity
2.必须暴露currentActivity 给外部,这样unity才能通过currentActivity调用安卓方法
3.生命周期必须做同步