Crea un efecto fantasma final de un sprite


15

Quiero crear un efecto fantasma final de un sprite que se mueve rápido. Algo muy similar a esta imagen de Sonic (disculpas de mala calidad, es el único ejemplo que pude encontrar del efecto que estoy buscando lograr)

Rastro fantasma

Sin embargo, no quiero hacer esto en el nivel de la hoja de sprites, para evitar tener que duplicar (o posiblemente cuadruplicar) la cantidad de sprites en mi atlas. También es muy laborioso.

Entonces, ¿hay alguna otra manera de lograr este efecto? ¿Posiblemente por algún shader vudú mágico? Estoy usando Unity y 2D Toolkit, si eso ayuda.

Respuestas:


21

Podrías hacer esto fácilmente con un sistema de partículas y un sombreador. Configure el sistema de partículas para liberar 1 partícula cada X milisegundos con un máximo de 3 partículas. (Elija una X según la distancia que desee que estén los sprites finales). Para la partícula, use la misma imagen que el sprite actual del personaje, pero con un material diferente. Pruebe algunos de los sombreadores alfa mezclados en el material para obtener el efecto que desea en las partículas finales.

Si quieres ser más elegante, puedes ajustar el número máximo de partículas y otras configuraciones según la velocidad actual del personaje.

Aquí hay un ejemplo que pude hacer con solo 1 Quad, 1 sprite, 2 materiales y un sistema de partículas.

Adjunté el sistema de partículas al Quad y configuré el quad para usar el sprite de Sonic. Estoy usando solo la configuración de Emisión, Color durante el tiempo de vida y Renderer del Sistema de partículas.

Partículas máximas: 5

Espacio de simulación: mundo

Inicio de la vida: 1

Velocidad de inicio: 0

Color durante la vida útil: desvanecimiento de blanco (alfa 255) a negro (alfa 0)

Material de renderizado: Usando la misma imagen que el original, pero con el sombreador "Particles / Alpha Blended".

Sonic con efecto de partículas arrastradas


1
Esto funciona perfectamente Lo único que necesito resolver es cómo configurar programáticamente el material en el renderizador del sistema de partículas para que coincida con la imagen del sprite actual (de nuevo, estoy usando el kit de herramientas 2D, por lo que es diferente del sistema de sprites de Unity).
Cooper

4

Al igual que la solución del sistema de partículas, puede usar 2dtoolkit para crear el mismo efecto. Agregue 3 objetos de juego para niños al personaje con solo un sprite adjunto. Cambia el alfa y el color según sea necesario. Luego puedes variar las posiciones locales del sprite dependiendo de la velocidad del personaje:

myTransform.localPosition = characterSpeed * distanceFactor;

Ahorra una llamada de sorteo (en comparación con las partículas) y le da un control total sobre la propagación del efecto, si desea hacerlo de manera suave o escalonada.


En realidad, esto me lleva a una mejor solución que es mucho más adecuada cuando utilizo 2D Toolkit, pero soy reacio a marcar como la respuesta aceptada. El método del sistema de partículas es una forma mucho más "genérica de Unity" que probablemente sea más adecuada para la mayoría de los desarrolladores de Unity. Publicaré la solución que terminé usando.
Cooper

3

Si bien la solución del sistema de partículas proporcionada por LVBen funciona, no es la solución más adecuada cuando se utiliza 2D Toolkit para sus sprites. La razón principal es que es imposible sincronizar el material del rastro fantasma en el sistema de partículas con la animación de sprites actual del prefabricado principal.

Aquí está la solución amigable 2D Toolkit que terminé usando.

Para la prefabricación en la que desea que provenga el rastro fantasma, adjunte un objeto de juego vacío para que actúe como raíz. Debajo de esta raíz, adjunte cualquier número de objetos de juego tk2dSprite o tk2dSpriteAnimator (dependiendo de si desea sprites animados o no) (agregué 4) y ajuste sus valores alfa de color según corresponda para lograr el efecto fantasma / desvanecimiento.

En la actualización principal superior

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

Esta solución creará el efecto fantasma final mientras sincroniza las animaciones de los sprites fantasmas con el sprite principal.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.