Script Execution Control
Overview
There are two main Attributes for controlling the relative script order in which Fusion executes SimulationBehaviour
and NetworkBehaviour
components:
[OrderBefore]
[OrderAfter]
These affect the script execution order of FixedUpdateNetwork()
and Render()
in SimulationBehaviour
and NetworkBehaviour
components.
C#
[OrderBefore(typeof(MyOtherSimulationBehaviour)]
[OrderAfter(typeof(NetworkTransform), typeof(MyOtherNetworkBehaviour))]
public class MySimulationBehaviour : SimulationBehaviour {
}
Relative Order of Unity and Fusion Callbacks
- FixedUpdate()
- FixedUpdateNetwork()
- Update()
- Render()
- LateUpdate()
Update() and LateUpdate()
As an alternative to using [OrderBefore]
and [OrderAfter]
to control Render()
order, you may also make use of the standard Unity callbacks:
Update()
will always execute BEFORE all FusionRender()
calls for all component types.LateUpdate()
will always execute AFTER all FusionRender()
calls for all component types.
Unity Script Execution Order can be used as usual to control the script order for Update()
and LateUpdate()
, as these are regular Unity callbacks.
NOTE: Unity's FixedUpdate()
in most cases should not be used, as it is completely independent of Fusion's timing mechanisms and the rate at which Fusion calls Physics.Simulate()
.
Sorting process
During recompiles and on game startup, All SimulationBehaviours
are found in the assemblies and are sorted alphabetically with the exception of NetworkPhysicsSimulation3D
and NetworkPhysicsSimulation2D
.
First each SimulationBehaviour
is then checked for [OrderBefore]
or [OrderAfter]
attributes; if neither exist on the class, then parent classes will be searched recursively and the attributes of the closest parent with either of these attributes will be used. Then all SimulationBehaviours
are then sorted to generate a deterministic order which satisfies all OrderBefore
and OrderAfter
attributes.
N.B.: Any number of [OrderBefore]
and [OrderAfter]
types can be specified. If they create a conflict that cannot be resolved, the Debug Log will show an error indicating which scripts are in conflict.
NetworkPhysicsSimulation3D
and NetworkPhysicsSimulation2D
are initially sorted to be after all other alphabetized SimulationBehaviours
. To execute scripts after either of these two, they will have to explicit be instructed to do so using the [OrderAfter]
attribute.
C#
[OrderAfter(typeof(NetworkPhysicsSimulation3D)]
Inheritance
If a derived Behaviour has no [OrderBefore]
or [OrderAfter]
attributes, it will inherit ordering from its base class by default. However, if the derived class declares either an [OrderBefore] or [OrderAfter] attribute, then all order attributes on the parent class will be entirely ignored.
N.B.: Ordering attributes on base and derived classes therefore are NOT additive.
Simulation Inclusion
The [SimulationBehaviour]
attribute can be used to restrict execution of FixedUpdateNetwork()
to:
- only specific stages (
Resimulation
orForward
); and / or, - specific peer modes (
Server
/Host
/Client
).
C#
[SimulationBehaviour(
Stages = SimulationStages.Forward,
Modes = SimulationModes.Server | SimulationModes.Host
)]
Fusion Script Execution Inspector
The Fusion Script Order window can be opened from the menu Fusion > Windows > Script Execution Inspector
. This will show in which order and in simulation stages the various scripts will be executed.
N.B.: Script execution is controlled by these attributes:
[SimulationBehaviour]
[OrderBefore]
[OrderAfter]
The Fusion Script Execution Inspector
window is only for visualizing the results of these attributes. Attributes must be altered in scripts to make changes.