Attributes
June 19, 2026 · View on GitHub
Custom inspector attributes for MonoBehaviour, ScriptableObject, and other serialized types. Each attribute is paired with a property drawer in Editor/Drawers/.
See the live demo: AttributesDemo.cs.
All attributes are stripped from builds via [Conditional("UNITY_EDITOR")] unless noted otherwise.
Layout
Title
Renders a bold section heading with a separator line. Use it to group related fields in the inspector.
[Title("Movement Settings")]
[SerializeField] private float speed;
MessageBox
Renders a help box above a field. Supports None, Info, Warning, and Error styles. Can be applied multiple times.
[MessageBox("Values below 0 are clamped at runtime.", MessageBoxAttribute.MessageType.Warning)]
[SerializeField] private float damage;
Label
Replaces the auto-generated field name with a custom label. An optional tooltip can be provided.
[Label("Movement speed", "Units per second.")]
[SerializeField] private float spd;
Indent
Adds extra inspector indentation to a field. Level 0 leaves the default indent unchanged.
[Indent(1)]
[SerializeField] private string nestedOption;
Numeric fields
All numeric attributes below work on int and float fields. Most include a reset button (↻) that restores the configured default.
Field
A plain numeric field with a reset button.
[Field(50)]
[SerializeField] private int maxHealth;
FieldLess
Only accepts values strictly less than the threshold. Reset value is clamped to not exceed the threshold.
[FieldLess(0, -1)]
[SerializeField] private int negativeOnly = -1;
FieldLessEqual
Only accepts values less than or equal to the threshold.
[FieldLessEqual(0, 0)]
[SerializeField] private int nonPositive;
FieldGreat
Only accepts values strictly greater than the threshold. Reset value is clamped to not fall below the threshold.
[FieldGreat(0, 10)]
[SerializeField] private int positiveOnly;
FieldGreatEqual
Only accepts values greater than or equal to the threshold.
[FieldGreatEqual(10, 10)]
[SerializeField] private int atLeastTen;
Slider
A min/max slider with optional reset and snap step. Values are clamped to the range.
[Slider(0.0f, 1.0f, 0.5f, 0.1f)] // min, max, reset, snap
[SerializeField] private float volume;
MinMaxSlider
A dual-handle range slider spanning two fields. Place it on the min field; the max field must be the next serialized field of the same type (usually hidden).
[MinMaxSlider(0, 100, 0, 100)]
[SerializeField] private int minLevel = 0;
[HideInInspector]
[SerializeField] private int maxLevel = 100;
ProgressBar
Displays a float value as a colored progress bar. Optional RGB color defaults to green.
[ProgressBar(0.0f, 100.0f, 0.3f, 0.8f, 0.3f)]
[SerializeField] private float health;
Text
Password
Masks the input and highlights invalid lengths. Default range is 6–32 characters.
[Password]
[SerializeField] private string apiKey;
[Password(minLength: 8, maxLength: 64)]
[SerializeField] private string token;
Tag
Renders Unity's tag picker for a string field. Defaults to "Untagged" when empty.
[Tag]
[SerializeField] private string targetTag;
Paths and selection
File
Adds a file-picker button to a string path field. By default paths are stored relative to the project folder.
[File]
[SerializeField] private string configPath;
[File(relativeToProject: false)]
[SerializeField] private string absolutePath;
Folder
Adds a folder-picker button to a string path field.
[Folder]
[SerializeField] private string exportDirectory;
Scene
Renders a popup of scenes in Build Settings for an int build index.
[Scene]
[SerializeField] private int menuSceneIndex;
KeyCode
Renders a KeyCode enum popup with a button to capture the next key press.
[KeyCode]
[SerializeField] private KeyCode jumpKey = KeyCode.Space;
Editability
NotEditable
Shows the field but prevents editing in all modes.
[NotEditable]
[SerializeField] private int computedScore;
OnlyEditableInEditor
Editable in Edit mode only; disabled during Play mode.
[OnlyEditableInEditor]
[SerializeField] private string editorNotes;
OnlyEditableInPlay
Editable during Play mode only; disabled in Edit mode.
[OnlyEditableInPlay]
[SerializeField] private string runtimeDebug;
Conditionals
All conditional attributes reference a bool field on the same component by name (use nameof).
EnableIf
Enables the field when the condition is true.
[SerializeField] private bool useCustomGravity;
[EnableIf(nameof(useCustomGravity))]
[SerializeField] private float gravityScale;
DisableIf
Disables the field when the condition is true.
[SerializeField] private bool lockSettings;
[DisableIf(nameof(lockSettings))]
[SerializeField] private float sensitivity;
ShowIf
Hides the field entirely when the condition is false.
[SerializeField] private bool showAdvanced;
[ShowIf(nameof(showAdvanced))]
[SerializeField] private int iterations;
HideIf
Hides the field when the condition is true.
[SerializeField] private bool hideDebugFields;
[HideIf(nameof(hideDebugFields))]
[SerializeField] private string debugInfo;
Validation
NotNull
Highlights the field in red when a reference-type value is null.
[NotNull]
[SerializeField] private GameObject playerPrefab;
AssetOnly
Restricts an object reference to project assets only (excludes scene objects). Apply to UnityEngine.Object fields.
[AssetOnly]
[SerializeField] private GameObject prefabReference;
Actions
Button
Renders an inspector button that invokes a parameterless method on the target object. The decorated string field is not displayed, it only exists to satisfy serialization. Use a separate [SerializeField] field or any serialized dummy field.
[NotEditable]
[SerializeField] private int counter;
[Button("Increase", nameof(Increase))]
[SerializeField] private string increaseButton;
[Button(nameof(Reset))]
[SerializeField] private string resetButton;
private void Increase() => counter++;
private void Reset() => counter = 0;
Inspector visibility
ShowInInspector
Marks a non-serialized field or property for display in a custom inspector. Use together with the Custom Inspector base class.
[ShowInInspector]
public int RuntimeCount => activeItems.Count;
Combining attributes
Attributes stack. A typical field might use several at once:
[Title("Combat")]
[Indent, Label("Damage multiplier"), Slider(0.0f, 5.0f, 1.0f, 0.1f), SerializeField]
private float damageMultiplier = 1.0f;