Buat efek trailing, ghosting dari sprite

15

Saya ingin membuat efek trailing, berbayang seperti sprite yang bergerak cepat. Sesuatu yang sangat mirip dengan gambar Sonic ini (permintaan maaf dengan kualitas buruk, itu satu-satunya contoh yang dapat saya temukan dari efek yang ingin saya capai)

Jejak hantu

Namun, saya tidak ingin melakukan ini pada tingkat sprite sheet, untuk menghindari keharusan menggandakan (atau mungkin melipatgandakan) jumlah sprite di atlas saya. Ini juga sangat padat karya.

Jadi apakah ada cara lain untuk mencapai efek ini? Mungkin oleh beberapa sihir vader shader? Saya menggunakan Unity dan 2D Toolkit, jika itu membantu.

Cooper
sumber

Jawaban:

21

Anda dapat dengan mudah melakukan ini dengan sistem partikel dan shader. Atur sistem partikel untuk melepaskan 1 partikel setiap X milidetik dengan maksimal 3 partikel. (Pilih X berdasarkan seberapa jauh Anda menginginkan sprite trailing menjadi.) Untuk partikel, gunakan gambar yang sama dengan sprite karakter saat ini, tetapi dengan bahan yang berbeda. Cobalah beberapa shader alpha yang dicampur pada bahan untuk mendapatkan efek yang Anda inginkan pada partikel yang tertinggal.

Jika Anda ingin mendapatkan pelawak, Anda dapat menyesuaikan jumlah partikel maksimal dan pengaturan lain berdasarkan kecepatan karakter saat ini.

Berikut adalah contoh yang dapat saya lakukan hanya dengan 1 Quad, 1 sprite, 2 bahan, dan sistem partikel.

Saya memasang sistem partikel ke Quad dan mengatur quad untuk menggunakan sprite Sonic. Saya hanya menggunakan pengaturan Emisi, Warna seumur hidup, dan Renderer dari Sistem Partikel.

Partikel maks: 5

Ruang Simulasi: Dunia

Mulai Seumur Hidup: 1

Mulai Kecepatan: 0

Warna seumur hidup: Memudar dari Putih (Alpha 255) ke Hitam (Alpha 0)

Bahan Renderer: Menggunakan gambar yang sama seperti aslinya, tetapi dengan shader "Partikel / Alpha Blended".

Sonic dengan Efek Trailing Partikel

LVBen
sumber
1
Ini bekerja dengan sempurna. Satu-satunya hal yang perlu saya selesaikan adalah bagaimana secara terprogram mengatur materi pada renderer sistem partikel agar sesuai dengan gambar sprite saat ini (sekali lagi, saya menggunakan 2D Toolkit sehingga berbeda dari sistem sprite Unity).
Cooper
4

Sama seperti solusi sistem partikel, Anda dapat menggunakan 2dtoolkit untuk membuat efek yang sama. Tambahkan 3 objek game anak ke karakter dengan hanya sprite yang melekat padanya. Ubah alfa dan pewarnaan sesuai kebutuhan. Kemudian Anda dapat memvariasikan posisi lokal sprite tergantung pada kecepatan karakter:

myTransform.localPosition = characterSpeed * distanceFactor;

Menghemat panggilan draw (dibandingkan dengan partikel) dan memberi Anda kontrol total pada penyebaran efek, jika Anda ingin melakukannya dengan mulus atau terhuyung-huyung.

ADB
sumber
Ini sebenarnya menuntun saya ke solusi yang lebih baik yang jauh lebih cocok ketika menggunakan 2D Toolkit, tapi saya enggan menandai sebagai jawaban yang diterima. Metode sistem partikel adalah cara yang jauh lebih "Unity generic" yang mungkin paling cocok untuk sebagian besar pengembang Unity. Saya akan memposting solusi yang akhirnya saya gunakan.
Cooper
3

Sementara solusi sistem partikel yang disediakan oleh LVBen berfungsi, itu bukan solusi yang paling cocok saat menggunakan 2D Toolkit untuk sprite Anda. Alasan utamanya adalah bahwa tidak mungkin untuk menyinkronkan bahan jejak hantu dalam sistem partikel dengan animasi sprite saat ini dari cetakan awal.

Inilah solusi ramah 2D Toolkit yang akhirnya saya gunakan.

Untuk cetakan di mana Anda ingin jejak hantu berasal, lampirkan objek permainan kosong untuk bertindak sebagai root. Di bawah root ini, lampirkan sejumlah tk2dSprite atau tk2dSpriteAnimator (tergantung jika Anda ingin sprite animasi atau tidak) objek game (saya menambahkan 4) dan sesuaikan nilai warna alfa mereka yang sesuai untuk mencapai efek ghosting / fading away.

Di Pembaruan induk atas

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

Solusi ini akan membuat efek ghosting tertinggal sementara menyinkronkan animasi sprite hantu dengan sprite utama.

Cooper
sumber