sh1’s diary

プログラミング、読んだ本、資格試験、ゲームとか私を記録するところ

Unity Shuriken を使って FF5 の黒魔法フレアっぽいエフェクトをやる

最初に成果物を提出。こんな感じになりました。それっぽく見えるとうれしいですが、ROM を解析して厳密にやったわけではないです。

f:id:shikaku_sh:20200428093517g:plain:w500
ボコボコボコってなるのが好き

データの詳細は、記事の最後に今回のサンプルデータを公開しているので、そちらをご確認ください。

実装したことの流れ

  1. ランダムに火の玉が中心に集まってくるエフェクト
  2. ランダムに爆発するエフェクト
  3. (大きく中心で爆発するエフェクト)
  4. (火の玉が中心から外に飛び出してくるエフェクト)

Unity Shuriken を使ってエフェクトを作成します。うまくすると、1のエフェクトから2のエフェクトに Sub Emitter で派生できるのかもしれないですが、私は別々のエフェクトとして実装して、単純にディレイタイムで表示のタイミングを調整しました。

Sub Emitter は、ひとつひとつのパーティクルから次のパーティクルへと派生するための機能です。なので、「花火」が典型的な派生例になっています。フレアは1が全部終わったら2がスタート、2が全部終わったら3が……というようなシーケンスの流れになっているので、Sub Emitter がベストな選択、とはいえないだろうと(私は)思っています。

なお、利用した画像は、雑に用意したものです。それっぽいだけです。(RGB が基本色すぎると思います)

f:id:shikaku_sh:20200428094206p:plain
フレアっぽければいい

1と2ができれば3と4は作れるだろうということで、省略してしまいました。

ポイントと思われるところはつぎくらい。

位置調整用の親 Prefab

エフェクトを別々に生成するのは手間だったので、Empty Object にまとめて、プレハブ化しておくことにしました。プレハブを生成した瞬間にエフェクトを表示して自動的に破棄して終了。シンプル。

エフェクトが終了したらプレハブを自動的に(素直に)破棄する仕様は以下のような感じに。

public class ParticleGroup : MonoBehaviour
{
    private ParticleSystem[] _Particles;

    private int _Count => _Particles?.Length ?? 0;

    private bool _IsInitialized = false;

    // Start is called before the first frame update
    void Start()
    {
        _Particles = GetComponentsInChildren<ParticleSystem>();

        _IsInitialized = true;
    }

    // Update is called once per frame
    void Update()
    {
        if (_Count <= 0 && _IsInitialized)
        {
            Destroy(gameObject);
        }

        bool canDestroy = _Particles.All(p => p == null || p.IsAlive(true) == false);

        if (canDestroy)
        {
            Destroy(gameObject);
        }
    }
}

Empty ObjectParticleGroupスクリプトを追加して、子要素の ParticleSystem がすべて nullIsAlivefalse になると要素を破棄します。

このあたりはオブジェクトを使い回すためにプール化しておくなど、考えることがあるみたいです。

フレアの material

f:id:shikaku_sh:20200428094656p:plain:w400
Material として設定

Sprites として読み込んだ画像を MaterialUnlit/Transparent に設定。これをエフェクトの Renderer の Material プロパティに設定しているという組み合わせです。パラパラ漫画のようにアニメーションするのは Texture Sheet Animation の設定で Tiles プロパティの x を「8」にしています。つまり、8枚に分割してください、という設定です。

パラメーターの設定

「中心に集まる」エフェクトと、「爆発する」エフェクトの2つがあります。一例だとこんなの。

f:id:shikaku_sh:20200428094527p:plain
構成

「中心に集まる」エフェクト

f:id:shikaku_sh:20200428094404p:plain:w360 f:id:shikaku_sh:20200428094423p:plain:w360

「爆発する」エフェクト

f:id:shikaku_sh:20200428094456p:plain:w360 f:id:shikaku_sh:20200428094505p:plain:w360

サンプル

今回のサンプルは GitHub に公開しています。

参考