最開始有写打包工具的想法,是由于看到《啪啪三国》王伟峰分享的一张图,他们有一个专门的“工具程序猿”开发各种工具。

(ps:说起来这个王伟峰和他的创始团队成员,曾经跟我是同一个公司的,公司名字就不透露了,仅仅是当时在不同的部门。相互不认识)。正好我们项目也到了后期,该准备接入渠道了。于是,我就着手写我们的打包工具。约定一下,下文中。平台是指操作系统平台,比方iOS、Android、WP8、Metro;渠道是指公布渠道。比方App
Store、WP8商店、360、91、小米等。

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

过程

从过程上。主要分为下面几步:

1. 资源准备。

2. 由Unity生成project;

3. 生成安装包;

4. 资源恢复。

详细到平台和渠道,会有一些细微差异,以下详细说。

WP8打包

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

第一步,资源相关的准备。我们是做了动态更新的,所以生成project之前。要先从Unity里删去更新的资源,这样打出的包更小。ps:事实上这一步之前,我们会先打更新包。关于资源打包与更新。我另写一篇文章介绍。另外,跟各个平台交互,我们写了插件,比方,内嵌web功能,Unity是没有的,要调用系统的api来做。

就是这么一个再普通只是的插件。让我花了大量时间处理。由于Unity经常load别的平台文件夹下的插件。比方,我有一个插件Platform.dll。依照Unity的官方文档。应该放到“Plugins/平台/”文件夹下,生成WP8project的时候,Unity应该选择Plugins/WP8/Platform.dll载入;打android包的时候,应该载入Plugins/Android/Platform.dll。可是遗憾的是。Unity不是这样,我打WP8的时候。它经常去载入Android文件夹下的插件。这个问题的解决办法,我一直没有查到,希望了解的朋友指教。为了解决问题,我就在打包的时候。把非当前平台文件夹下的插件删除,打好包之后,再恢复。

另外,还要删除上一次打包生成的文件。

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

第三步,生成安装包。在生成包之前。要替换一些Unity生成的文件,比方。MainPage.xaml/.cs,由于我们为了操作内嵌web,做了WP8特性的ApplicationBar。我们配置好的WMAppManifest.xml。友盟统计要求初始化必须在App.xaml.cs中,WP8projectAssets/文件夹下的Icon等。然后,依据须要改动project文件,比方,我们做了WP8的ApplicationBar。须要在打包工具里把相关的资源索引加入到project文件里。然后,就能够调用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报错。

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

最開始。我没有生成Androidproject,而是直接Build出来apk,这种优点是快。依据測试。3分钟多能够生成一个。而生成project之后再Build出apk,时间翻了一倍。

可是,各个渠道的sdk的特殊性,造成这种方式后来出几次问题。

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

第二次,接百度多酷的同学说,用打包工具生成的apk,充值支付的时候。假设选择银联支付,会crash。

而先Build出project。然后用Eclipse编project生成的apk没问题。我细致对照了两个apk,发现直接生成的apk里,比project生成的apk里,res/drawable/文件夹下少了几个文件,data.bin/data_high.bin/data_low.bin/mobilepayplugin.bin,我怀疑是Unity直接生成apk的时候,过滤掉了这些文件。而生成project的时候没有过滤。什么原因?这个也好解决。找到缺少的文件。用aapt加进去。

后来,当乐、Oppo都须要在打包工具里增加相同的几个bin文件。

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

第三步。生成安装包。这个没什么好说的,就是Ant、sign、zipalign等。

另外。我们的运营有一个特殊的需求。他们投放渠道,分两种方式:一种是接渠道sdk。第二种是仅仅购买流量,不接sdk。针对第二种方式,我打包的时候,仅仅打一个包,然后,为了统计区分投放的渠道。对于生成的这个包,复制一份然后改动包里的配置文件,就能够了。不须要反复生成多次包。这样,十几秒就能够出一个包。我打包工具里的“SPP渠道包”这个button,就是是单独生成这样的渠道包的。

第四步,资源恢复。由于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打包非常easy。

其他

我最開始写工具的时候。打包操作入口用的是[MenuItem(...)],操作button在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中。了解了在哪里写。实现就非常easy了,建一个Prefab就能够了。这样,以后新加入渠道,接入的同学仅仅须要依照我规定的格式,在配置文件中加一行渠道信息就能够了。改动后打包工具操作界面:

我们的打包工具操作入口

Refreshbutton是改动渠道配置文件之后。又一次读取配置文件。

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

Build Player以下button式打各平台、各渠道的安装包。能够一键出某个包。或者一键出某平台的全部包。这里我没有做一键出全部平台的包。由于我们没有这个需求。假设要做,出完一个平台的包之后,切换一下平台就能够了(EditorUserBuildSettings.SwitchActiveBuildTarget(xxx))。

可是,注意不要Switch之后马上打新平台的包。而应该在回调接口里做,activeBuildTargetChanged。

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

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

Unity自己主动打包工具的更多相关文章

  1. Unity自动打包工具

    转载 https://blog.csdn.net/ynnmnm/article/details/36774715 最开始有写打包工具的想法,是因为看到<啪啪三国>王伟峰分享的一张图,他们有 ...

  2. Unity 游戏框架搭建 (十一) 简易AssetBundle打包工具(一)

    最近在看Unity官方的AssetBundle(以下简称AB)的教程,也照着做了一遍,不过做出来的AssetBundleManager的API设计得有些不太习惯.目前想到了一个可行的解决方案.AB相关 ...

  3. 一个灵活的AssetBundle打包工具

      尼尔:机械纪元 上周介绍了Unity项目中的资源配置,今天和大家分享一个AssetBundle打包工具.相信从事Unity开发或多或少都了解过AssetBundle,但简单的接口以及众多的细碎问题 ...

  4. 细说前端自动化打包工具--webpack

    背景 记得2004年的时候,互联网开发就是做网页,那时也没有前端和后端的区分,有时一个网站就是一些纯静态的html,通过链接组织在一起.用过Dreamweaver的都知道,做网页就像用word编辑文档 ...

  5. Atitit.项目修改补丁打包工具 使用说明

    Atitit.项目修改补丁打包工具 使用说明 1.1. 打包工具已经在群里面.打包工具.bat1 1.2. 使用方法:放在项目主目录下,执行即可1 1.3. 打包工具的原理以及要打包的项目列表1 1. ...

  6. Webpack:前端资源模块化管理和打包工具

    一.介绍: Webpack 是当下最热门的前端资源模块化管理和打包工具.它可以将许多松散的模块按照依赖和规则打包成符合生 产环境部署的前端资源.还可以将按需加载的模块进行代码分隔,等到实际需要的时候再 ...

  7. 模块化管理工具兼打包工具 webpack

    webpack 是一个[模块化管理工具]兼[打包工具] 是一个工具(和seajs,requirejs管理前端模块的方式是不一样) 在webpack一个文件就是一个模块! seajs,requirejs ...

  8. Winform打包工具SetupFactory 9 的使用

    写了个WinForm的小程序..以前没打过包..只是直接把Bin里的东西复制出来使用..自己使用是足够.但是发给别人毕竟不太好看(不牛逼)..所以就想着打包.. Vs2012自带的有打包的功能..相信 ...

  9. 【Cocos2d-Js基础教学(5)资源打包工具的使用及资源的异步加载处理】

    TexturePacker是纹理资源打包工具,支持Cocos2dx的游戏资源打包. 如果用过的同学可以直接看下面的资源的异步加载处理 首先为什么用TexturePacker? 1,节省图片资源实际大小 ...

随机推荐

  1. 阿里weex学习入门必备

    1.阿里weex学习前景 至于这些东西,可以参照一下链接去看看其作用.... http://share.iclient.ifeng.com/news/sharenews.f?forward=1& ...

  2. web端通信技术

    1.web端通信技术:长连接.长轮询.websocket; 什么是长连接.长轮询? 就是客户端不停的向服务器发送请求以获取最新的数据信息.这里的“不停”其实是有停止的,只是我们人眼无法分辨是否停止,它 ...

  3. Android 开关按钮切换,类似于iphone 效果,view实现

    1.实现的效果 gitHub :  https://github.com/zcweng/ToggleButton

  4. NOIP2010普及组T4 三国游戏——S.B.S.

    题目描述 小涵很喜欢电脑游戏,这些天他正在玩一个叫做<三国>的游戏. 在游戏中,小涵和计算机各执一方,组建各自的军队进行对战.游戏中共有 N 位武将(N为偶数且不小于 4),任意两个武将之 ...

  5. Ubuntu连接L2TP的VPN设置

    作为程序猿,FQ查资料那是经常的事情.电信不知怎么的pptp方式连接不上.蛋疼!o(╯□╰)o没有办法自己只好折腾l2tp连接方式了\(^o^)/~ 1. 添加PPA sudo apt-add-rep ...

  6. [HDU 4082] Hou Yi&#39;s secret (简单计算几何)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4082 题目大意: 给你n个点,问能最多构成多少个相似三角形. 用余弦定理,计算三个角度,然后暴力数有多 ...

  7. 1.5 sleep()方法

    方法sleep()的作用是在指定的毫秒数内让当前"正在执行的线程"休眠(暂停执行).这个"正在执行的线程"是指this.currentThread()返回的线程 ...

  8. 基于 Maven 的多模块 Java ( Spring ) 项目构建

    索引: 开源Spring解决方案--lm.solution 参看代码 GitHub: solution/pom.xml pojo/pom.xml mapper/pom.xml common/pom.x ...

  9. LTS本地搭建详述

    由于工作项目中使用LTS作为消息队列,这几天有空正好研究一下. 1. 先去GitHub上下载源码:https://github.com/ltsopensource/light-task-schedul ...

  10. P1063 能量项链 区间dp

    题目描述 在MarsMars星球上,每个MarsMars人都随身佩带着一串能量项链.在项链上有NN颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一 ...