资源包常见问题1. 什么是资源包 (AssetBundles)? 2. 资源包 (AssetBundles) 有何用途? 3. 如何创建资源包 (AssetBundles)? 4. 如何使用资源包 (AssetBundles)? 5. 如何在编辑器中使用资源包 (AssetBundles)? 6. 如何缓存资源包 (AssetBundles)? 7. 资源包 (AssetBundles) 是否兼容多个平台? 8. 如何查找资源包 (AssetBundles) 中的资源 9. 是否可在其他游戏中重复使用我的资源包 (AssetBundles)? 10. 现在构建的资源包 (AssetBundles) 是否可用于将来版本的 Unity? 11. 如何列出资源包 (AssetBundles) 中的对象? 1. 什么是资源包 (AssetBundles)?及其分配。 资源包 (AssetBundles) 是在运行时为加载而打包组成的资源集合。借助资源包 (AssetBundles),可以为应用动态加载和卸载新内容。资源包 (AssetBundles) 可用于实现发布后追加下载内容 (DLC)。 是分配在栈中的。 2. 资源包 (AssetBundles) 有何用途? 资源包用于在进行首次部署的情况下减少游戏占用的磁盘空间。也可用它将新内容添加至已发布的游戏。 3. 如何创建资源包 (AssetBundles)? 创建资源包 (AssetBundle) 需要使用构建管线 (BuildPipeline) 编辑器类。必须将使用编辑器 (Editor) 类的所有脚本置于资源 (Assets) 文件夹下以编辑器 (Editor) 命名的文件夹中。以下是一个 C# 脚本示例: [JavaScript] 纯文本查看 复制代码 例如,在网页播放器 (Webplayer) 目标发布平台激活的情况下,创建的资源包可与编辑器和独立版兼容。但是,它与为 iOS 或安卓 (Android) 平台创建的应用不兼容。 8. 如何查找资源包 (AssetBundles) 中的资源? 构建资源包 (AssetBundles) 时,可通过文件名(无需扩展名)在内部查找资源。例如,如果使用默认方法,则可使用 “myTexture” 查找和加载工程 (Project) 文件夹中位于 “Assets/Textures/myTexture.jpg” 的纹理 (Texture) 使用 BuildPipeline.BuildAssetBundleExplicitAssetNames 构建资源包 (AssetBundle) 时,提供自有的每个对象 ID(字符串)数组更有助于您管理这些资源。 9. 是否可在其他游戏中重复使用我的资源包 (AssetBundles)? 您可在不同游戏中共享资源包 (AssetBundles) 内容。要求是,从资源包 (AssetBundles) 的游戏对象 (GameObjects) 中引用的任何资源 (Assets) 必须包含在资源包 (AssetBundle) 中,或存在于该应用程序(在当前场景中加载的应用程序)中。构建资源包 (AssetBundle) 后,要确保引用的资源 (Asset) 包含在其中,您可传递 BuildAssetBundleOptions.CollectDependencies 选项。 10. 现在构建的资源包 (AssetBundles) 是否可用于将来版本的 Unity? 资源包 (AssetBundles) 包含名为类型树的结构,该结构可让不同版本的 Untiy 正确理解资源类型的相关信息。默认情况下,台式机将包含类型树,但也可通过将 BuildAssetBundleOptions.DisableWriteTypeTree 传递至 BuildAssetBundle 函数禁用此结构。网页播放器本身依赖类型树,所以其始终包含类型树(即 DisableWriteTypeTree 选项不可用)。移动和控制台资源包从不包含类型树,因此每当序列化格式发生变更时,则需重新构建这些资源包。新版本的 Unity 可能出现上述情况。(除 bugfix 版本外) 如果添加或删除添加包含在资源包中的 monobehaviour 的已序列化字段,则也会出现上述情况。如果必须重新构建资源包 (AssetBundle),Unity 将在加载资源包时显示错误消息。 11. 如何列出资源包 (AssetBundles) 中的对象 您可使用 AssetBundle.LoadAll 检索包含资源包 (AssetBundle) 中所有对象的数组。您无法直接获取标识符列表。常用的变通方法是保留一个独立的文本资源 (TextAsset),以保留资源包 (AssetBundle) 中的资源名称。 |
using UnityEngine;
using UnityEditor;
public class ExportAssetBundles {
[MenuItem(\"Assets/Build AssetBundle\")]
static void ExportResource () {
string path = \"Assets/myAssetBundle.unity3d\";
Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);
BuildPipeline.BuildAssetBundle(Selection.activeObject, selection, path, BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets);
}
}
}