Stwórz efekt ducha na ducha

15

Chcę stworzyć efekt ducha, który porusza się szybko. Coś bardzo podobnego do tego obrazu Sonica (przeprosiny o złej jakości, to jedyny przykład, jaki mogłem znaleźć efekt, który chcę osiągnąć)

Ślad duchów

Jednak nie chcę tego robić na poziomie arkusza duszków, aby uniknąć konieczności dwukrotnego (lub czterokrotnego) zwiększenia liczby duszków w moim atlasie. Jest to również bardzo pracochłonne.

Czy jest więc jakiś inny sposób na osiągnięcie tego efektu? Może przez jakąś magię voodoo shadera? Używam Unity i 2D Toolkit, jeśli to pomaga.

Bednarz
źródło

Odpowiedzi:

21

Możesz to łatwo zrobić za pomocą układu cząstek i modułu cieniującego. Skonfiguruj system cząsteczek, aby uwolnić 1 cząsteczkę co X milisekund z maksymalnie 3 cząsteczkami. (Wybierz X w zależności od tego, jak daleko od siebie mają być duszki końcowe). W przypadku cząstki użyj tego samego obrazu co bieżący duszek, ale z innym materiałem. Wypróbuj niektóre z mieszanych alfa shaderów na materiale, aby uzyskać pożądany efekt na końcowych cząsteczkach.

Jeśli chcesz stać się bardziej wyrafinowany, możesz dostosować maksymalną liczbę cząstek i inne ustawienia w oparciu o aktualną prędkość postaci.

Oto przykład, który mogłem zrobić tylko z 1 Quad, 1 sprite, 2 materiałami i układem cząstek.

Podłączyłem układ cząsteczek do Quadu i ustawiłem quada, aby używał duszka Sonic. Używam tylko ustawień Emisja, Kolor w czasie życia i Renderer systemu cząstek.

Maksymalna ilość cząstek: 5

Simulation Space: World

Rozpocznij żywotność: 1

Prędkość początkowa: 0

Kolor przez cały okres użytkowania: Zanikanie od bieli (Alpha 255) do czerni (Alpha 0)

Materiał renderujący: Użycie tego samego obrazu co oryginał, ale z shaderem „Particles / Alpha Blended”.

Sonic z efektem końcowych cząstek

LVBen
źródło
1
To działa idealnie. Jedyne, co muszę wypracować, to jak programowo ustawić materiał w module renderującym system cząstek, aby pasował do bieżącego obrazu duszka (ponownie używam Zestawu narzędzi 2D, więc różni się on od duszka systemu Unity).
Cooper
4

Podobnie jak rozwiązanie systemu cząstek, możesz użyć 2dtoolkit, aby uzyskać ten sam efekt. Dodaj do gry 3 obiekt dla dzieci z dołączonym tylko duchem. Zmień alfabet i kolor w razie potrzeby. Następnie możesz zmieniać lokalne pozycje duszka w zależności od prędkości postaci:

myTransform.localPosition = characterSpeed * distanceFactor;

Oszczędza wywołanie losowania (w porównaniu do cząstek) i daje całkowitą kontrolę nad rozprzestrzenianiem się efektu, jeśli chcesz zrobić to płynnie lub naprzemiennie.

ADB
źródło
To faktycznie doprowadziło mnie do lepszego rozwiązania, które jest znacznie bardziej odpowiednie podczas korzystania z zestawu narzędzi 2D, ale niechętnie zaznaczam jako zaakceptowaną odpowiedź. Metoda systemu cząstek jest znacznie bardziej „ogólna” z Unity, która prawdopodobnie najlepiej pasuje do większości programistów Unity. Opublikuję rozwiązanie, z którego korzystałem.
Cooper
3

Chociaż rozwiązanie systemu cząsteczek dostarczone przez LVBen działa, nie jest to najlepsze rozwiązanie, gdy używasz zestawu narzędzi 2D dla twoich duszków. Głównym powodem jest to, że nie można zsynchronizować materiału śladu duchów w układzie cząstek z bieżącą animacją duszka głównego prefabrykatu.

Oto przyjazne rozwiązanie 2D Toolkit, z którego korzystałem.

Do prefabrykatu, z którego ma pochodzić ślad duchów, dołącz do niego pusty obiekt gry, który będzie działał jako rdzeń. Pod tym korzeniem dołącz dowolną liczbę tk2dSprite lub tk2dSpriteAnimator (w zależności od tego, czy chcesz animowane duszki), lub nie, obiekty gry (dodałem 4) i odpowiednio dostosuj ich wartości alfa kolorów, aby uzyskać efekt zjawy / zanikania.

W górnej aktualizacji rodzica

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

To rozwiązanie stworzy efekt ducha końcowego, synchronizując animacje duszków z duchem głównym.

Bednarz
źródło