Unity自动打包工具_unity混淆工具obfuscar-程序员宅基地

技术标签: unity  Unity  Unity开发  工具  游戏  ios  打包  wp8  

    最开始有写打包工具的想法,是因为看到《啪啪三国》王伟峰分享的一张图,他们有一个专门的“工具程序员”开发各种工具。(ps:说起来这个王伟峰和他的创始团队成员,以前跟我是同一个公司的,公司名字就不透露了,只是当时在不同的部门,相互不认识)。正好我们项目也到了后期,该准备接入渠道了。于是,我就着手写我们的打包工具。约定一下,下文中,平台是指操作系统平台,比如iOS、Android、WP8、Metro;渠道是指发布渠道,比如App Store、WP8商店、360、91、小米等。

                           

                                                         上海火溶网络CEO王伟峰分享的《啪啪三国》打包工具

  过程

    从过程上,主要分为以下几步:

    1. 资源准备;

    2. 由Unity生成工程;

    3. 生成安装包;

    4. 资源恢复。

    具体到平台和渠道,会有一些细微差异,下面具体说。

  WP8打包

    这个是第一个写的,因为不涉及渠道,相对来说最简单。从下午4点,写到晚上9点多,时间大部分花在处理一些细节上。

    第一步,资源相关的准备。我们是做了动态更新的,所以生成工程之前,要先从Unity里删去更新的资源,这样打出的包更小。ps:其实这一步之前,我们会先打更新包,关于资源打包与更新,我另写一篇文章介绍。另外,跟各个平台交互,我们写了插件,比如,内嵌web功能,Unity是没有的,要调用系统的api来做。就是这么一个再普通不过的插件,让我花了大量时间处理,因为Unity常常load别的平台目录下的插件。比如,我有一个插件Platform.dll,按照Unity的官方文档,应该放到“Plugins/平台/”目录下,生成WP8工程的时候,Unity应该选择Plugins/WP8/Platform.dll加载;打android包的时候,应该加载Plugins/Android/Platform.dll。但是遗憾的是,Unity不是这样,我打WP8的时候,它常常去加载Android目录下的插件。这个问题的原因,我一直没有查到,希望了解的朋友不吝赐教。为了解决这个问题,我就在打包的时候,把非当前平台目录下的插件删除,打好包之后,再恢复。另外,还要删除上一次打包生成的文件。

    第二步,生成工程。这个没什么好说的,就是Unity的API调用,比如,BuildPipeline.BuildPlayer(BuildScenes, BuildPath, BuildTarget.WP8Player, BuildOptions.None);

    第三步,生成安装包。在生成包之前,要替换一些Unity生成的文件,比如,MainPage.xaml/.cs,因为我们为了操作内嵌web,做了WP8特性的ApplicationBar;我们配置好的WMAppManifest.xml,友盟统计要求初始化必须在App.xaml.cs中,WP8工程Assets/目录下的Icon等。然后,根据需要修改工程文件,比如,我们做了WP8的ApplicationBar,需要在打包工具里把相关的资源索引添加到工程文件中。然后,就可以调用cmd来生成apk安装包了。cmd主要是调用vs的命令,生成apk,调用vs安装目录下的devenv.exe,配置一下devenv.exe的参数就可以了。这里有一个需要注意的地方是,Build选项要选择Master,而不是Release,Release版本有"profiler support",Master才是发布用的。

    第四步,资源恢复。包已经打好了,为了接下来打别的平台或渠道的包,恢复资源。比如,恢复更新的资源、各平台插件等。

  Android打包

    Android打包麻烦一些,不是因为渠道多,而是因为有的渠道有一些特殊需求。过程类似,下面主要说不同的地方。

    第一步,资源相关的准备。跟WP8打包不同的是,Android是多渠道,要处理各个渠道的资源。我最开始把所有渠道sdk相关的资源和代码,都放到Unity的Plugins/目录下面,比如Plugins/Android360、Plugins/Android91、Plugins/AndroidXiaoMi等,每次打包的时候,资源准备阶段先删除所有非当前渠道相关的内容,然后把当前渠道的目录名修改为Plugins/Android,打完包再删除Plugins/Android,然后调用svn update更新所有删除的内容。写完之后,打一个包,ok。当时接了11个渠道,然后我点了一下“Build All”,Build过程很慢,因为有大量的散文件,svn update要几分钟,Unity import进来这些资源也要一些时间。而且,当打到第四、第五个包的时候,Unity import资源的时候,常常会报错,可能是因为磁盘上的文件与Unity的缓存文件之间同步的时候异常。这样打包太慢了,也无法做到一键打几十个包。后来,我想到把所有渠道文件放到Unity Assets目录外,这样,需要哪个sdk就copy进来哪个,打完包delete就可以了,不用svn update,也不需要Unity每次import大量的散文件。打包效率提高了几倍,而且,一键出十几个包,也没有遇到过Unity报错。

    第二步,生成工程。这个地方,我是走了一些弯路的。

    最开始,我没有生成Android工程,而是直接Build出来apk,这样的好处是快。根据测试,3分钟多可以生成一个,而生成工程之后再Build出apk,时间翻了一倍。但是,各个渠道的sdk的特殊性,造成这种方式后来出几次问题。

    第一次,接sdk的同学说,有的渠道要求独立的icon或splash,我想这个简单,用aapt直接操作生成apk,修改里面的内容,然后重新签名就可以了,非常快,又方便。

    第二次,接百度多酷的同学说,用打包工具生成的apk,充值支付的时候,如果选择银联支付,会crash。而先Build出工程,然后用Eclipse编工程生成的apk没问题。我仔细对比了两个apk,发现直接生成的apk里,比工程生成的apk里,res/drawable/目录下少了几个文件,data.bin/data_high.bin/data_low.bin/mobilepayplugin.bin,我怀疑是Unity直接生成apk的时候,过滤掉了这些文件,而生成工程的时候没有过滤。什么原因?这个也好解决,找到缺少的文件,用aapt加进去。后来,当乐、Oppo都需要在打包工具里加入同样的几个bin文件。

    这样解决,不是好方法,但是解决了问题。但是,后来Oppo的同学反馈说,我们的包打开的Oppo登录界面是全屏的,而实际应该是弹出窗口样式。这说明,打包的时候,可能有些界面布局文件,没有打进去。但是,这次,我没法通过对比两种方式生成的apk,找缺少哪个文件了,因为所有的资源文件,都打到resources.arsc里面了。这时,我觉得这种出现问题解决问题的思路是不对的,应该从根本上拒绝出问题。然后,我重新写了Android打包工具,先生成工程,然后用Ant Build出apk。如果哪个渠道有特殊需求,在build apk之前操作工程,比如替换icon、splash。当然,这样做打包过程变成了,慢了一半。

    第三步,生成安装包。这个没什么好说的,就是Ant、sign、zipalign等。另外,我们的运营有一个特殊的需求,他们投放渠道,分两种方式:一种是接渠道sdk,另外一种是只购买流量,不接sdk。针对第二种方式,我打包的时候,只打一个包,然后,为了统计区分投放的渠道,对于生成的这个包,复制一份然后修改包里的配置文件,就可以了,不需要重复生成多次包。这样,十几秒就可以出一个包。我打包工具里的“SPP渠道包”这个按钮,就是是单独生成这种渠道包的。

    第四步,资源恢复。因为WP8就一个渠道,所以打完WP8包,就要直接恢复所有资源。而Android渠道众多,为了更快,有些资源是不需要恢复的,比如我们更新的内容。只需要打完所有Android包之后,恢复一次就可以了。

  iOS打包

    写完WP8和Android打包工具后,我不想再做重复的工作了,就写了一份详细的文档,然后交给一个小伙伴,让他参考WP8和Android的代码,写iOS的打包工具,也是想让他锻炼、学习一下。结果,悲剧无比!!!因为代码是很类似的,而且我给他详细讲了怎么做,iOS也只有3个渠道,他需要写的代码不超过50行,shell脚本估计在30行以内。这个我本来预估1-2天,最多3天可以做完的工作,他要了一周。而最后,他做了一月有余%>_<%

    后来,发现有一个第三方工具,XUPorter,可以方便的编辑framework、plist甚至obj-c代码,有了它再配合写点shell脚本,iOS打包很简单。

  其它

    我最开始写工具的时候,打包操作入口用的是[MenuItem(...)],操作按钮在Unity左上的菜单栏,做出来的打包工具操作界面是这样的:

                     

    我不知道大家有没有发现有什么问题。问题就是:每次加渠道,我都要在代码里添加菜单项,比如,今天添加91渠道,在代码里添加:

    [MenuItem("Build/Build Android Player/91")]
    static void BuildAndroid91Player() {
         // do something ...
    }

    明天添加了360渠道:

    [MenuItem("Build/Build Android Player/360")]
    static void BuildAndroid360Player() {
         // do something ...
    }

    如果有几十个,甚至一两百个渠道怎么办?每次都修改代码?NO!ps:我们公司有一款产品真的接了一百多个渠道。

    但是,在函数之外,如何读配置对C#的属性[MenuItem(...)]做赋值处理?我还抱着一点侥幸查了一些资料,这是根本不可能的。后来,我想起来之前看到的王伟峰分享那张图:

                                    

    这张图虽然很模糊,但是仔细看看,看出来他们的打包工具操作入口,不是在Unity 顶部的菜单栏,而是在Inspector中。了解了在哪里写,实现就很简单了,建一个Prefab就可以了。这样,以后新添加渠道,接入的同学只需要按照我规定的格式,在配置文件里加一行渠道信息就可以了。修改后打包工具操作界面:

        

                                        我们的打包工具操作入口

    Refresh按钮是修改渠道配置文件之后,重新读取配置文件。

    Build Patch下面的几个按钮是打各平台的更新包,动态更新用的AssetBundle。

    Build Player下面按钮式打各平台、各渠道的安装包。可以一键出某个包,或者一键出某平台的所有包。这里我没有做一键出所有平台的包,因为我们没有这个需求。如果要做,出完一个平台的包之后,切换一下平台就可以了(EditorUserBuildSettings.SwitchActiveBuildTarget(xxx)。但是,注意不要Switch之后立即打新平台的包,而应该在回调接口里做,activeBuildTargetChanged


    Unity相关文章:Unity优化总结Unity3D图形性能优化Unity自动打包工具——Mac上打包android

    转载请注明出处: http://blog.csdn.net/ynnmnm/article/details/36774715。作者:夜风。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ynnmnm/article/details/36774715

智能推荐

oracle 12c 集群安装后的检查_12c查看crs状态-程序员宅基地

文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态

解决jupyter notebook无法找到虚拟环境的问题_jupyter没有pytorch环境-程序员宅基地

文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境

国内安装scoop的保姆教程_scoop-cn-程序员宅基地

文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn

Element ui colorpicker在Vue中的使用_vue el-color-picker-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker

迅为iTOP-4412精英版之烧写内核移植后的镜像_exynos 4412 刷机-程序员宅基地

文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机

Linux系统配置jdk_linux配置jdk-程序员宅基地

文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk

随便推点

matlab(4):特殊符号的输入_matlab微米怎么输入-程序员宅基地

文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入

C语言程序设计-文件(打开与关闭、顺序、二进制读写)-程序员宅基地

文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。‍ Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。

Touchdesigner自学笔记之三_touchdesigner怎么让一个模型跟着鼠标移动-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动

【附源码】基于java的校园停车场管理系统的设计与实现61m0e9计算机毕设SSM_基于java技术的停车场管理系统实现与设计-程序员宅基地

文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计

Android系统播放器MediaPlayer源码分析_android多媒体播放源码分析 时序图-程序员宅基地

文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;amp;gt;Jni-&amp;amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图

java 数据结构与算法 ——快速排序法-程序员宅基地

文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法