--- description: How to manage prefab and scene addressables with FishNet. --- # Addressables Both addressable scenes and prefabs work over the network. ## Scene addressables Scene addressables utilize Fish-Networking's [Custom Scene Processors](scene-management/custom-scene-processors/). With a few overrides you can implement addressable scenes using [this guide](scene-management/custom-scene-processors/addressables.md). ## Prefab addressables To work reliably each addressables package must have a unique ushort Id, between 1 and 65535. **Never** use 0 as the Id, as the preconfigured SpawnablePrefabs use this Id. You may assign your addressable Ids however you like, for instance using a dictionary that tracks your addressable names with Ids. Registering addressable prefabs with Fish-Networking is easy once each package has been given an Id. The code below shows one way of loading and unloading addressable prefabs for the network. ```csharp /// /// Reference to your NetworkManager. /// private NetworkManager _networkManager => InstanceFinder.NetworkManager; /// /// Used to load and unload addressables in async. /// private AsyncOperationHandle> _asyncHandle; /// /// Loads an addressables package by string. /// You can load whichever way you prefer, this is merely an example. /// public IEnumerator LoadAddressables(string addressablesPackage) { /* FishNet uses an Id to identify addressable packages * over the network. You can set the Id to whatever, however * you like. A very simple way however is to use our GetStableHash * helper methods to return a unique key for the package name. * This does require the package names to be unique. */ ushort id = addressablesPackage.GetStableHash16(); /* GetPrefabObjects will return the prefab * collection to use for Id. Passing in true * will create the collection if needed. */ SinglePrefabObjects spawnablePrefabs = (SinglePrefabObjects)_networkManager.GetPrefabObjects(id, true); /* Get a cache to store networkObject references in from our helper object pool. * This is not required, you can make a new list if you like. But if you * prefer to prevent allocations FishNet has the really helpful CollectionCaches * and ObjectCaches, as well Resettable versions of each. */ List cache = CollectionCaches.RetrieveList(); /* Load addressables normally. If the object is a NetworkObject prefab * then add it to our cache! */ _asyncHandle = Addressables.LoadAssetsAsync(addressablesPackage, addressable => { NetworkObject nob = addressable.GetComponent(); if (nob != null) cache.Add(nob); }); yield return _asyncHandle; /* Add the cached references to spawnablePrefabs. You could skip * caching entirely and just add them as they are read in our LoadAssetsAsync loop * but this saves more performance by adding them all at once. */ spawnablePrefabs.AddObjects(cache); // Optionally(obviously, do it) store the collection cache for use later. We really don't like garbage! CollectionCaches.Store(cache); } /// /// Loads an addressables package by string. /// public void UnoadAddressables(string addressablesPackage) { // Get the Id the same was as we did for loading. ushort id = addressablesPackage.GetStableHash16(); /* Once again get the prefab collection for the Id and * clear it so that there are no references of the objects * in memory. */ SinglePrefabObjects spawnablePrefabs = (SinglePrefabObjects)_networkManager.GetPrefabObjects(id, true); spawnablePrefabs.Clear(); // You may now release your addressables! Addressables.Release(_asyncHandle); } ``` {% hint style="warning" %} When using addressables be sure the client has addressable bundles loaded before the server sends spawn messages for the objects; the above example demonstrates loading addressables.\ \ For example: if you are going to load a scene with addressables ensure the client has already loaded the addressables bundle for that scene before the server is to add the client to the scene. {% endhint %}