Sistema di StatusEffects

December 6, 2025 · View on GitHub

Questa cartella raccoglie gli script utili per applicare e gestire effetti di stato sugli oggetti di gioco. Ogni effetto viene descritto da uno StatusEffectData e gestito a runtime tramite StatusEffectManager.

Classi principali

StatusEffectData

ScriptableObject astratto da cui derivare i vari effetti. Espone:

  • IsVisible: se l'effetto deve essere mostrato in UI.
  • Order: priorità di visualizzazione.
  • StackType: modalità di accumulo (None, Duration o Intensity).
  • MaxDuration: durata massima se lo stack avviene sulla durata.
  • Tags: lista di GameTag che identifica la tipologia dell'effetto.

È necessario implementare tre metodi:

  • ApplyEffect(RuntimeStatusEffect effect) – logica all'applicazione.
  • UpdateEffect(RuntimeStatusEffect effect) – eseguito ad ogni aggiornamento.
  • EndEffect(RuntimeStatusEffect effect) – chiamato alla fine o rimozione.

RuntimeStatusEffect

Struttura serializzabile che mantiene le informazioni di un effetto applicato: ID, Source, Target, riferimento allo StatusEffectData, durata e intensità attuali.

StatusEffectManager

MonoBehaviour che gestisce la lista di effetti attivi. Fornisce:

  • ApplyEffect(GameObject source, GameObject target, StatusEffectData data, int amount) – aggiunge o incrementa un effetto.
  • UpdateEffect() – aggiorna tutti gli effetti in lista e riduce la durata se necessario.
  • RemoveEffect(RuntimeStatusEffect effect, bool launchEndEvent = false) – rimuove un singolo effetto.
  • RemoveAllEffects(string id, bool launchEndEvent = false) – rimuove tutti gli effetti con un determinato ID.
  • Metodi di utilità come FindEffect, FindEffects e HasEffect.
  • Gestione dei GameTag attivi attraverso la proprietà Tags.
  • Sistema di immunità basato su GameTag: quelli registrati in Immunities impediscono l'applicazione degli effetti con tag corrispondenti.

Il manager espone anche tre StatusEffectEventAsset opzionali per ricevere notifiche all'applicazione, aggiornamento ed esaurimento di un effetto.

StatusEffectDataManager

MonoBehaviour che eredita da GenericDataManager e carica automaticamente tutti gli asset StatusEffectData da una cartella. Costruisce:

  • un dizionario per ricerca per ID (TryGetEffect(string id, out StatusEffectData data) / GetEffect(string id)),
  • una lista filtrata di effetti visibili (GetVisibleEffects()),
  • una mappa tag → lista di effetti (GetEffectsWithTag(GameTag tag)), utile per interrogazioni rapide basate su categorie o immunità.

Può essere inserito in scena o prefab come gli altri manager e inizializza le strutture in OnPostAwake.

StatusEffectEventAsset

Evento basato su GameEventAsset<RuntimeStatusEffect> utilizzabile per collegare logiche esterne (ad esempio UI o feedback sonori).

StatusEffectStackType

Enum che definisce il tipo di accumulo dell'effetto:

  • None – nessuno stack.
  • Duration – accumula la durata fino a MaxDuration.
  • Intensity – incrementa l'intensità.

StatusEffectType

Enum per classificare l'effetto (Positive, Negative, Neutral).

Esempio di utilizzo

public class PlayerEffects : MonoBehaviour
{
    [SerializeField] private StatusEffectManager manager;
    [SerializeField] private StatusEffectData poisonData;

    void ApplyPoison()
    {
        manager.ApplyEffect(gameObject, gameObject, poisonData, 5); // 5 turni
    }

    void Update()
    {
        manager.UpdateEffect();
    }
}