Android中加载unity aar包实现方案

一、加载unity包

1.将准备好的unity包放到libs文件夹中

Kotlin 复制代码
app :
    -libs
        -unityLibrary-release.aar  //放到这里
    -src
        -main

2.在build.gradle.kts(app:)中加载

Kotlin 复制代码
...

android{
     ...
     sourceSets["main"].jniLibs.srcDir("libs")
}

dependencies{
    ...
     implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("unityLibrary-release.aar"))))
    ...
}
二、在activity中加载unity
Kotlin 复制代码
package com.base.example

import android.os.Bundle
import android.widget.Toast
import com.unity3d.player.UnityPlayer
import com.unity3d.player.UnityPlayerActivity

class MainActivity : UnityPlayerActivity() {
    companion object {
        var currentActivity : MainActivity? = null
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        if (mUnityPlayer == null) {
            mUnityPlayer = UnityPlayer(this)
            UnityPlayer.currentActivity = this
            currentActivity = 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() // 退出 UnityPlayer
        mUnityPlayer = null // 释放 UnityPlayer 实例
    }

}

在AndroidManifest.xml中,建议添加configChanges配置

Kotlin 复制代码
        <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.生命周期必须做同步

复制代码
相关推荐
三少爷的鞋12 小时前
AI 时代,我们都将成为通才型开发者:只懂 Android,已经不够了
android
Dovis(誓平步青云)16 小时前
家里设备越来越多,如何用一张空间地图控制灯光和温度![
android·java·前端·javascript·人工智能·电脑
晚风叙码17 小时前
MySQL 数据类型详解:从数值到字符串,一篇讲透
android·mysql·adb
传奇开心果编程18 小时前
【Compose Multiplatform 跨端开发学与练】第3课 布局与组件
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程21 小时前
【Compose Multiplatform 跨端开发学与练】第8课 资源管理与主题
android·windows·学习·ios·kotlin·web·composer
传奇开心果编程1 天前
【Compose Multiplatform 跨端开发学与练】第9课 测试与调试
android·学习·macos·ios·kotlin·web·composer
传奇开心果编程1 天前
【Compose Multiplatform 跨端开发学与练】第4课 导航与路由
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程1 天前
【Compose Multiplatform 跨端开发学与练】第6课 状态管理与架构
android·学习·ui·ios·架构·kotlin·composer
事圆则缓1 天前
Android AOSP 定制常见概念:源码目录、系统镜像与刷机流程
android
传奇开心果编程1 天前
【Compose Multiplatform 跨端开发学与练】第2课 Compose 基础语法
android·windows·学习·ui·ios·kotlin·composer