# StateMachineChanges

> The set of changes to a state machine reported to StateMachine.OnStateMachineChanged in a single change event.

## Definition

* **Type:** Class
* **Namespace:** [Unity.GraphToolkit.Editor](/engine/6000.7/script-reference/unity/graphtoolkit/editor.md)
* **Assembly:** UnityEditor

```csharp
public class StateMachineChanges
```

## Remarks

Access this through [StateMachineLogger.StateMachineChanges](/engine/6000.7/script-reference/unity/graphtoolkit/editor/statemachinelogger/statemachinechanges.md) inside [StateMachine.OnStateMachineChanged](/engine/6000.7/script-reference/unity/graphtoolkit/editor/statemachine/onstatemachinechanged.md). Inspect [StateMachineChanges.ChangedStates](/engine/6000.7/script-reference/unity/graphtoolkit/editor/statemachinechanges/changedstates.md), [StateMachineChanges.ChangedTransitions](/engine/6000.7/script-reference/unity/graphtoolkit/editor/statemachinechanges/changedtransitions.md), [StateMachineChanges.ChangedVariables](/engine/6000.7/script-reference/unity/graphtoolkit/editor/statemachinechanges/changedvariables.md), and [StateMachineChanges.ChangedSubgraphStates](/engine/6000.7/script-reference/unity/graphtoolkit/editor/statemachinechanges/changedsubgraphstates.md) to react to what was added or modified. Each entry's `ChangeKinds` property is a set of [ChangeKind](/engine/6000.7/script-reference/unity/graphtoolkit/editor/changekind.md) bit-flags describing the categories of change that apply.

## Examples

```csharp
public override void OnStateMachineChanged(StateMachineLogger stateMachineLogger)
{
    StateMachineChanges changes = stateMachineLogger.StateMachineChanges;

    foreach (ChangedState changedState in changes.ChangedStates)
    {
        if ((changedState.ChangeKinds & ChangeKind.Added) != 0)
            Debug.Log($"State added: {changedState.State.Title}");

        if ((changedState.ChangeKinds & ChangeKind.Topology) != 0 && !changedState.State.IsConnected)
            stateMachineLogger.LogWarning("This state has no transitions.", changedState.State);
    }

    foreach (ChangedTransition changedTransition in changes.ChangedTransitions)
    {
        // Rule and condition edits arrive as ChangeKind.Data on the owning transition.
        if ((changedTransition.ChangeKinds & ChangeKind.Data) == 0)
            continue;

        foreach (ITransitionRule rule in changedTransition.Transition.GetRules())
            Debug.Log($"Rule updated: {rule.Title}");
    }

    foreach (ChangedVariable changedVariable in changes.ChangedVariables)
        Debug.Log($"Variable changed: {changedVariable.Variable.Name} ({changedVariable.ChangeKinds})");

    foreach (ChangedSubgraphState changedSubgraphState in changes.ChangedSubgraphStates)
        Debug.Log($"Subgraph state changed: {changedSubgraphState.SubgraphState.Title}");
}
```

## Properties

| Property                                                                                                                        | Description                                                           |
| ------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- |
| [ChangedStates](/engine/6000.7/script-reference/unity/graphtoolkit/editor/statemachinechanges/changedstates.md)                 | The states that were added or modified in this change event.          |
| [ChangedSubgraphStates](/engine/6000.7/script-reference/unity/graphtoolkit/editor/statemachinechanges/changedsubgraphstates.md) | The subgraph states that were added or modified in this change event. |
| [ChangedTransitions](/engine/6000.7/script-reference/unity/graphtoolkit/editor/statemachinechanges/changedtransitions.md)       | The transitions that were added or modified in this change event.     |
| [ChangedVariables](/engine/6000.7/script-reference/unity/graphtoolkit/editor/statemachinechanges/changedvariables.md)           | The variables that were added or modified in this change event.       |
