首页 > Unity3D频道 > 【Unity3D研究院之游戏开发】 > Unity3D研究院之脚本批量打包渠道包研究(六十四)
2013
06-29

Unity3D研究院之脚本批量打包渠道包研究(六十四)

         最近在研究Unity3D脚本批量打包,比如在Android平台下各种不同分辨率和不同内存大小的机器,可能还有不同的渠道包,不同渠道可能用的SDK都不一样,这一切的一切都表明你的代码无法做到自适应的,除非批量打包提供各个平台的预定义标签#define 。

Unity默认提供了一些预定义标签如:

UNITY_EDITOR  : 编辑器模式下。

UNITY_STANDALONE:PC Mac Linux模型下。

UNITY_IPHONE:IOS模式下。

UNITY_ANDROID:ANDROID模式下。

还有很多预定义标签、大家可以在这里看到:http://docs.unity3d.com/Documentation/Manual/PlatformDependentCompilation.html

 

         官方提供的标签属于比较大的范围标签,比如我希望在UNITY_ANDROID下面在写一些自定义的标签、类似 QQ UC CMCC这样的渠道标签该如何呢?如下图所示,ProjectSetting打包界面每个平台都会有Scripting Define Symbols这个选项,可以在这里添加每个平台下对应的自定义标签(多个标签用“;”号隔开),这里我设置的是Android平台,如果IOS也需要打这样的渠道标签那么也要在IOS页面Scripting Define Symbols选项处添加对应的标签。

Unity3D研究院之脚本批量打包渠道包研究(六十四) - 雨松MOMO程序研究院 - 1

标签做出来了就好办了,然后在代码中我们可以这样来写。如果在Scripting Define Symbols中没有出现的标签默认是不启用的,就像 #define Test 一样,会自动被注释掉。

Unity3D研究院之脚本批量打包渠道包研究(六十四) - 雨松MOMO程序研究院 - 2

然后我们看看如何实现脚本批量打包。

 

这里面忘说了一点,如果我们希望在性能高的手机上用一套好的资源,在性能低的手机上用一套差一点的资源该怎么办?那么首先我们先搞清楚Unity会把什么资源打包,什么资源不打包?

1.Resources文件夹 

Resources文件夹是一个只读的文件夹,通过Resources.Load()来读取对象。因为这个文件夹下的所有资源都可以运行时来加载,所以Resources文件夹下的所有东西都会被无条件的打到发布包中。建议这个文件夹下只放Prefab或者一些Object对象,因为Prefab会自动过滤掉对象上不需要的资源。举个例子我把模型文件还有贴图文件都放在了Resources文件夹下,但是我有两张贴图是没有在模型上用的,那么此时这两张没用的贴图也会被打包到发布包中。假如这里我用Prefab,那么Prefab会自动过滤到这两张不被用的贴图,这样发布包就会小一些了。 

2.StreamingAssets

StreamingAssets文件夹也是一个只读的文件夹,但是它和Resources有点区别,Resources文件夹下的资源会进行一次压缩,而且也会加密,不使用点特殊办法是拿不到原始资源的。但是StreamingAssets文件夹就不一样了,它下面的所有资源不会被加密,然后是原封不动的打包到发布包中,这样很容易就拿到里面的文件。所以StreamingAssets适合放一些二进制文件,而Resources更适合放一些GameObject和Object文件。StreamingAssets 只能用过www类来读取!!

3. 最后凡是在Hierarchy视图对象引用过的资源文件也会被无条件打包到发布包中。如果有一部分文件可能没有在Resources文件夹下也没有在StreamingAssets文件夹下,也没有被Hierarchy视图游戏对象引用,那么这类资源是不会被打包到发布包中的。

OK!搞清楚这一点就好办了!在处理不同包对应不同资源包的时候,尽量让可配置的资源放在Resources 或StreamingAssets文件夹下,运行的时候程序动态的来读取它们,最后显示在游戏中就可以了。在批量打包前,在Project视图下创建不同包的资源文件夹, 然后脚本 AssetDatabase 动态的将资源拷贝至Resources或StreamingAssets 文件夹中,

http://docs.unity3d.com/Documentation/Manual/StreamingAssets.html

 

代码中说到还有一个重要的东西就是PlayerSettings类。因为在Build的时候不同平台下可能会有一些PlatformSettings是不一样的,所以需要在脚本里面动态的设置它,强大的参数列表在这里:http://docs.unity3d.com/Documentation/ScriptReference/PlayerSettings.html根据情况来批量构建自己的工程吧~

 

 

Unity3D研究院之脚本批量打包渠道包研究(六十四) - 雨松MOMO程序研究院 - 3

另外,由于IOS工程比较特殊,使用这样的方法我们只能生成出来多个IOS的工程文件,但是这并不是最终发布的版本。如果想一键生成.ipa文件的话。

1.通过命令行来Build IOS  http://docs.unity3d.com/Documentation/Manual/CommandLineArguments.html

2.通过shell来自动打包 1生成的xcode工程,最终生成渠道包。

这两种方法我已经在网上找到了答案,今天太晚了就不在研究了,下一篇的时候我在补上。 祝大家学习愉快!!不早了,晚安!欢迎大家一起来讨论与学习,嘿嘿!!!

代码下载地址:http://vdisk.weibo.com/s/HUf2W

雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!

--

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。

Unity3D研究院之脚本批量打包渠道包研究(六十四)》有 41 条评论

  1. 二十四桥 说:

    momo,那android打包成eclipse工程怎么设置呢?

  2. 冬季灯 说:

    mono 你好 。参考 unity手册里的buildpipeline 想实现 按个按钮在我指定的目录打个target包 参考 的这个 http://docs.unity3d.com/ScriptReference/BuildPipeline.BuildPlayer.html结果build的时候 PlayerLoop called recursively!UnityEditor.BuildPipeline:BuildPlayer(String[], String, BuildTarget, BuildOptions)找了挺久 也没在网上找相关的解决 各位看到的 如果有思路的 提示下我(万分感谢).

  3. 张立恒 说:

    您现在找到方式了吗?

  4. wavebbs 说:

    player settings里的 iOS 的 splash Image 怎么用代码替换啊

  5. 木偶 说:

    “这两种方法我已经在网上找到了答案,今天太晚了就不在研究了,下一篇的时候我在补上。” 骗纸。 Unity3D研究院之脚本批量打包渠道包研究(六十四) - 雨松MOMO程序研究院 - 1

  6. weigun 说:

    用命令行来build 是用-buildTarget IOS 这个参数吗?为啥我这里不行呢?求松哥解答,谢谢

  7. 邵玉洁 说:

    松哥typeTree.m_Children.front ().m_Type != SerializeTraits::GetTypeString (NULL) ,这样的错误遇到过吗?解决不了啦!

  8. 哥们你好。看了你这篇文章学到了很多。 现在有个小问题 有没有什么办法 能在windows上使用脚本 或什么远程的方式生成ios的执行程序 ipa 想写一个通用的批处理或脚本 一键把现有的工程导出执行程序 现在pc 和android没问题了 就是ios 不知道有没有办法 。求指导

  9. 买了momo的书了!现在有个问题问下,unity3d 同一个场景多个游戏对象绑定同一个脚本,里面的私有变量不是按自己的意愿输出,这问题有办法解决吗?还是一个游戏对象不能绑定与另外一个游戏对象相同的脚本!

  10. 陈放 说:

    MOMO,像Android的AssetsPluginsAndroid目录下通常放置了不同的接入SDK之类的包。比如QQ的SDK,爱游戏的SDK,联通的SDK,不同的发布平台有不同的SDK包,这些包有没有类似的方法可供一键发布?

  11. AthrunZala 说:

    MOMO, 有没有什么方法编译的时候是APPEND目录的方式,而不是删除原有的目录再新建

  12. 小徐 说:

    momo,请教一个问题,在代码中如何让一个物体动态的添加碰撞触发事件呢?

  13. aijack居士 说:

    momo为什么打包成web后为什么不能读文本文件了呢?我用c#写的读文件代码,把它放在OnGUI 里了?

  14. Java武林 说:

    您知道为什么如果将导入模型的rig设置为legacy的话,就不能预览动作了呢?如果将rig设置为generic就又可以review了。

  15. Java武林 说:

    关注您的博客很久,我是unity3d初学者,最近在导入一套人物模型之后,如果不设置模型的rig为generic,动作就不能review,如果设置模型的rig为legacy,就不能预览了,放到场景里,人物也不能运动,是怎么回事了?谢谢您

  16. kuku小夭 说:

    瞬间长知识了 原来可以这么用的

  17. 说:

    有个别的问题想请教一下,Unity3D中如何知道我都把什么文件打包到Android中了?因为我总感觉有一些多余的东西打包进去了,但找不到,这个有什么办法吗?

  18. Pingback 引用通告: オークリー メガネ

  19. Pingback 引用通告: レイバン アビエイター

  20. Pingback 引用通告: オークリー サングラス

  21. Pingback 引用通告: コーチ 店舗

  22. Pingback 引用通告: レイバン サングラス

  23. 九尾猫 说:

    别的不说,就第一个Example,CodeList_02_01,build&Run之后为什么有足足7M的APK?是因为有选项没有调整吗?或者这就是正常的?恳求雨松MOMO指教!

  24. foreverpains 说:

    momo大神的文章都相当实用,小弟受益匪浅,不过小弟一直有一疑惑,本人每天上班已经忙得焦头烂额,回到家自己再看unity 更是身心疲惫,不知momo大神怎能有这么多经历,写出如此精湛的好文章,供广大网友们拜读….不知momo大神可否有时间指点一下小弟,让小弟在学习方法上能有所长进

  25. darling 说:

    StreamingAssets下的文件不是一定要用www来读取吧。在pc和ios上,通过文件系统也是可以的吧。只是android上比较特别。

  26. 松哥~ 小弟新人 ~ 最近开发有点难题~ 关于坦克履带的部分 ~ 我看了看官网的那个山道赛车的案例 但是没看懂~  小弟新手希望松哥能抽时间详解一下 那个赛车刹车印是怎么做出来的 小弟不胜感激啊~~~

  27. Dole 说:

    松哥继续啊

  28. 说:

    一口气把 unity的所有文章 看完了,让我对unity有了大概的了解。说声谢谢

  29. 说:

    將xml文件放入StreamingAssets文件夹,在生成的pc文件可以讀取,生成的apk文件在手機上就不能讀取了,求解釋,是怎麼一回事

  30. 阿飞 说:

    momo童鞋,我u3d导出成apk,里面嵌入了admob,代码有控制admob的显示和隐藏,不过隐藏一直有问题,老是隐藏不掉。能研究下这个问题吗?

  31. 飞鸟 说:

    默默的来顶一个~

  32. 绿洲 说:

    为什么win8安装unity3D运行不了,显示Couldn’t read a file:\file

  33. 你说的不使用点特殊办法是拿不到resource里面原始资源的,特殊办法是什么呢。嘿嘿。,

  34. 黄杰 说:

    作为一个上班没带笔记本电池的我,默默的顶个。。。。

  35. 大清早的,来顶啦! O_o

留下一个回复

你的email不会被公开。