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

(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. [android 代码search地址]

    http://www.androidcodesearch.com/source/packages/apps/Settings/src/com/android/settings/SecuritySett ...

  2. OpenJ_Bailian——4115鸣人和佐助(带状态的A*)

    鸣人和佐助 Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Submit Status Desc ...

  3. HDU 3001 Travelling ——状压DP

    [题目分析] 赤裸裸的状压DP. 每个点可以经过两次,问经过所有点的最短路径. 然后写了一发四进制(真是好写) 然后就MLE了. 懒得写hash了. 改成三进制,顺利A掉,时间垫底. [代码] #in ...

  4. 【强连通分量缩点】poj 1236 Network of Schools

    poj.org/problem?id=1236 [题意] 给定一个有向图,求: (1)至少要选几个顶点,才能做到从这些顶点出发,可以到达全部顶点 (2)至少要加多少条边,才能使得从任何一个顶点出发,都 ...

  5. C 语言中的 feof()函数

    功能: feof 是 C 语言标准库函数函数,其原型在 stdio.h 中,其功能是检测流上的文件结束符,如果文件结束,则返回非0值,否则返回0,文件结束符只能被 clearerr() 清除. 用法: ...

  6. oracle怎么查看表空间里有哪些表

    select TABLE_NAME,TABLESPACE_NAME from dba_tables where TABLESPACE_NAME='表空间名'; 注意:表空间名要大写

  7. Codeforces Round #275 (Div. 2) B. Friends and Presents 二分+数学

    8493833                 2014-10-31 08:41:26     njczy2010     B - Friends and Presents             G ...

  8. Scrapy学习-9-FromRequest

    用FromRequest模拟登陆知乎网站 实例 默认登陆成功以后的请求都会带上cookie # -*- coding: utf-8 -*- import re import json import d ...

  9. AC日记——香甜的黄油 codevs 2038

    2038 香甜的黄油 USACO  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 农夫Jo ...

  10. 什么是 Linux 发行版

    什么是Linux的发行版 就Linux的本质来说,它只是操作系统的核心,负责控制硬件.管理文件系统.程序进程等,并不给用户提供各种工具和应用软件.所谓工欲善其事,被必先利其器,一套在优秀的操作系统核心 ...