スプライトのゴースト効果を作成します


15

高速で移動するスプライトの効果を、ゴーストのように引きずります。ソニックのこのイメージに非常によく似たもの(質の悪い謝罪、それは私が達成しようとしている効果の唯一の例です)

ゴーストトレイル

ただし、アトラス内のスプライトの量を本質的に2倍(または4倍)にする必要がないように、スプライトシートレベルでこれを行いたくありません。また、非常に労働集約的です。

この効果を達成する他の方法はありますか?おそらくシェーダーブードゥー教の魔法によるものですか?Unityと2D Toolkitを使用しています(それが役立つ場合)。

回答:


21

これは、パーティクルシステムとシェーダーを使用して簡単に実行できます。Xミリ秒ごとに1つの粒子を放出し、最大3つの粒子を放出するように粒子システムをセットアップします。(トレーリングスプライトの距離に基づいてXを選択します。)パーティクルには、キャラクターの現在のスプライトと同じイメージを使用しますが、マテリアルは異なります。マテリアルでアルファブレンドシェーダーをいくつか試して、後続のパーティクルに必要な効果を取得します。

もっとおしゃれにしたい場合は、キャラクターの現在の速度に基づいてパーティクルの最大数やその他の設定を調整できます。

これは、クワッドが1つ、スプライトが1つ、マテリアルが2つ、パーティクルシステムだけで実行できる例です。

パーティクルシステムをQuadに接続し、Sonicスプライトを使用するようにQuadを設定しました。パーティクルシステムのエミッション、寿命にわたる色、およびレンダラー設定のみを使用しています。

最大粒子:5

シミュレーションスペース:ワールド

ライフタイムの開始:1

開始速度:0

寿命にわたる色:白(Alpha 255)から黒(Alpha 0)へのフェード

レンダラーマテリアル:オリジナルと同じイメージを使用しますが、「Particles / Alpha Blended」シェーダーを使用します。

後尾パーティクル効果を持つソニック


1
これは完全に機能します。私が解決する必要があるのは、パーティクルシステムレンダラーのマテリアルを現在のスプライトイメージに合わせてプログラムで設定する方法だけです(ここでも、Unityのスプライトシステムとは異なる2D Toolkitを使用しています)。
クーパー

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

このソリューションは、ゴーストスプライトのアニメーションをメインスプライトと同期させながら、後続のゴースト効果を作成します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.