问题
- 您有一个创建好的场景bundle,但您不知道这个bundle里面有什么东西。
- 您有一个创建好的场景bundle,但它的占用空间超出您的预料,并且您想知道什么它是那么大。
原因
Unity中的场景在放进一个bundle之前是当作一个序列化对象的集合来对待的。这就意味着,当场景被添加进bundle时,是作为一个序列化场景对象来引入的,并且会在资源bundle的清单列表上出现<SceneName>.unity这一项。这样的话查找序列化场景对象中的单个对象就会显得有些困难。
解决方案
请注意:以下方法只适用于Unity5.4或更新的版本
您需要使用Unity安装目录中两个不同的工具来解包场景bundle从而发现里面的东西。
您可以在各自的平台中的默认安装目录找到这些工具:
Windows:
C:\Program Files\Unity\Editor\Data\Tools
Mac OSX:
/Applications/Unity/Unity.app/Contents/Tools
首先要使用WebExtract,它可以把场景bundle提取成一个解压数据文件夹。然后要使用 binary2text,他可以把场景bundle信息转化为人类可理解信息。
这些都是命令行工具,需要运行在命令行窗口或终端窗口。首先,运行一个路径转移命令转移到上面所指定的目录。
例子:
- 运行以下命令:
cd /Applications/Unity/Unity.app/Contents/Tools
- 运行webextract:
WebExtract <FilePathToSceneBundle>
这样就能把数据提取到一个文件夹中,其命名格式问您的场景bundle名字追加_data(如YourSceneBundleName_data)。
- 运行binary2rext:
binary2text YourSceneBundleName_data/BuildPlayer-SceneBundleName"
这样会产生一个含有场景bundle里的所有序列化对象信息的文本文件。文本文件中的每个对象看上去是这样的:
对象的ID号是对象在场景bundle里面的下标。
Class ID用于索引对象的类型 – 详见Class ID reference documentation以了解更多信息。
binary2text工具同样提供了class ID的文本信息(上面的例子显示为LightProbes)。您可以查找对象中的每个变量,列出变量的值和类型,例如:
- m_Name是一个变量名
- “”是它的值
- (string)是它的类型
您可以用这种方式分解每个变量,以带缩进列表的形式展示它们。
使用这个文本文件,您应该就可以确切地知道你的场景bundle中存在什么东西了。
更多信息
如果您想看到包含在非场景bundle中的资源,您可以打开清单文件(.manifest),它是随资源bundle生成的时候在同一个根目录同时生成的。在manifest文件中,您可以在 Assets:这个域下看到资源的列表。
下方的截屏中可看到清单文件是怎么样的。请注意 Assets:域下的 “Assets/MyImageName.png”- 这是bundle下的这个资源的文件路径。Bundle中的每个资源都会出现在列表中。
您还可以加载bundle和bundle中的每个对象来查看bundle中有什么东西。
请查看AssetBundle API和 AssetDataBase API以了解更多工具所提供的功能。