> For the complete documentation index, see [llms.txt](https://docs.flatredball.com/flatredball/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.flatredball.com/flatredball/glue-reference/variables/glue-reference-createsevent.md).

# CreatesEvent

### Introduction

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.

### Example : Adding an Event to a Variable by Drag+Dropping

To add an event to a variable:

1. Expand your Screen or Entity's **Objects** folder
2. Drag+drop the variable onto the Events folder

<figure><img src="/files/eCj9p5VmnEFZ1lthytaB" alt=""><figcaption></figcaption></figure>

3. Open your project in Visual Studio
4. 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**.

   ![](/files/Gqxz9BkvhcohL291zstr)
5. Add code to the event to respond to the variable change.

### Example : Assigning Event Handlers

![](/files/sA5bUXaZpVVCFjUBoPCm)

* Before\<VariableName>Set - for example **BeforeForceVelocityXSet**
* After\<VariableName>Set - for example **AfterForceVelocityXSet**

These can be seen in generated code:

![](/files/fHmnDLk5UqURI6yzqEDq)

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:

```csharp
private void CustomInitialize()
{
    BeforeForceVelocityXSet += HandleBeforeForceVelocityXSet;
    AfterForceVelocityXSet += HandleAfterForceVelocityXSet;
}

private void HandleBeforeForceVelocityXSet(float newValue)
{
    FlatRedBall.Debugging.Debugger.Write($"About to set value to {newValue}");
}

private void HandleAfterForceVelocityXSet(object sender, EventArgs e)
{
    FlatRedBall.Debugging.Debugger.Write($"Just assigned value to {ForceVelocityX}");
}
```

### Static Events (IsSharedStatic)

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.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.flatredball.com/flatredball/glue-reference/variables/glue-reference-createsevent.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
