Создайте эффект призрачного спрайта

15

Я хочу создать эффект призрачного призрака спрайта, который быстро движется. Что-то очень похожее на этот образ Соника (извинения плохого качества, это единственный пример, который я смог найти в эффекте, которого я ищу)

Призрачная тропа

Однако я не хочу делать это на уровне листов спрайтов, чтобы избежать необходимости удваивать (или, возможно, в четыре раза) количество спрайтов в моем атласе. Это также очень трудоемко.

Так есть ли другой способ добиться этого эффекта? Возможно, с помощью какого-нибудь шейдерного колдовства? Я использую Unity и 2D Toolkit, если это поможет.

бондарь
источник

Ответы:

21

Вы можете легко сделать это с помощью системы частиц и шейдера. Настройте систему частиц для выпуска 1 частицы каждые X миллисекунд с максимум 3 частицами. (Выберите X в зависимости от того, насколько далеко вы хотите оставить конечные спрайты.) Для частицы используйте то же изображение, что и текущий спрайт персонажа, но с другим материалом. Попробуйте альфа-смешанные шейдеры на материале, чтобы получить эффект, который вы хотите, на конечных частиц.

Если вы хотите стать более любопытным, вы можете настроить максимальное количество частиц и другие параметры в зависимости от текущей скорости персонажа.

Вот пример, который я смог сделать только с 1 квадом, 1 спрайтом, 2 материалами и системой частиц.

Я прикрепил систему частиц к Quad и настроил использование Sonic Sprite. Я использую только настройки Emission, Color over Life и Renderer системы частиц.

Макс частиц: 5

Симулятор Космоса: Мир

Время жизни старта: 1

Стартовая скорость: 0

Цвет в течение жизни: исчезает от белого (альфа 255) до черного (альфа 0)

Материал рендерера: Использование того же изображения, что и в оригинале, но с шейдером "Particles / Alpha Blended".

Sonic with Trailing Particle Effect

LVBen
источник
1
Это работает отлично. Единственное, что мне нужно выяснить, это как программно настроить материал в системе визуализации частиц, чтобы он соответствовал текущему изображению спрайта (опять же, я использую 2D Toolkit, поэтому он отличается от спрайтовой системы Unity).
Купер
4

Как и в случае с системой частиц, вы можете использовать 2dtoolkit для создания того же эффекта. Добавьте 3 игрового объекта к персонажу с прикрепленным к нему только спрайтом. Измените альфа и цвет по мере необходимости. Затем вы можете изменять локальные позиции спрайта в зависимости от скорости персонажа:

myTransform.localPosition = characterSpeed * distanceFactor;

Он сохраняет вызов отрисовки (по сравнению с частицами) и дает вам полный контроль над распространением эффекта, если вы хотите сделать его сглаженным или в шахматном порядке.

АБР
источник
Это фактически привело меня к лучшему решению, которое намного больше подходит при использовании 2D Toolkit, но я не хочу отмечать как принятый ответ. Метод системы частиц является гораздо более «универсальным» способом, который, вероятно, лучше всего подходит для большинства разработчиков Unity. Я опубликую решение, которое я использовал в конечном итоге.
Купер
3

Хотя решение системы частиц, предоставляемое LVBen, действительно работает, это не самое подходящее решение при использовании 2D Toolkit для ваших спрайтов. Основная причина в том, что невозможно синхронизировать материал следов призраков в системе частиц с текущей спрайтовой анимацией основного префаба.

Вот дружественное решение 2D Toolkit, которое я в итоге использовал.

Для префаба, в котором вы хотите, чтобы появился призрачный след, прикрепите к нему пустой игровой объект, который будет действовать как корень. Под этим корнем прикрепите любое количество игровых объектов tk2dSprite или tk2dSpriteAnimator (в зависимости от того, хотите ли вы анимированные спрайты или нет) (я добавил 4) и отрегулируйте их цветовые альфа-значения в зависимости от ситуации, чтобы добиться эффекта ореола / затухания.

В верхнем родительском обновлении

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

Это решение создаст эффект конечного двоения при синхронизации анимации призрачных спрайтов с основным спрайтом.

бондарь
источник