CreatesEvent
Last updated
Last updated
Variables in entities and screens can have events which are raised whenever the variable is changed. These events can be used to broadcast changes (such as in the case of INotifyPropertyChanged) or to perform other custom logic such as updating a health bar when health changes.
To add an event to a variable:
Expand your Screen or Entity's Objects folder
Drag+drop the variable onto the Events folder
Open your project in Visual Studio
Look for the Events file for your Screen or Entity, which will be named ScreenOrEntityName.Events.cs. In this example, the file is named FanRight.Events.cs.
Add code to the event to respond to the variable change.
Before<VariableName>Set - for example BeforeForceVelocityXSet
After<VariableName>Set - for example AfterForceVelocityXSet
These can be seen in generated code:
Notice that the Before event is an Action which takes a float. This argument contains the new value, enabling the handler to decide how to respond to the new value before it has been assigned. These can be handled in custom code. For example, the following code could be used to print out that the variable is being assigned:
If a variable's IsShared is set to true, then the variable is generated as a static variable in code. This means that its events must also be static. If a variable with IsShared set to true generates an event, the following occurs:
All events are static
If the variable is drag+dropped onto the Events node, the event handler method is generated as static
A static constructor is added to generated code for the owning Screen/Entity. This may conflict with static constructors if you have added one in custom code
The event is subscribed in the static constructor, so it will always be active
The event is never unsubscribed. By contrast instance events are unsubscribed when the owning Screen/Entity are destroyed
As mentioned above, if your Screen/Entity already has a static constructor, adding a static event in the FRB editor will result in a conflicting static constructor.
Also note that even if an event is raised for a Screen/Entity, that does not mean that the content has been loaded for that entity. The content will only have been loaded if an instance of the Screen/Entity has been created, or if the content has been loaded explicitly through a LoadStaticContent method call.