Module

Abstract Scriptable Object

Description

Modules are a way to add additional functionality to each StatusEffectData. Create one by simply inheriting from the Module class and implementing the required methods. 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 for an idea of how to use them.

Make sure to checkout ModuleInstance to see how you can setup unique module data per StatusEffectData!

UniTask Support

Note that if you have UniTask in your project then the Module will use UniTasks over Coroutines. This is also included in the samples, but note that the only real difference is that there is no DisableModule abstract method because you can just wait until cancellation is requested on the token.

Abstract Methods

EnableModule

A Coroutine that is started when the StatusEffect begins.

DisableModule

A method that is invoked when the StatusEffect is stopped.

Example

using System.Collections;
using UnityEngine;
// Use StatusEffects.Modules namespace for organization.
namespace StatusEffects.Modules
{
    // Setup scriptable object in create menu.
    [CreateAssetMenu(fileName = "Damage Over Time Effect", menuName = "Status Effect Framework/Custom Effects/Damage Over Time", order = 1)]
    // This attribute will attach the module instance so 
    // that the interval time can be unique to each effect.
    [AttachModuleInstance(typeof(DamageOverTimeInstance))]
    public class DamageOverTimeEffect : CustomEffect
    {
        public override IEnumerator EnableModule<T>(T monoBehaviour, StatusEffect statusEffect, ModuleInstance moduleInstance)
        {
            // Note that for this module it uses a ModuleInstance 
            // to store a unique interval rate.
            DamageOverTimeInstance damageOverTimeInstance = moduleInstance as DamageOverTimeInstance;

            if (monoBehaviour.TryGetComponent(out ExampleEntity entity))
                // Infinite loop will be cancelled when coroutine is stopped.
                for (; ; )
                {
                    // Reduce health based on the Statu Effect base value.
                    entity.health -= statusEffect.data.baseValue;
                    // Wait for the interval before applying the damage again.
                    yield return new WaitForSeconds(damageOverTimeInstance.intervalSeconds);
                }
        }
        // You don't need to have anything in the disable method if you don't need to.
        public override void DisableModule<T>(T monoBehaviour, StatusEffect statusEffect, ModuleInstance moduleInstance) { }
}

Last updated