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

(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. Unity——可复用背包工具

    Unity可复用背包工具 Demo展示 设计思路 游戏中有非常多的背包样式,比如玩家道具背包,商城,装备栏,技能栏等:每个形式的背包都单独写一份逻辑会非常繁琐,所以需要有一套好用的背包工具: 这些背包 ...

  5. UE4自动打包工具编写

    在UE的开发中,有些项目需要针对不同版本出不同的包,并有一个对应的GUI界面,供大家使用. 1.插件编写 先使用UE4自己的插件模板创建插件,做成插件形式 然后注册Slate UI,编写打开逻辑.并在 ...

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

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

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

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

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

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

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

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

随机推荐

  1. hdu 1907 尼姆博弈

    John Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submis ...

  2. 九度oj 题目1467:二叉排序树

    题目描述: 二叉排序树,也称为二叉查找树.可以是一颗空树,也可以是一颗具有如下特性的非空二叉树: 1. 若左子树非空,则左子树上所有节点关键字值均不大于根节点的关键字值:        2. 若右子树 ...

  3. 【Luogu】P3847调整队形(DP)

    题目链接 DP果真是考思维啊 增加一个数的操作等价于删掉那个不和谐的数的操作. 所以1.2操作可以忽略. 剩下3.4操作,则可以设计f[i][j]是将区间[i,j]变成回文序列需要的操作数. if(a ...

  4. BZOJ 2720 [Violet 5]列队春游 ——期望DP

    很喵的一道题(我可不是因为看了YOUSIKI的题解才变成这样的) $ans=\sum_{x<=n}\sum_{i<=n} iP(L=i)$ 其中P(x)表示视线为x的概率. 所以只需要求出 ...

  5. android图片上传

    package com.example.center; import java.io.ByteArrayOutputStream;import java.io.InputStream; import ...

  6. 洛谷——P1290 欧几里德的游戏

    P1290 欧几里德的游戏 题目描述 欧几里德的两个后代Stan和Ollie正在玩一种数字游戏,这个游戏是他们的祖先欧几里德发明的.给定两个正整数M和N,从Stan开始,从其中较大的一个数,减去较小的 ...

  7. luogu P2659 美丽的序列

    题目背景 GD是一个热衷于寻求美好事物的人,一天他拿到了一个美丽的序列. 题目描述 为了研究这个序列的美丽程度,GD定义了一个序列的“美丽度”和“美丽系数”:对于这个序列的任意一个区间[l,r],这个 ...

  8. IntelliJ IDEA删除项目

    删除项目一向比较奇葩,因为当你点击到该项目名称右键时,并没有delete选项,导致我们不知道怎么删除,查找多方文档,得到以下解决: 1.将鼠标移到要删除的项目名称上,单击并按“Delete”按钮删除项 ...

  9. Google的JSON风格指南

    官网:https://google.github.io/styleguide/jsoncstyleguide.xml 中文版:https://github.com/darcyliu/google-st ...

  10. 【面试 AOP】【第八篇】AOP的问题

    1.AOP的原理以及应用场景 面向切面编程,不修改原有代码逻辑的情况下进行逻辑增强. 使用场景:短信业务,restful返回统一响应体等等. ============================= ...