✨ Status Effects System — Overview¶
A modular, deterministic buff / debuff / CC runtime pipeline for Unity.
The Status Effects system provides a predictable way to:
- apply and manage effects
- control stacking and lifecycle
- scale potency and duration
- support UI, integration, and multiplayer authority
It is modular, runtime-safe, and netcode-agnostic.
Important: This system does not define gameplay balance or rules. It provides a pipeline for executing them.
🧠 Mental Model¶
The system is built around a simple separation of concerns:
- Effects → define behaviour
- Controller → manages lifecycle and rules
- Modifiers → influence incoming math
- UI / Integration → reflect or extend behaviour
Effects describe what happens. The controller decides when and how it happens.
🧠 Usage Guidance¶
- Add
StatusEffectControllerto a GameObject - Create an effect (definition or direct instance)
- Apply it through the controller
ctrl.ApplyStatus(
new PoisonStatus(5f, 10f),
StatusContext.FromAbility("firebolt")
);
Or:
ctrl.ApplyOrRefresh(
() => new PoisonStatus(5f, 10f),
StatusContext.FromAbility("firebolt")
);
🧩 What Lives Here¶
| Layer | Responsibility | Required |
|---|---|---|
| Core | Lifecycle, stacking, authority, ticking | ✔ |
| Effects | Behaviour implementations | ❌ |
| Definitions | ScriptableObject authoring | ❌ |
| Abstractions | Contracts and extension seams | ❌ |
| Authority | Mutation gating | ❌ |
| UI | Visualisation | ❌ |
| Integration | External system bridges | ❌ |
| Timing | Time source implementations | ❌ |
| UnityIntegration | Optimised math resolution | ❌ |
Only the controller is required.
📦 Folder Overview¶
- Core → runtime pipeline (controller, registry, lifecycle)
-
Effects
-
Definitions → authoring assets
- Implementations → runtime behaviour
- Abstractions → contracts, ids, metadata, modifiers
- Authority → mutation gating
- Auras → optional area-based modifiers
- Integration → external system hooks (Health, etc.)
- System → shared helpers and global hooks
- Timing → time source implementations
- UnityIntegration → component-based math optimisation
- UI → optional presentation layer
🧠 Usage Guidance¶
Controller owns lifecycle¶
StatusEffectController is the single source of truth.
It controls:
- apply / refresh / remove
- stacking rules
- ticking and expiry
- authority checks
Effects are behaviour only¶
Effects:
- respond to lifecycle calls
- may hold internal state
- do not control system rules
Modifiers influence, not control¶
Receiver-side modifiers (IStatusPotency, IStatusResistance, IStatusImmunity):
- adjust incoming effects
- do not mutate effect state directly
Time is injectable¶
Status ticking is driven by ITimeSource, not Unity globals.
Supports:
- slow motion
- pause control
- per-entity time behaviour
Authority is optional¶
When enabled, mutation and ticking are gated via IStatusAuthority.
⚠️ Important Notes¶
- Effects must be new instances per application
requireAuthority = truewithout a binder results in no-op behaviour- UI reflects state — it does not drive gameplay
- Definitions must not contain runtime logic
- Some integrations are optional and may no-op safely
🚫 Not for Production Use¶
- UI layer is optional and intended for presentation only
- Sample integrations and helpers are not required for runtime use
- Definitions are authoring assets and should not contain gameplay logic
🔗 Related Documentation¶
- Core — runtime lifecycle and controller
- Abstractions — contracts and extension seams
- Effects — definitions and implementations
- Authority — multiplayer gating
- Auras — area-based modifiers
- Integration — external system hooks
- UI — visual components
- Timing — time source system