Come evitare gli spaghetti nell'animatore?


9

Sto lavorando con le animazioni in Unity e finora ne ho fatte solo quattro (su giù a sinistra e a destra) e la mia finestra di animazione sembra seguire ... inserisci qui la descrizione dell'immagine

Il problema è che se mi stavo muovendo verso l'alto voglio che l'eroe rimanga a guardare verso l'alto non andare in "folle in folle" (o comunque abbia iniziato), ma ciò significa che ho 4 posizioni inattive ... e ognuna di esse può passare a Su, Giù , Sinistra o Destra e vanno esponenzialmente con ogni azione aggiuntiva ...

Il che mi fa sentire come se stessi facendo qualcosa di sbagliato ...

Esiste un modo migliore per effettuare transizioni tra diverse azioni?


Sto provando a farlo da molto tempo. Purtroppo, la mia conclusione è che non puoi proprio. L'animatore si trasforma SEMPRE in una ragnatela di spaghetti e dobbiamo conviverci. Dai un'occhiata a questo video, ma aiuta youtube.com/…
Nevermind l'

Risposte:


9

Puoi risolvere questo tipo di problema con BlendTrees (in generale la sua saggia idea è quella di fare affidamento sugli alberi di fusione). L'albero di fusione è una specie di stato multi-animazione che in base a uno o più parametri (float) decide quale delle animazioni che contiene è attualmente attiva (o in alternativa l'animazione risultante può essere una miscela di più animazioni). Anche quando le animazioni non vengono mescolate, ma scambiate, lo scambio avviene a metà animazione (ovvero se l'animazione "in uscita" è al 35%, quella nuova viene riprodotta dal 35% in avanti). Dall'esterno tutto questo è nascosto come se fosse uno stato semplice / singolo.

Ad esempio, hai un albero misto con 8 animazioni sprite (inattivo con 4 direzioni principali e 4 diagonali). Ci sono 2 parametri in questo albero di fusione: "orizzontale" e "verticale". E in base a questi 2 parametri l'albero di fusione deciderà quale animazione riprodurre. In base al parametro "orizzontale" l'albero di fusione sceglierà tra l'animazione sinistra / destra e il parametro "verticale" deciderà l'animazione in alto / in basso. Quindi quando combinati avrai tutte e 8 le animazioni con le diagonali (è la stessa idea che sta dietro joypad / joystick).

inserisci qui la descrizione dell'immagine

È un po 'confuso, quindi, anche se StackExchange non ama i collegamenti, collegherò un breve video di esempio che ho realizzato. Notare la parte in alto a destra dello schermo. I punti grigi sono gli "stati" / animazioni e quello attivo è quello che si chiude al punto rosso. Come detto all'inizio, può essere ancora più complesso e ogni animazione ha un'influenza / forza basata sulla sua distanza dal punto rosso, risultante in una fusione tra diverse animazioni.

Dall'esterno è solo uno stato (albero misto) e quando applichi lo stesso concetto per camminare e attaccare avrai solo 3 stati collegati.

Gli alberi di fusione vengono creati facendo clic con il pulsante destro del mouse su un'area animata vuota Crea stato -> Da nuovo albero di fusione. Da lì è tutto nell'ispettore. Con l'albero di fusione selezionato è possibile selezionare il tipo di albero di fusione (1D, 2D, ecc.), Aggiungere animazioni, posizionarle (in relazione ai valori dei parametri) e selezionare i parametri di controllo.

Se vuoi maggiori informazioni su Blend Trees, ecco i video di Unity - Unite 2016 e Unity Tutorials .


2

Il problema qui è che stai cercando di legare tutto insieme invece di usare un grilletto per passare da un minimo all'altro. Dovresti scegliere l'animazione inattiva usando un tipo if-else o switch-case di condizionale. Ho fatto un diagramma che sembra molto più ordinato (supponiamo che uno di questi sia il caso predefinito):

inserisci qui la descrizione dell'immagine

Informazioni addizionali:

Dai un'occhiata ai Parametri di animazione su come impostare i parametri che l'animatore deve riconoscere, Macchine a stati per combinare le animazioni, Comportamenti a macchina a stati su come controllare le variabili che hai impostato.


Ciao John, ma come posso farlo? Perché dovrei usare il grilletto per passare da un minimo all'altro o passare da un minimo all'altro? come scegliere l'animazione inattiva usando if else? Anche nel diagramma perché dovrei spostarmi in idleleft e poi a sinistra e non a sinistra e andare in idleleft in attesa della prossima azione, o questo dovrebbe essere il contrario?
Matas Vaitkevicius,

@MatasVaitkevicius È possibile impostare e controllare le variabili alla fine o all'inizio delle animazioni. Puoi creare un'animazione vuota che non fa altro che controllare il caso e quindi reindirizzarlo alla parte successiva o ricavarne uno strato di astrazione. Ho incluso alcuni link ai manuali per maggiori informazioni.
John Hamilton,

Quindi, come posso fare se altrimenti con parametri che cambierebbero le transizioni? Non c'è esempio che tutti i meccanismi che hai collegato
eseguano la

@MatasVaitkevicius Dovresti davvero cercare prima un po ': gamedev.stackexchange.com/questions/103611/…
John Hamilton

Ma è così che l'ho fatto. innesca il fuoco dell'azione e avvia l'animazione, quindi diventa inattiva per quella direzione ... Ora quello che stai dicendo (se ti capisco correttamente) che potrei dopo l'animazione invece di andare inattivo per quella direzione andare a cambiare meccanismo che sceglierei il minimo appropriato per me ... ma non ho visto un meccanismo del genere da nessuna parte, potresti copiarlo nella tua risposta per favore ....
Matas Vaitkevicius,
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.