<2> unity3d 分包与上google play 之具体实战

Unity导出APK+OBB实战
本文介绍如何使用Unity导出包含OBB文件的APK,包括下载插件包、配置Google Play服务密钥、设置场景及导出参数等步骤。

上一篇已经把准备工作已经做好了。现在开始实战了。激动么么哒有没有!

第一步: 下载插件包 (这里收了1分,如果实在没有资源分的可以@我)http://download.youkuaiyun.com/detail/pdw_jsp/8612601

                   下载以后的内容如下图所示

                    

第二步:  设置插件中必须的内容

                    1:修改插件中一个名叫 GooglePlayDownloader.cs 的文件中的 dl_service.SetStatic("BASE64_PUBLIC_KEY", "这里面填写你应用的值");

                    具体进入你google的应用 然后如下图

                    

                      2:修改你的nextscene 为你自己的游戏场景。这里随便用了一个test1 随便创建了两个cube用于测试


     第三步:开始导出场景并生成 。apk + 。obb文件

                      1: 导出的必要设置,修改bundle id 为你的google应用的

                       

                           

                       2: 设置分包选项和keystore (keystore没有的自己去google生成一下,这个做过android的应该很清楚的)

                         


                         3:导出以后就会在你的导出目录存在两个文件了 一个**。apk + **.obb

                     

                         到此 实战结束了。下一篇将会进行测试,这也是我花了最长时间的地方,中国开发者太多坑要去解决了。痛!!!


                         欢迎拍砖

                          


你遇到的错误信息: ``` Interface &#39;interface P001GetUserInfoUseCase : JafNoInputUseCase<Flow<User>>&#39; does not have constructors. ``` 这并不是一个运行时错误,而是一个 **编译期提示或误用导致的问题**,通常出现在你试图 **像类一样去实例化一个接口(Interface)**,比如通过 `new` 关键字或者依赖注入配置不当。 --- ### 🔍 错误原因分析 在 Kotlin 中,**接口(Interface)不能有构造函数**,也不能被直接实例化。 你的代码中可能做了类似这样的事: ```kotlin val useCase = P001GetUserInfoUseCase() // ❌ 编译错误!接口不能 new ``` 或者在 DI 框架(如 Koin、Dagger/Hilt)中错误地尝试用接口类型去“创建”实例: ```kotlin // 错误示例(Koin) single<P001GetUserInfoUseCase> { P001GetUserInfoUseCase() } // ❌ 接口不能实例化 ``` --- ### ✅ 正确做法:使用实现类 你需要为这个接口提供一个 **实现类(Implementation Class)**,然后实例化的是实现类,而不是接口本身。 #### ✅ 1. 定义实现类 ```kotlin class P001GetUserInfoUseCaseImpl( private val userRepository: UserRepository ) : P001GetUserInfoUseCase { override suspend fun invoke(): Flow<User> { return userRepository.getUser() // 假设这是个挂起函数返回 Flow } } ``` > 注意命名习惯:`Impl` 后缀是常见做法,也可用其他方式(如 DDD 风格)。 #### ✅ 2. 在依赖注入中注册实现类 ##### 如果使用 **Koin**: ```kotlin single<P001GetUserInfoUseCase> { P001GetUserInfoUseCaseImpl(get()) } ``` ##### 如果使用 **Hilt / Dagger** ```kotlin @Provides fun providesGetUserInfoUseCase( userRepository: UserRepository ): P001GetUserInfoUseCase { return P001GetUserInfoUseCaseImpl(userRepository) } ``` 然后确保 `P001GetUserInfoUseCaseImpl` 被正确注入。 #### ✅ 3. 使用时面向接口编程 ```kotlin @Inject lateinit var getUserInfoUseCase: P001GetUserInfoUseCase // 使用 viewModelScope.launch { getUserInfoUseCase().collect { user -> // 处理用户数据 } } ``` --- ### 📝 补充说明:为什么这样设计? - **接口用于定义契约**(我能做什么) - **实现类负责具体逻辑** - **依赖倒置原则**:高层模块不依赖低层模块,都依赖抽象 这种模式在 Clean Architecture、UseCase(Interactor)模式中非常常见,例如: ```kotlin interface JafNoInputUseCase<out T> { suspend operator fun invoke(): T } interface P001GetUserInfoUseCase : JafNoInputUseCase<Flow<User>> ``` 它表示:“这个 UseCase 不需要输入参数,执行后会返回一个 `Flow<User>`”。 但你必须通过实现类来完成实际工作。 --- ### ❌ 常见错误写法对比 | 错误写法 | 问题 | |--------|------| | `P001GetUserInfoUseCase()` | 接口不能实例化 | | `object : P001GetUserInfoUseCase` 匿名对象却未注入 | 每次创建新实例,难以管理 | | 直接在 ViewModel 中 new 实现类 | 破坏依赖注入和可测试性 | --- ### ✅ 最佳实践建议 1. 所有 UseCase 都定义为接口,便于 Mock 和测试 2. 实现类以 `Impl` 结尾或按模块分包 3. 使用 DI 框架统一管理实例创建 4. 构造函数传入所需仓库(Repository) --- ###
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值