ModuleInstances can be attached to Modules so that unique data can be selected per StatusEffectData. Create one by simply inheriting from the ModuleInstance class.
You do not need to add these to the create menu! As long as it is attached to a Module using the attribute it will be created automatically.
As an example, say you needed a VFX prefab to be instantiated on each effect. Instead of having to create a unique VFXModule for each prefab that you need, just add the variables you need in the ModuleInstance and attach it to the Module using the AttachModuleInstance attribute.
Now, every time you add a module to a StatusEffectData, it will instantiate those values for that effect making it so you only need to create one VFXModule scriptable object with any constant values and unique instance values will be displayed in the specific StatusEffectData.
Example
usingUnityEngine;// Use StatusEffects.Modules namespace for organization.namespaceStatusEffects.Modules{publicclassVFXInstance:ModuleInstance {publicGameObject prefab; }}
Example module to attach to
usingSystem.Collections;usingUnityEngine;// Use StatusEffects.Modules namespace for organization.namespaceStatusEffects.Modules{ [CreateAssetMenu(fileName ="VFX Module", menuName ="Status Effect Framework/Modules/VFX", order =1)] // This attribute will attach the module instance so // that it can be created for each StatusEffectData. [AttachModuleInstance(typeof(VFXInstance))]publicclassVFXModule:Module { public override IEnumerator EnableModule<T>(T monoBehaviour, StatusEffect statusEffect, ModuleInstance moduleInstance)
{VFXInstance VFXInstance = moduleInstance asVFXInstance; // Give the vfx the name of the prefab so it can be queried laterInstantiate(VFXInstance.prefab, monoBehaviour.transform).name = VFXInstance.prefab.name;yield break; } public override void DisableModule<T>(T monoBehaviour, StatusEffect statusEffect, ModuleInstance moduleInstance)
{ VFXInstance VFXInstance = moduleInstance as VFXInstance; // Find the VFX by name. Transform VFXTransform = monoBehaviour.transform.Find(VFXInstance.prefab.name); if (!VFXTransform) return; GameObject VFXGameObject = VFXTransform.gameObject; // Attempt to stop the particle system. if (VFXGameObject.TryGetComponent(out ParticleSystem particleSystem)) particleSystem.Stop(); VFXTransform.SetParent(null); // Destroy after a wait so that particles have time to fade out Destroy(VFXGameObject, 5); } }}