美文网首页
unity3d一键打包

unity3d一键打包

作者: 杨sy | 来源:发表于2020-08-20 21:16 被阅读0次

    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一键打包

          本文链接:https://www.haomeiwen.com/subject/fygejktx.html