You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询AssetBundleBuild.addressableNames与assetNames的区别及特定资源包构建方法

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:05:39