Créer un effet fantôme de fuite d'un sprite

15

Je veux créer un effet fantôme traînant d'un sprite qui se déplace rapidement. Quelque chose de très similaire à cette image de Sonic (excuses de mauvaise qualité, c'est le seul exemple que j'ai pu trouver de l'effet que je cherche à obtenir)

Sentier fantôme

Cependant, je ne veux pas faire cela au niveau de la feuille de sprites, pour éviter d'avoir à doubler (ou peut-être quadrupler) la quantité de sprites dans mon atlas. C'est aussi très exigeant en main-d'œuvre.

Existe-t-il un autre moyen d'obtenir cet effet? Peut-être par une magie vaudou shader? J'utilise Unity et 2D Toolkit, si cela aide.

Tonnelier
la source

Réponses:

21

Vous pouvez facilement le faire avec un système de particules et un shader. Configurez le système de particules pour libérer 1 particule toutes les X millisecondes avec un maximum de 3 particules. (Choisissez un X en fonction de la distance à laquelle vous souhaitez que les sprites de fin soient.) Pour la particule, utilisez la même image que le sprite actuel du personnage, mais avec un matériau différent. Essayez certains des shaders alpha mélangés sur le matériau pour obtenir l'effet que vous souhaitez sur les particules de fuite.

Si vous voulez devenir plus sophistiqué, vous pouvez ajuster le nombre maximum de particules et d'autres paramètres en fonction de la vitesse actuelle du personnage.

Voici un exemple que j'ai pu faire avec seulement 1 Quad, 1 sprite, 2 matériaux et un système de particules.

J'ai attaché le système de particules au Quad et réglé le quad pour utiliser le sprite Sonic. J'utilise uniquement les paramètres d'émission, de couleur sur la durée de vie et de rendu du système de particules.

Max particules: 5

Espace de simulation: Monde

Début de la durée de vie: 1

Vitesse de démarrage: 0

Couleur au cours de la vie: fondu du blanc (Alpha 255) au noir (Alpha 0)

Matériau de rendu: utilise la même image que l'original, mais avec le shader "Particles / Alpha Blended".

Sonic avec effet de particule de fuite

LVBen
la source
1
Cela fonctionne parfaitement. La seule chose que je dois déterminer est de savoir comment définir par programme le matériau sur le rendu du système de particules pour qu'il corresponde à l'image de sprite actuelle (encore une fois, j'utilise 2D Toolkit, il est donc différent du système de sprite d'Unity).
Cooper
4

Tout comme la solution de système de particules, vous pouvez utiliser 2dtoolkit pour créer le même effet. Ajoutez 3 objets de jeu pour enfants au personnage avec seulement un sprite attaché à eux. Modifiez l'alpha et la coloration selon vos besoins. Ensuite, vous pouvez varier les positions locales du sprite en fonction de la vitesse du personnage:

myTransform.localPosition = characterSpeed * distanceFactor;

Il enregistre un appel de dessin (par rapport aux particules) et vous donne un contrôle total sur la propagation de l'effet, si vous voulez le faire en douceur ou en quinconce.

ADB
la source
Cela m'amène en fait à une meilleure solution qui est beaucoup plus adaptée lors de l'utilisation de 2D Toolkit, mais je suis réticent à marquer comme réponse acceptée. La méthode du système de particules est une méthode beaucoup plus "générique Unity" qui est probablement la mieux adaptée à la plupart des développeurs Unity. Je publierai la solution que j'ai finalement utilisée.
Cooper
3

Bien que la solution de système de particules fournie par LVBen fonctionne, ce n'est pas la solution la mieux adaptée lorsque vous utilisez 2D Toolkit pour vos sprites. La raison principale est qu'il est impossible de synchroniser le matériau de traînée fantôme dans le système de particules avec l'animation sprite actuelle du préfabriqué principal.

Voici la solution conviviale 2D Toolkit que j'ai finalement utilisée.

Pour le préfabriqué dans lequel vous souhaitez que la piste fantôme provienne, attachez-y un objet de jeu vide pour agir comme racine. Sous cette racine, attachez n'importe quel nombre d'objets de jeu tk2dSprite ou tk2dSpriteAnimator (selon que vous souhaitiez des sprites animés ou non) (j'ai ajouté 4) et ajustez leurs valeurs alpha de couleur selon les besoins pour obtenir l'effet fantôme / décoloration.

Dans le parent supérieur Mise à jour

// 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;
}

Cette solution créera l'effet de fantôme de fin tout en synchronisant les animations des sprites fantômes avec le sprite principal.

Tonnelier
la source