AssetBundle 打包(4.x)基础
基本介绍 常用打包API
public static bool BuildAssetBundle(Object mainAsset, Object[] assets, string pathName, out uint crc,BuildAssetBundleOptions assetBundleOptions,BuildTarget targetPlatform);
● BuildPipeline.BuildAssetBundle对除Scene以外的资源打包,支持单个和多个;
常用打包选项(BuildAssetBundleOptions) ● CompleteAssets :用于保证资源的完备性。比如,当你仅打包一个Mesh资源并开启了该选项时,引擎会将Mesh资源和相关GameObject一起打入AssetBundle文件中;
● CollectDependencies:用于收集资源的依赖项。比如,当你打包一个Prefab并开启了该选项时,引擎会将该Prefab用到的所有资源和Component全部打入AssetBundle文件中;
● DeterministicAssetBundle:用于为资源维护固定ID,以便进行资源的热更新。
以上选项均已在5.x新机制中默认开启。因此在4.x版本中,开发者如果没有深入了解每个选项的意义,我们建议也都开启。
三个选项开启的情况下打包,可以保证在加载并实例化其中的Prefab时不会出现资源引用丢失的情况,因为所有依赖的资源都在包中。这也意味着,如果Prefab-A和Prefab-B引用了同一个Asset-A且分别打包时,两个包中就都会包含Asset-A。加载到内存后,通过Profiler会发现Asset-A的冗余资源。
然而很多时候,并不希望把两个Prefab打在一个Bundle中,此时,就需要通过依赖性打包来解决。
依赖性打包 依赖性打包的作用在于避免资源冗余,同时提高资源加载和卸载的灵活性,其重要性不言而喻。在4.x版本的AssetBundle打包系统中,涉及一对 BuildPipeline.PushAssetDependencies和BuildPipeline.PopAssetDependencies接口,从官方文档中可以大致了解其用法: http://docs.unity3d.com/ScriptReference/BuildPipeline.PushAssetDependencies.html
你可以简单地认为,PushAssetDependencies是将资源进栈,PopAssetDependencies是让资源出栈,每打一个包,引擎都会检查当前栈中所有的依赖项,查看是否有相同资源已经在栈中。如有,则与其相关的AssetBundle建立依赖关系。
机制不难理解,但使用中依然有几个容易忽视的注意点,请移步下文进阶篇。
AssetBundle 打包(4.x)进阶 注意点 ● 进行一次Push,多次Build操作,如依次Build资源Prefab-A,Prefab-B时,可以认为Prefab-A,Prefab-B会依次 进栈,所以如果两者之间也存在共享资源,则后者会依赖前者。具体表现为,运行时先加载Prefab-B会出现共享资源丢失的情况。
● 4.x 中脚本也会作为“共享资源”参与依赖性打包,即当Prefab-A和Prefab-B同时挂有脚本M时,如果出现了上一点中的情况,那么后者同样会依赖前者。具体表现为,运行时先加载Prefab-B会出现脚本M丢失。
● 将shader放入GraphicsSettings->Always Included Shaders中后,打包时会将相应的shader抽离,运行时加载时会自动加载其依赖的shader。同时也意味着,如果修改了Always Included Shaders或在一个新建项目中使用该Bundle,会出现shader丢失的问题。
● 当需要更新bundle内容,但不改变依赖关系时,仍然需要重打其依赖的Bundle包。即如果Bundle-B依赖Bundle-A,那么在更新Bundle-A时可以不需要重打Bundle-B(前提是开启了DeterministicAssetBundle);但要更新Bundle-B的话,则必须重打Bundle-A。
AssetBundle 打包(4.x)基础
基本介绍 常用打包API
public static bool BuildAssetBundle(Object mainAsset, Object[] assets, string pathName, out uint crc,BuildAssetBundleOptions assetBundleOptions,BuildTarget targetPlatform);
● BuildPipeline.BuildAssetBundle对除Scene以外的资源打包,支持单个和多个;
常用打包选项(BuildAssetBundleOptions) ● CompleteAssets :用于保证资源的完备性。比如,当你仅打包一个Mesh资源并开启了该选项时,引擎会将Mesh资源和相关GameObject一起打入AssetBundle文件中;
● CollectDependencies:用于收集资源的依赖项。比如,当你打包一个Prefab并开启了该选项时,引擎会将该Prefab用到的所有资源和Component全部打入AssetBundle文件中;
● DeterministicAssetBundle:用于为资源维护固定ID,以便进行资源的热更新。
以上选项均已在5.x新机制中默认开启。因此在4.x版本中,开发者如果没有深入了解每个选项的意义,我们建议也都开启。
三个选项开启的情况下打包,可以保证在加载并实例化其中的Prefab时不会出现资源引用丢失的情况,因为所有依赖的资源都在包中。这也意味着,如果Prefab-A和Prefab-B引用了同一个Asset-A且分别打包时,两个包中就都会包含Asset-A。加载到内存后,通过Profiler会发现Asset-A的冗余资源。
然而很多时候,并不希望把两个Prefab打在一个Bundle中,此时,就需要通过依赖性打包来解决。
依赖性打包 依赖性打包的作用在于避免资源冗余,同时提高资源加载和卸载的灵活性,其重要性不言而喻。在4.x版本的AssetBundle打包系统中,涉及一对 BuildPipeline.PushAssetDependencies和BuildPipeline.PopAssetDependencies接口,从官方文档中可以大致了解其用法: http://docs.unity3d.com/ScriptReference/BuildPipeline.PushAssetDependencies.html
你可以简单地认为,PushAssetDependencies是将资源进栈,PopAssetDependencies是让资源出栈,每打一个包,引擎都会检查当前栈中所有的依赖项,查看是否有相同资源已经在栈中。如有,则与其相关的AssetBundle建立依赖关系。
机制不难理解,但使用中依然有几个容易忽视的注意点,请移步下文进阶篇。
AssetBundle 打包(4.x)进阶 注意点 ● 进行一次Push,多次Build操作,如依次Build资源Prefab-A,Prefab-B时,可以认为Prefab-A,Prefab-B会依次 进栈,所以如果两者之间也存在共享资源,则后者会依赖前者。具体表现为,运行时先加载Prefab-B会出现共享资源丢失的情况。
● 4.x 中脚本也会作为“共享资源”参与依赖性打包,即当Prefab-A和Prefab-B同时挂有脚本M时,如果出现了上一点中的情况,那么后者同样会依赖前者。具体表现为,运行时先加载Prefab-B会出现脚本M丢失。
● 将shader放入GraphicsSettings->Always Included Shaders中后,打包时会将相应的shader抽离,运行时加载时会自动加载其依赖的shader。同时也意味着,如果修改了Always Included Shaders或在一个新建项目中使用该Bundle,会出现shader丢失的问题。
● 当需要更新bundle内容,但不改变依赖关系时,仍然需要重打其依赖的Bundle包。即如果Bundle-B依赖Bundle-A,那么在更新Bundle-A时可以不需要重打Bundle-B(前提是开启了DeterministicAssetBundle);但要更新Bundle-B的话,则必须重打Bundle-A。