unity3d一键打包
本文主要内容:将三方SDK集成到时unity工程中,无需每次打包时都导一次android工程。
引言
接入三方SDK(无unity插件)步骤一般为:
- 将unity工程导出为android工程;
- 在安卓工程中,通过自定义Activity或launcherlication来接入三方SDK;
- 通过安卓工程打包apk;
以后每次打包,都需要先将unity项目导出为android工程,将assets
目录替换掉,再打apk包。其间,工程文件多次转手,麻烦且容易出错。
umeng, google, facebook... 他们的SDK都有对应的插件,无需导出安卓包即可使用,他们是如何实现的?本文以下内容将实现该方案。
一. 新建一个空的unity工程,并使用它导出一个安卓项目
File->Build Settings->切换到Android平台
export_android
二. 使用Android Studio打开导出的工程,待工程加载完成后,新建一个Android Library
主工程名字为
launcher
, Android Library名字为unityLibrary
,具体名字根据项目而定。
-
File->New->New Module->选择Android Library->Package Name与安卓工程的包名一致;
-
将导出的
UnityPlayerActivity.java
直接移动到新建的Library下; -
在
launcher
工程的build.gradle
中引入unityLibrary
:dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation project(':unity-android-resources') implementation project(path: ':unityLibrary') // 引入库unityLibrary }
-
在
unityLibrary
的build.gradle
中引入unity-classes.jar:// 添加jar目录 repositories { flatDir { dirs '../launcher/libs' } } // 编译成arr文件时,不将BuildConfig.class一起打包 afterEvaluate { generateReleaseBuildConfig.enabled = false generateDebugBuildConfig.enabled = false } dependencies { // 添加unity-classes.jar // compileOnly表示只是在编译时引入,在实际发布时,不会将该jar包打包进去 compileOnly files('../launcher/libs/unity-classes.jar') }
-
完成以下内容后,编译aar文件:
生成aar文件
三. 将生成的文件导入unity项目
-
将生成的
.arr
文件复制到时unity中Plugins/Android/libs
目录中 -
将
AndroidManifest.xml
复制到时Plugins/Android
目录中;
四. 直接在unity中打包apk
build apk包五. 编辑器扩展
这个网上教程很多,就不展开讲了
五. 扩展内容
- AndroidX的支持:
勾选后,会生成Plugins/Android/mainTemplate.gradle文件,向里面加入以下内容:
([rootProject] + (rootProject.subprojects as List)).each {
ext {
it.setProperty("android.useAndroidX", true)
it.setProperty("android.enableJetifier", true)
}
}
// 或者直接在properties添加以下内容
// android.useAndroidX=true
// android.enableJetifier=true
-
资源合并优先级的问题:
如果
- 三方sdk的jar或aar中有配置文件;
- 配置文件中有默认值 ;
- 有默认值的字段需要在项目中重新赋值;
使用上面打包方式时,自己定义的值并不会生效,因为自己的定义的内容会导出到
unity-android-resources
中,它的优先级比jar或aar低,要想生效,需要将自己的配置文件移动到到时主工程目录下:// Editor/CustomGenerateGradleAndroid.cs using UnityEditor.Android; using UnityEditor.Build; using System.IO; public class CustomGenerateGradleAndroid : IPostGenerateGradleAndroidProject { int IOrderedCallback.callbackOrder => int.MaxValue; void IPostGenerateGradleAndroidProject.OnPostGenerateGradleAndroidProject(string path) { #if UNITY_ANDROID string path_src_main_res = Path.Combine(path, "src/main/res/values"); string path_unity_android_resources = Path.Combine(path, "unity-android-resources/res/values"); if(!Directory.Exists(path_src_main_res)) { throw new System.Exception("path not exists: " + path_src_main_res); } if(Directory.Exists(path_unity_android_resources)) { string[] string_files = Directory.GetFiles(path_unity_android_resources, "strings-*.xml"); foreach(string name in string_files) { string file_name = Path.GetFileName(name); File.Move(name, Path.Combine(path_src_main_res, file_name)); } } #endif } }
参考资料
https://zhuanlan.zhihu.com/p/83162670
https://blog.csdn.net/shanshan_blog/article/details/53584155
网友评论