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,DurationoIntensity). - MaxDuration: durata massima se lo stack avviene sulla durata.
- Tags: lista di
GameTagche 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,FindEffectseHasEffect. - Gestione dei
GameTagattivi attraverso la proprietàTags. - Sistema di immunità basato su
GameTag: quelli registrati inImmunitiesimpediscono 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 aMaxDuration.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();
}
}