Bir hareketli grafiğin sondaki, gölgelenme efektini oluşturma


15

Hızlı hareket eden bir hareketli grafiğin etkisi olan, izleyen, hayalet gibi bir etki yaratmak istiyorum. Sonic'in bu görüntüsüne çok benzer bir şey (kötü kalitede özür dilerim, elde etmek istediğim etkinin bulabileceğim tek örnek)

Hayalet izi

Ancak, atlasımdaki sprite miktarını esasen iki katına çıkarmak (veya muhtemelen dört katına) kaçınmak için bunu sprite sayfası düzeyinde yapmak istemiyorum. Aynı zamanda çok emek yoğundur.

Bu etkiyi elde etmenin başka bir yolu var mı? Muhtemelen biraz gölgelendirici vudu büyüsü tarafından? Eğer yardımcı olursa Unity ve 2D Toolkit kullanıyorum.

Yanıtlar:


21

Bunu bir parçacık sistemi ve bir gölgelendirici ile kolayca yapabilirsiniz. En fazla 3 parçacık ile her X milisaniyede 1 parçacık serbest bırakmak için parçacık sistemini ayarlayın. (Sondaki spriteların birbirinden ne kadar uzak olmasını istediğinize bağlı olarak bir X seçin.) Parçacık için karakterin geçerli sprite ile aynı görüntüyü, ancak farklı bir malzeme ile kullanın. Sondaki parçacıklar üzerinde istediğiniz efekti elde etmek için malzeme üzerindeki alfa karışımlı gölgelendiricilerin bir kısmını deneyin.

Daha meraklı olmak istiyorsanız, maksimum parçacık sayısını ve diğer ayarları karakterin mevcut hızına göre ayarlayabilirsiniz.

İşte sadece 1 Quad, 1 sprite, 2 malzeme ve bir parçacık sistemi ile yapabileceğim bir örnek.

Parçacık sistemini Dörtlü'ye bağladım ve dörtlüyü Sonic hareketli grafiğini kullanacak şekilde ayarladım. Parçacık Sisteminin yalnızca Emisyon, Yaşam Boyu Renk süresi ve Oluşturucu ayarlarını kullanıyorum.

Maksimum parçacıklar: 5

Simülasyon Alanı: Dünya

Ömrü Başlatma: 1

Başlama Hızı: 0

Kullanım ömrü boyunca renk: Beyaz (Alfa 255) ile Siyah (Alfa 0) arasında solma

Oluşturucu Materyali: Orijinalle aynı görüntüyü kullanarak, ancak "Parçacıklar / Alfa Karışımlı" gölgelendiriciyle.

Sondaki Parçacık Etkili Sonik


1
Bu mükemmel çalışıyor. Çalışmam gereken tek şey, parçacık sistemi oluşturucusundaki malzemeyi geçerli hareketli grafik görüntüsüyle eşleşecek şekilde nasıl ayarlayacağınızdır (yine, Unity'nin hareketli sisteminden farklı olarak 2D Araç Seti kullanıyorum).
Cooper

4

Parçacık sistemi çözümü gibi, aynı efekti oluşturmak için 2dtoolkit'i kullanabilirsiniz. Sadece bir sprite ile karaktere 3 çocuk oyun nesnesi ekleyin. Alfa ve renklendirmeyi gerektiği gibi değiştirin. Ardından karakterin hızına bağlı olarak hareketli grafiğin yerel konumlarını değiştirebilirsiniz:

myTransform.localPosition = characterSpeed * distanceFactor;

Bir çizim çağrısını kaydeder (parçacıklara kıyasla) ve pürüzsüz veya kademeli yapmak istiyorsanız, efektin yayılması üzerinde size tam kontrol sağlar.


Bu aslında beni 2D Araç Seti kullanırken çok daha uygun bir çözüme götürüyor, ancak kabul edilen cevap olarak işaretlemek konusunda isteksizim. Parçacık sistemi yöntemi, çoğu Unity geliştiricisi için muhtemelen en uygun olan çok daha "Birlik jenerik" yöntemidir. Sonunda kullandığım çözümü yayınlayacağım.
Cooper

3

LVBen tarafından sağlanan parçacık sistemi çözümü çalışırken, spritelarınız için 2D Toolkit kullanırken en uygun çözüm değildir. Birincil neden, parçacık sistemindeki hayalet izi malzemesini ana prefabrinin mevcut hareketli grafiğine senkronize etmenin imkansız olmasıdır.

İşte sonunda kullandığım 2D Toolkit dostu çözüm.

Hayalet izinin gelmesini istediğiniz prefabrik için, kök olarak davranması için boş bir oyun nesnesi ekleyin. Bu kök altında, herhangi bir sayıda tk2dSprite veya tk2dSpriteAnimator ekleyin (hareketli sprite ister veya istemiyorsanız) oyun nesneleri (4 ekledim) ve gölgelenme / solma efektini elde etmek için renk alfa değerlerini uygun şekilde ayarlayın.

Üst ebeveyn Güncellemesinde

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

Bu çözüm, hayalet spriteların animasyonlarını ana hareketli grafikle senkronize ederken sondaki gölgeleme efekti yaratacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.