Common Pitfalls
Common Pitfalls
1. Modules Must Be Fields or Properties
Network modules must be declared as a field or property on a NetworkIdentity
.
Do not create them dynamically or store them in collections.
public class MyNetworkObject : NetworkIdentity
{
public SyncVar<int> health; // ✅ Correct
private SyncList<string> names; // ✅ Correct
// ❌ Incorrect: Do not use lists of modules
public List<SyncVar<int>> invalidList;
}
2. Editor Serialization
Modules can be serialized and shown in the Unity Editor.
Just mark them with [SerializeField]
or make them public
.
[SerializeField]
private SyncVar<int> health; // Will show up in the Inspector
public SyncList<string> names; // Also visible if public
3. Initialization: Use OnInitializeModules()
OnInitializeModules()
You can create, override, or initialize modules in the
protected virtual void OnInitializeModules()
callback.
This runs before networking sends data or assigns IDs.
protected override void OnInitializeModules()
{
health = new SyncVar<int>(100);
// Custom initialization here
}
4. Do Not Replace Modules After Spawn
Once spawned, never assign a new module instance to a field/property. Doing so will break networking or cause undefined behavior. Modules are meant to be constant after spawn.
// ❌ Don't do this after spawn:
health = new SyncVar<int>(200); // Will break networking!
5. Nesting Modules
You can nest modules—meaning a network module can use other modules like SyncVar
as fields or properties.
public class MyModule : NetworkModule
{
public SyncVar<int> score; // ✅ Allowed
}
Do not create circular dependencies. If Module A uses Module B, and Module B uses Module A, it will break. Nesting must form a tree, not a loop.
// ❌ Not allowed: Circular reference
public class ModuleA : NetworkModule
{
public ModuleB b;
}
public class ModuleB : NetworkModule
{
public ModuleA a; // This creates a cycle and will cause compiler error
}
6. No Lists of Modules
You cannot create a list or array of modules. Modules must be declared as fields or properties at compile time.
// ❌ Not allowed:
public List<SyncVar<int>> moduleList;
// ✅ Allowed:
public SyncVar<int> health;
public SyncVar<int> mana;
7. Module Events
Modules have similar events to NetworkIdentity
, such as:
OnSpawned
OnOwnerChanged
OnDespawned
You can use these for custom logic inside your modules.
public class MyModule : NetworkModule
{
protected override void OnSpawned() { /* ... */ }
protected override void OnOwnerChanged(..) { /* ... */ }
protected override void OnDespawned() { /* ... */ }
}
Last updated