> For the complete documentation index, see [llms.txt](https://maraudical.gitbook.io/status-effects-framework/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://maraudical.gitbook.io/status-effects-framework/1.2.0/type-specifics/classes/customeffect.md).

# CustomEffect

### Description

Custom Effects are a way to add additional functionality to each [StatusEffectData](/status-effects-framework/1.2.0/type-specifics/classes/statuseffectdata.md). Truthfully anything can be done with them as they are just an inheritable abstract class with a coroutine, allowing for unlimited functionality. It is **highly recommended** to take a look at the [samples](https://github.com/maraudical/StatusEffectsFramework-Unity/tree/main/Samples) for an idea of how to use them.

### Abstract Methods

<table data-header-hidden data-full-width="false"><thead><tr><th width="224"></th><th></th></tr></thead><tbody><tr><td>Effect</td><td>A <a href="https://docs.unity3d.com/ScriptReference/Coroutine.html">Coroutine</a> that is started when the <a href="/pages/OpUFQnv9JKaTU0cxnlHw">StatusEffect</a> begins.</td></tr><tr><td>EffectEnd</td><td>A method that is invoked when the <a href="/pages/OpUFQnv9JKaTU0cxnlHw">StatusEffect</a> is stopped.</td></tr></tbody></table>

### Example

```csharp
using System.Collections;
using UnityEngine;
// Use StatusEffects.Custom namespace for organization.
namespace StatusEffects.Custom
{
    // Setup scriptable object in create menu.
    [CreateAssetMenu(fileName = "Poison Effect", menuName = "Custom Effects/Poison", order = 1)]
    public class PoisonEffect : CustomEffect
    {
        // Unique value for this effect example
        public float intervalSeconds = 1f;

        public override IEnumerator Effect<T>(T monoBehaviour, StatusEffect statusEffect)
        {
            // Use your own character/entity class for this
            Entity entity = monoBehaviour.GetComponent<Entity>();
            
            for (; ; )
            {
                // Use your own TakeDamage() logic. This will 
                // occur every interval until the effect ends.
                entity.TakeDamage(statusEffect.data.baseValue);
                yield return new WaitForSeconds(intervalSeconds);
            }
        }

        public override void EffectEnd<T>(T monoBehaviour, StatusEffect statusEffect) { }
    }
}
```
