> For the complete documentation index, see [llms.txt](https://postica.gitbook.io/binding-system-3/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://postica.gitbook.io/binding-system-3/pipeline/standard-modifiers.md).

# Standard Modifiers for Your Types

Getting the generic modifiers for your own types.

Seven modifiers are generic in a way Unity's serializer cannot handle. `SetValueModifier<T>` exists in the code, but Unity can only serialize a **closed** generic type, and the package cannot know in advance that your project has a `DamageInfo` struct.

So it generates them, on request.

## What gets generated

<table><thead><tr><th width="270">Modifier</th><th>What it does</th></tr></thead><tbody><tr><td><strong>Set Value</strong></td><td>Sets a value up the chain, ignoring the one it received.</td></tr><tr><td><strong>Link To Bindable</strong></td><td>Links the value to another bindable value.</td></tr><tr><td><strong>Null Check</strong></td><td>A fallback when the value is null. Reference types only; silently skipped for structs and enums.</td></tr><tr><td><strong>Value Delayer</strong></td><td>Delays the value by a number of seconds.</td></tr><tr><td><strong>Value Logger</strong></td><td>Logs the value without changing it.</td></tr><tr><td><strong>Value Events</strong></td><td>Invokes a <code>UnityEvent</code> of your type when a value is written through the binding.</td></tr><tr><td><strong>Value Conditions</strong></td><td>Reports to boolean bindings and events whether a value was written.</td></tr></tbody></table>

Converters come along too: a **Boolean Converter** (`bool` to your type) for every type, and for enums a **To Enum Converter** per common source type plus an **Enum Converter** for enum to enum.

## For a type you own

One attribute:

```csharp
using Postica.BindingSystem;

[Serializable]
[EnableStandardModifiers]
public struct DamageInfo
{
    public float amount;
    public Element element;
}
```

Or a subset, when you know you only need some:

```csharp
[EnableStandardModifiers(StandardModifierKinds.SetValue | StandardModifierKinds.Delay)]
public enum Element { None, Fire, Ice }
```

{% hint style="info" %}
Reference types always get every applicable kind regardless of the subset you ask for, because a partial set would hide the generic modifiers they already inherit. The Console says so when it happens.
{% endhint %}

## For a type you cannot edit

A Unity type, or one from a package. Add it by name in **Project Settings ▸ Binding System ▸ Configuration ▸ Standard Modifiers**, with **+ Add Type**.

<figure><img src="https://3048705056-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLUfBXR02sJ5i0MxwYbaV%2Fuploads%2FVShNrYJhYUxJ28Xlwprm%2FScreenshot%202026-09-28%20at%2017.05.46.png?alt=media&amp;token=7f442989-8aa9-4483-b2e9-cd92ec70fe2b" alt="" width="563"><figcaption><p>The Standard Modifiers manager</p></figcaption></figure>

The list is stored in the project settings, so the whole team gets the same generated set.

## The generated file

Everything lands in a single file inside the [Bindings folder](/binding-system-3/reference/settings.md#bindings-path), next to the other binding resources.

{% hint style="danger" %}
**Do not edit or rename that file.** Its class names are persisted in your scenes and prefabs. Renaming a generated class orphans every binding that used it.
{% endhint %}

<table><thead><tr><th width="380">Menu</th><th>What it does</th></tr></thead><tbody><tr><td><strong>Window ▸ Binding System ▸ Regenerate Standard Modifiers</strong></td><td>Rebuilds the file from the current set of marked types and settings.</td></tr><tr><td><strong>Window ▸ Binding System ▸ Delete Generated Standard Modifiers</strong></td><td>Removes it. Bindings that used a generated modifier will report it as missing.</td></tr></tbody></table>

Generation is controlled by the **Generate Standard Modifiers** setting, and its output path can be overridden. Both are in the same settings section.

## Why this is not automatic for everything

Generating these for every serializable type in a project would produce a file with thousands of classes, all of which Unity has to compile, load and consider when resolving a binding. The opt-in keeps the file to the types that actually need it.

## After adding a type

1. The file is regenerated and Unity recompiles.
2. The generated modifiers register themselves, at editor startup through `[RegistersGeneratedModifiers]` and at runtime through `[RuntimeInitializeOnLoadMethod]`.
3. The new modifiers appear in the bind menu for bindings of that type.

If they do not appear, check the Console: a type that cannot be serialized, or one nested in a generic, is reported rather than silently skipped.

## Related pages

* [Modifiers](/binding-system-3/pipeline/modifiers.md) and the [catalogue](/binding-system-3/pipeline/modifier-catalogue.md).
* [Custom Modifiers](/binding-system-3/reference/extending/modifiers.md): writing one from scratch instead.
* [Settings](/binding-system-3/reference/settings.md#configuration): the Standard Modifiers manager.
