Crie um efeito fantasma à direita de um sprite

15

Quero criar um efeito fantasma de um sprite que esteja se movendo rapidamente. Algo muito parecido com esta imagem do Sonic (desculpas de má qualidade, é o único exemplo que pude encontrar do efeito que estou procurando alcançar)

Trilha fantasma

No entanto, não quero fazer isso no nível da folha de sprite, para evitar ter que essencialmente duplicar (ou possivelmente quadruplicar) a quantidade de sprites no meu atlas. Também é muito trabalhoso.

Então, existe outra maneira de conseguir esse efeito? Possivelmente por alguma magia shader vodu? Estou usando o Unity e o 2D Toolkit, se isso ajudar.

Tanoeiro
fonte

Respostas:

21

Você poderia fazer isso facilmente com um sistema de partículas e um shader. Configure o sistema de partículas para liberar 1 partícula a cada X milissegundos com um máximo de 3 partículas. (Escolha um X com base na distância que você deseja que os sprites finais estejam.) Para a partícula, use a mesma imagem que o sprite atual do personagem, mas com um material diferente. Experimente alguns dos shaders alfa misturados no material para obter o efeito desejado nas partículas finais.

Se quiser ficar mais chique, você pode ajustar o número máximo de partículas e outras configurações com base na velocidade atual do personagem.

Aqui está um exemplo que eu pude fazer com apenas 1 Quad, 1 sprite, 2 materiais e um sistema de partículas.

Anexei o sistema de partículas ao Quad e ajustei o Quad para usar o sprite Sonic. Estou usando apenas as configurações de Emissão, Cor ao longo da vida e Renderizador do Sistema de partículas.

Partículas máximas: 5

Espaço de Simulação: Mundo

Tempo de vida inicial: 1

Velocidade de início: 0

Cor durante a vida útil: desbotamento de branco (alfa 255) para preto (alfa 0)

Material do renderizador: usando a mesma imagem do original, mas com o sombreador "Particles / Alpha Blended".

Sonic com efeito de partículas à direita

LVBen
fonte
11
Isso funciona perfeitamente. A única coisa que preciso resolver é como definir programaticamente o material no renderizador do sistema de partículas para corresponder à imagem atual do sprite (novamente, estou usando o 2D Toolkit para que seja diferente do sistema de sprite do Unity).
Cooper
4

Assim como a solução do sistema de partículas, você pode usar o 2dtoolkit para criar o mesmo efeito. Adicione 3 objetos de jogo infantil ao personagem com apenas um sprite anexado a eles. Mude o alfa e a coloração, conforme necessário. Depois, você pode variar as posições locais do sprite, dependendo da velocidade do personagem:

myTransform.localPosition = characterSpeed * distanceFactor;

Ele salva uma chamada de empate (em comparação com as partículas) e fornece controle total sobre a propagação do efeito, se você quiser fazê-lo suave ou alternado.

ADB
fonte
Na verdade, isso me levou a uma solução melhor que é muito mais adequada ao usar o 2D Toolkit, mas reluto em marcar como a resposta aceita. O método do sistema de partículas é muito mais "genérico do Unity", provavelmente o mais adequado para a maioria dos desenvolvedores do Unity. Vou postar a solução que acabei usando.
Cooper
3

Embora a solução do sistema de partículas fornecida pela LVBen funcione, ela não é a solução mais adequada ao usar o 2D Toolkit para seus sprites. A principal razão é que é impossível sincronizar o material da trilha fantasma no sistema de partículas com a animação atual do sprite da pré-fabricada principal.

Aqui está a solução amigável do 2D Toolkit que acabei usando.

Para a pré-fabricada na qual você deseja que a trilha fantasma venha, anexe um objeto de jogo vazio a ele para atuar como raiz. Sob essa raiz, anexe qualquer número de objetos de jogo tk2dSprite ou tk2dSpriteAnimator (dependendo se você deseja ou não sprites animados) (acrescentei 4) e ajuste seus valores de alfa de cor conforme apropriado para obter o efeito fantasma / desvanecimento.

Na atualização principal do pai

// 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 solução criará o efeito fantasma à direita enquanto sincroniza as animações dos sprites fantasmas com o sprite principal.

Tanoeiro
fonte