咨询AssetBundleBuild.addressableNames与assetNames的区别及特定资源包构建方法
嘿,我来帮你理清这两个Unity AssetBundle构建里的关键问题:
一、addressableNames 和 assetNames 的核心区别
这两个属性都是AssetBundleBuild类里用来指定资源的,但定位完全不同:
assetNames:这是你要打包进当前AssetBundle的实际资源的项目路径列表,比如Assets/Textures/PlayerSkin.png或者Assets/Prefabs/Player.prefab。Unity会直接根据这些路径找到对应的资源文件,把它们打包到这个AssetBundle中。简单说,它是告诉Unity「要打包哪些资源」。addressableNames:这是给assetNames里的资源设置的寻址别名,相当于给每个资源起一个更简洁、更稳定的「外号」。当你加载AssetBundle后,可以用这个别名来获取资源,而不用依赖原始的资源路径。需要注意的是,这个数组的长度必须和assetNames完全一致,一一对应(比如assetNames[0]对应的别名就是addressableNames[0])。如果不设置addressableNames,Unity默认会用assetNames里的路径作为寻址名称。
举个直观的代码例子:
var playerBundleBuild = new AssetBundleBuild(); playerBundleBuild.assetBundleName = "player_resources"; // 指定要打包的资源路径 playerBundleBuild.assetNames = new[] { "Assets/Textures/PlayerSkin.png", "Assets/Prefabs/Player.prefab" }; // 给这些资源设置寻址别名 playerBundleBuild.addressableNames = new[] { "PlayerSkin", "PlayerPrefab" };
打包完成后,加载player_resources这个Bundle时,你可以直接用bundle.LoadAsset<Texture2D>("PlayerSkin")获取皮肤资源,不用写冗长的原始路径,而且就算后续资源路径变动,只要别名不变,加载逻辑也不用改,灵活性更高。
二、能否用AssetBundleBuild[]参数的重载只构建特定资源包?
当然可以!这个重载方法的设计初衷就是让你精准控制要构建的AssetBundle集合,完全不需要构建项目中所有标记了AssetBundle名称的资源。
具体操作很简单:你只需要创建一个AssetBundleBuild数组,每个元素对应一个你想要构建的AssetBundle,设置好对应的assetNames、addressableNames和assetBundleName,然后把这个数组传给BuildPipeline.BuildAssetBundles方法,Unity就只会构建你定义的这些Bundle,不会处理其他未在数组中声明的资源。
来看一个实际的代码示例:
// 指定AssetBundle输出路径 string outputDir = "Assets/Build/AssetBundles"; // 定义要构建的特定资源包集合 var targetBuilds = new AssetBundleBuild[] { new AssetBundleBuild { assetBundleName = "ui_common", assetNames = new[] { "Assets/UI/Button.prefab", "Assets/UI/Panel.prefab" } }, new AssetBundleBuild { assetBundleName = "level1_content", assetNames = new[] { "Assets/Scenes/Level1.unity", "Assets/Models/Level1Props.fbx" } } }; // 只构建上面定义的ui_common和level1_content两个资源包 BuildPipeline.BuildAssetBundles( outputDir, targetBuilds, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows );
执行这段代码后,只会在outputDir下生成ui_common和level1_content相关的AssetBundle文件,项目中其他标记了Bundle名称的资源不会被处理。
这里提个小注意点:如果你的资源有依赖(比如Level1场景依赖了某个材质),要么把依赖资源也加入到对应的assetNames列表中,要么开启BuildAssetBundleOptions.CollectDependencies选项让Unity自动收集依赖。不过后者可能会生成额外的依赖Bundle,如果你只想严格构建指定的几个Bundle,建议显式管理所有需要的依赖资源。
内容的提问来源于stack exchange,提问作者Knight Who Says Ni

