unity3d一键打包

unity3d一键打包

本文主要内容:将三方SDK集成到时unity工程中,无需每次打包时都导一次android工程。

引言

接入三方SDK(无unity插件)步骤一般为:

  1. 将unity工程导出为android工程;
  2. 在安卓工程中,通过自定义Activity或launcherlication来接入三方SDK;
  3. 通过安卓工程打包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
    }
    
  • unityLibrarybuild.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的支持:
自定义gradle模板

勾选后,会生成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

你可能感兴趣的:(unity3d一键打包)