Appearance
Network ScriptableObjects
NetworkScriptableObject gives an authored ScriptableObject a stable identity that Fusion can replicate. Use it for shared immutable definitions such as item archetypes, damage definitions, and ability configuration—not for mutable per-player runtime state.
Create a definition
csharp
[CreateAssetMenu(menuName = "Game/Damage Definition")]
public sealed class DamageDefinition : NetworkScriptableObject
{
public int Damage;
public GameplayTag DamageType;
}Create the asset, then assign the Addressables label NetworkScriptableObject. The label is the source of truth for which assets enter the network table.
Build the identity table
Assets/Resources/NetworkScriptableObjects.redassets is imported by NetworkScriptableObjectTableImporter. Its generated main object is a NetworkScriptableObjectTableAsset; generated entries remain in Unity's import database, so the workflow does not create a second editable .asset beside every source definition.
The table stores AssetReference<NetworkScriptableObject> entries. Each reference keeps the Unity GUID and uses the appropriate static, Resources, or Addressables provider. Content initialization preloads the table before entering its ready state.
When the labels or Addressables configuration change, Unity updates the custom dependencies and reimports the source. Use Tools > RedEngine > Rebuild Network Asset Table to force a rebuild.
Reference and resolve an asset
NetworkAssetReference is a compact 128-bit network identity. It contains two 64-bit words rather than paths or loading addresses.
csharp
AssetReferenceTable<NetworkScriptableObject>? table =
NetworkScriptableObjectTableAsset.Table;
DamageDefinition? definition =
table?.Resolve<DamageDefinition>(networkReference);Direct Fusion serialization hooks encode [Networked] NetworkScriptableObject values using the asset's stable AssetGuid. If the table source is missing or invalid, serialization produces an invalid identity and content initialization reports failure instead of inventing a runtime ID.
Runtime instances
Use NetworkScriptableObject.CreateRuntimeInstance when an owner needs a mutable copy of an authored definition. The copy retains its source identity for serialization, so peers resolve the registered source asset rather than trying to register a transient (Clone) object.
Keep changing gameplay values—ammo, durability, stacks, cooldowns—in replicated actors or components. The ScriptableObject supplies the definition; Fusion state supplies the current value.
Checklist
- Derive the definition from
NetworkScriptableObject. - Create an asset and label it
NetworkScriptableObject. - Rebuild the network asset table after large Addressables changes.
- Confirm content initialization succeeds before starting travel.
- Replicate the reference or typed ScriptableObject, not an asset path.
- Release any independently loaded asset references when their owner ends.
See Assets for ContentManager, Addressables, bundles, and ordinary asset references.