Come modificare le coppie chiave-valore (come un dizionario) nella finestra di ispezione di Unity?


18

Ho un sistema di incantesimi che sto creando, il principio è il seguente:

  • Ogni incantesimo è un prefabbricato autonomo. Contiene uno script con alcune proprietà (danno base, durata ...) che possono essere modificate nella finestra di ispezione.
  • Ho un'enumerazione di incantesimi che elenca tutti i possibili incantesimi nel codice, che viene utilizzato nella logica di gioco
  • Quando voglio lanciare un incantesimo, devo essere in grado di ottenere il prefabbricato di questo incantesimo per istanziarlo e leggere le sue informazioni
  • Ogni attore (che si tratti di giocatori o nemici) deve avere un elenco di possibili animazioni per gli incantesimi

I problemi con come sto cercando di implementare sono:

  • Per elencare le animazioni di ogni attore ho potuto usare un Dictionary<Spell, Animation>, ma i dizionari non sono supportati dall'ispettore, il che rende difficile modificare facilmente più tipi di attori.
  • Ho bisogno di un modo per accedere facilmente a un incantesimo prefabbricato dall'enum corrispondente. Anche qui potrei usare un dizionario, ma posso solo fare riferimento ai prefabbricati nell'ispettore, non nel codice, il che significa che non sarei in grado di riempire questo dizionario

Sto cercando un modo per associare facilmente i miei incantesimi agli incantesimi e alle animazioni corrispondenti


1
Posso suggerire di cambiare il titolo di questa domanda per fare riferimento a come ottenere un comportamento simile a un dizionario (mappatura di coppie chiave-valore) nella finestra di ispezione di Unity? Ciò contribuirà a rendere la domanda più facile da trovare per altri utenti che hanno o sono alla ricerca di idee per risolvere questo tipo di problema. Anche se questo caso specifico riguarda gli incantesimi, le stesse tecniche sono più ampiamente applicabili.
DMGregory

@DM Non conosco Unity, ma il tuo ragionamento generale sembra ragionevole. Sii audace e modifica; i rollback sono economici.
Anko,

Risposte:


24

Un modo rapido per ottenere coppie chiave-valore nella finestra di ispezione di Unity consiste nel definire una classe di voci serializzabile e quindi utilizzare un array o Elenco <> di esse. per esempio...

public class SpellAnimationMap : ScriptableObject
{
   [System.Serializable]
   public class SpellAnimationEntry
   {
       public Spell spell;
       public AnimationClip animation;
   }

   public SpellAnimationEntry[] spellAnimations;    
}

Automaticamente, questo ti darà un elenco ridimensionabile nella finestra di ispezione in cui puoi inserire la chiave e il valore, senza bisogno di scrivere una finestra di ispezione personalizzata.

Il risultato è simile al seguente:

ispettore auto-generato

(Un trucco: se la classe di voce serializzata contiene un campo "Nome", quella stringa verrà visualizzata al posto delle intestazioni insignificanti "Elemento 0". Utile se si dispone di dati più complessi che si desidera poter navigare in modo efficiente.)

Rendendolo uno ScriptableObject ti consente di trattarlo come un Asset condiviso tra tipi / istanze di entità che richiedono lo stesso set di animazioni, evitando il sovraccarico di duplicare l'elenco per ciascuno. (Altre classi tendono ad essere serializzate per istanza in Unity). Per seguire questa strada, dovrai aggiungere un piccolo script dell'editor che ti consenta di crearne istanze nella cartella Risorse .


Modifica: ora è ancora più semplice: puoi semplicemente aggiungere questo attributo sopra ScriptableObject:

[CreateAssetMenu(fileName = "fileName.asset", menuName = "Some Folder/Menu Label")]

Ciò inserisce ScriptableObject nel menu Crea, in questo modo: Schermata che mostra un menu Crea personalizzato in Unity


Puoi facoltativamente rendere l'array privato e serializzato in modo che venga ancora visualizzato nella finestra di ispezione, ma puoi aggiungere un dizionario pubblico (o un dizionario privato con un metodo GetAnimation (incantesimo) pubblico) che i clienti possano utilizzare per ricerche più efficienti. Nel suo metodo OnEnable (), SpellAnimationMap può scorrere attraverso il suo array popolato da inspector per creare questo dizionario una volta, condividendo nuovamente il vantaggio tra tutte le istanze client. (Si noti che OnEnable () viene anche chiamato nell'editor quando l'asset viene creato per la prima volta, quindi assicurarsi di verificare che l'array sia non null prima di provare a leggerlo)

Infine, puoi aggiungere tutto questo tipo di dati della voce di cui hai bisogno. Potrebbe includere anche il prefabbricato, ad esempio, o qualsiasi numero di altri bit di dati che si desidera collegare alla chiave ortografica.

È anche possibile scrivere ispettori personalizzati per popolare direttamente i campi del dizionario <,>, ma l'impressione che ottengo è che è complicato funzionare senza problemi.


Esattamente quello che mi è successo di fare mentre aspettavo una risposta, quindi accetterò questo
Malharhak,

0

Leggi la spiegazione fornita da @DMGregory

A chi piace esempi:

public class SpellHandler : ScriptableObject
{
    public Spell[] keys;
    public Animation[] values;

    private Dictionary<Spell, Animation> dic;

    void Awake()
    {
        int length = keys.Length;
        this.dic= new Dictionary<Spell, Animation>(length);
        for (int i = 0; i < length; i++)
        {
            this.dic.Add(keys[i], values[i]);
        } 
    }    
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.