Створіть ефект спрайту, що вимальовується


15

Я хочу створити зворотний ефект, подібний до ефекту спрайту, який швидко рухається. Щось дуже схоже на цей образ Sonic (вибачення поганої якості, це єдиний приклад, який я міг знайти ефекту, якого я прагну досягти)

Світ привидів

Однак я не хочу робити це на рівні аркуша спрайту, щоб уникнути необхідності суттєво подвоїти (або, можливо, вчетверо) кількість спрайтів в моєму атласі. Це також дуже трудомістко.

То чи є інший спосіб досягти цього ефекту? Можливо, якимось шейдером магія вуду? Я використовую Unity та 2D Toolkit, якщо це допомагає.

Відповіді:


21

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

Якщо ви хочете отримати більш фантазії, ви можете налаштувати максимум # частинок та інші налаштування залежно від поточної швидкості персонажа.

Ось приклад, що мені вдалося виконати лише 1 Quad, 1 спрайт, 2 матеріали та систему частинок.

Я приєднав систему частинок до Quad і встановив quad для використання спрайту Sonic. Я використовую лише налаштування "Емісія", "Колір за час життя" та "Рендер" у системі частинок.

Максимальні частинки: 5

Імітаційний простір: Світ

Початок життя: 1

Швидкість запуску: 0

Колір за весь час життя: Зникає від білого (Альфа 255) до чорного (Альфа 0)

Матеріал візуалізації: Використовуючи те саме зображення, що і оригінальне, але з шейдером "Частинки / Альфа змішані".

Sonic з ефектом зачіпних частинок


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

Це рішення створить зачіпаючий ефект привидів, синхронізуючи анімації привидів-привидів з головним спрайтом.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.