Loading multiple catalogs each using builtin shaders

I am trying to load multiple catalogs at runtime that each contain prefabs using different materials with the standard shader.
Thus each catalog references once or multiple asset bundles + the 'unitybuiltinshaders' asset bundle.

The problem with this is that loading the first catalog works fine, but subsequent ones cannot be loaded because 'The AssetBundle 'path to builtin shaders bundle' can't be loaded because another AssetBundle with the same files is already loaded.', which makes sense because I'm using the standard shader in all of my bundles, but I'm not really sure how to go about this.

I'm aware of the fact that each of my asset has a dependency to the builtin shaders bundle but I'd like for a way to manually built the shaders bundle and then manually set it as a dependency to my addressables groups but I have absolutely no clue how to do this.


I guess you need to create separate group and put there all your shaders. Then another groups will not contains these shaders.

Yes that's what I would do if I was able to build all my addressables from a single project, the problem is that I want users to be able to create mods by creating their own addressables builds and then share them online.

Ideally, I'd like to find a way to build my addressables with the unitybuiltinshaders bundle but only load it if not already loaded.

As a temporary solution, I downloaded the unity builtin shaders manually and included in my project & renamed the ones I need so that the shaders are directly included in the regular asset bundle and not a separate one, but I don't think it is an optimal solution.

1 Like

I found a workaround for this: Before building the addressable asset bundles, I (programatically) create a new default addressable group (cloning the settings for the old one). I do this because the name of the unitybuiltinshaders bundle (in Addressables package version 1.6.2) is created from the GUID of the default group. When creating a new default group with a new GUID, the names will get unique.

I'm actually working on this as well... The issue with this for me is that the shaders bundle is over 2MB and the asset I'm trying to download is only 400KB. So I want to actually share this shaderbundle among all my assets which all have different catalogs, and they will all point to the same path on the server.

My current approach is:
-Set up object to be uploaded in Unity (in a standalone item uploader project)
-Programatically add the asset as an Addressable to a group.
-Upload the files to a server.
-Load in the Addressable via remote catalog in a the main game project.

All of my objects use the same shader (Autodesk) with the same maps and settings, so I really want to load this in once. Is there a way to preload the shared roomassets_unitybuiltinshaders.bundle in my main app? Or ideally just have the shader I need only in the main project, disregarding the shader dependency in the bundle?

My workaround for this was to save the texture maps to a custom script, then set the shader to null before building the addressables and uploading to the bucket.

I have my client handle all the shader setup and texture assignment on its own. This seems to work pretty well. You do need to have a shared script between the uploader and the client, but I'm able to do that in this setup.

1 Like

I found a clumsy workaround. You can prevent Unity from building the default shader bundle by altering the BuildScriptPackedMode.cs. If you comment out line 726:
buildTasks.Add(new CreateBuiltInShadersBundle(builtinShaderBundleName));
Then the defaultshader bundle won't be built. As long as you have one catalog that loads the default shader bundle it works - at least in my usecase.
You'll also need to add your altered build script to the addressable settings buildscripts.

1 Like

Can you provide sample code of loading multiple catalog? In my case if I release first catalog and load second it works but I am loosing all dependencies. is there any way to load multiple catalog?