Crea un effetto finale e fantasma di uno sprite


15

Voglio creare un effetto finale e fantasma di uno sprite che si muove velocemente. Qualcosa di molto simile a questa immagine di Sonic (scuse di cattiva qualità, è l'unico esempio che ho potuto trovare dell'effetto che sto cercando di ottenere)

Sentiero fantasma

Tuttavia, non voglio farlo a livello di foglio sprite, per evitare di dover sostanzialmente raddoppiare (o possibilmente quadruplicare) la quantità di sprite nel mio atlante. È anche molto laborioso.

Quindi c'è un altro modo per ottenere questo effetto? Forse da qualche magia vudù shader? Sto usando Unity e 2D Toolkit, se questo aiuta.

Risposte:


21

Potresti farlo facilmente con un sistema di particelle e uno shader. Imposta il sistema di particelle per rilasciare 1 particella ogni X millisecondi con un massimo di 3 particelle. (Scegli una X in base alla distanza tra gli sprite finali). Per la particella, usa la stessa immagine dello sprite corrente del personaggio, ma con un materiale diverso. Prova alcuni shader alfa miscelati sul materiale per ottenere l'effetto desiderato sulle particelle finali.

Se vuoi diventare più elaborato, puoi regolare il numero massimo di particelle e altre impostazioni in base alla velocità corrente del personaggio.

Ecco un esempio che sono stato in grado di fare con solo 1 Quad, 1 sprite, 2 materiali e un sistema di particelle.

Ho attaccato il sistema particellare al Quad e impostato il quad per usare lo sprite Sonic. Sto usando solo le impostazioni Emissione, Colore nel corso della vita e Rendering del Sistema di particelle.

Particelle massime: 5

Spazio di simulazione: mondo

Inizio durata: 1

Velocità iniziale: 0

Colore nel corso della vita: Dissolvenza dal bianco (Alpha 255) al nero (Alpha 0)

Materiale di rendering: usando la stessa immagine dell'originale, ma con lo shader "Particles / Alpha Blended".

Sonic con effetto particellare finale


1
Funziona perfettamente. L'unica cosa che devo capire è come impostare programmaticamente il materiale sul renderer del sistema particellare in modo che corrisponda all'immagine dello sprite corrente (di nuovo, sto usando 2D Toolkit, quindi è diverso dal sistema di sprite di Unity).
Cooper,

4

Proprio come la soluzione del sistema particellare, puoi usare 2dtoolkit per creare lo stesso effetto. Aggiungi 3 oggetti di gioco per bambini al personaggio con solo uno sprite attaccato a loro. Cambia l'alfa e la colorazione secondo necessità. Quindi puoi variare le posizioni locali dello sprite in base alla velocità del personaggio:

myTransform.localPosition = characterSpeed * distanceFactor;

Salva una chiamata di disegno (rispetto alle particelle) e ti dà il controllo totale sulla diffusione dell'effetto, se vuoi farlo liscio o sfalsato.


Questo in realtà mi porta a una soluzione migliore che è molto più adatta quando si utilizza 2D Toolkit, ma sono riluttante a contrassegnare come risposta accettata. Il metodo del sistema particellare è un modo molto più "Unity generico" che è probabilmente meglio adattato per la maggior parte degli sviluppatori Unity. Pubblicherò la soluzione che ho finito per usare.
Cooper,

3

Mentre la soluzione del sistema particellare fornita da LVBen funziona, non è la soluzione più adatta quando si utilizza 2D Toolkit per i tuoi sprite. Il motivo principale è che è impossibile sincronizzare il materiale della scia fantasma nel sistema particellare con l'attuale animazione sprite del prefabbricato principale.

Ecco la soluzione amichevole Toolkit 2D che ho finito per usare.

Per il prefabbricato in cui vuoi che arrivi la scia fantasma, collega un oggetto di gioco vuoto per fungere da radice. Sotto questa radice, collega un numero qualsiasi di oggetti di gioco tk2dSprite o tk2dSpriteAnimator (a seconda che tu voglia o meno sprite animati) (ho aggiunto 4) e regola i loro valori alfa colore in modo appropriato per ottenere l'effetto fantasma / dissolvenza.

Nell'aggiornamento principale superiore

// AmountToMove is a Vector3 of the amount we will translate this gameobject.
float y = (int)AmountToMove.y == 0 ? 0 : -AmountToMove.y;
float distanceFactor = 0.05f;
for (int i = 0; i < GhostingRoot.childCount; ++i) {
    // Based on the player's current speed and movement along the x and y axes,
    // position the ghost sprites to trail behind.
    Vector3 ghostSpriteLocalPos = Vector3.Lerp(
                                      GhostingRoot.GetChild(i).localPosition,
                                      new Vector3((-CurrentSpeed * distanceFactor * i),
                                                  (y * distanceFactor * i), 0),
                                      10f * Time.deltaTime);
    // GhostingRoot is the root gameobject that's parent to the ghost sprites.
    GhostingRoot.GetChild(i).localPosition = ghostSpriteLocalPos;
    // Sync the animations.
    // _ghostSprites is a List of the tk2dSpriteAnimator ghost sprites.
    _ghostSprites[i].Play(SpriteAnimator.CurrentClip.name);
    _ghostSprites[i].Sprite.FlipX = Sprite.FlipX;
}

Questa soluzione creerà l'effetto fantasma finale mentre sincronizza le animazioni degli sprite fantasma con lo sprite principale.

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.