最初に成果物を提出。こんな感じになりました。それっぽく見えるとうれしいですが、ROM を解析して厳密にやったわけではないです。
データの詳細は、記事の最後に今回のサンプルデータを公開しているので、そちらをご確認ください。
実装したことの流れ
- ランダムに火の玉が中心に集まってくるエフェクト
- ランダムに爆発するエフェクト
- (大きく中心で爆発するエフェクト)
- (火の玉が中心から外に飛び出してくるエフェクト)
Unity Shuriken を使ってエフェクトを作成します。うまくすると、1のエフェクトから2のエフェクトに Sub Emitter
で派生できるのかもしれないですが、私は別々のエフェクトとして実装して、単純にディレイタイムで表示のタイミングを調整しました。
Sub Emitter
は、ひとつひとつのパーティクルから次のパーティクルへと派生するための機能です。なので、「花火」が典型的な派生例になっています。フレアは1が全部終わったら2がスタート、2が全部終わったら3が……というようなシーケンスの流れになっているので、Sub Emitter
がベストな選択、とはいえないだろうと(私は)思っています。
なお、利用した画像は、雑に用意したものです。それっぽいだけです。(RGB が基本色すぎると思います)
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 Object
に ParticleGroup
のスクリプトを追加して、子要素の ParticleSystem
がすべて null
か IsAlive
が false
になると要素を破棄します。
このあたりはオブジェクトを使い回すためにプール化しておくなど、考えることがあるみたいです。
フレアの material
Sprites
として読み込んだ画像を Material
の Unlit/Transparent
に設定。これをエフェクトの Renderer の Material
プロパティに設定しているという組み合わせです。パラパラ漫画のようにアニメーションするのは Texture Sheet Animation
の設定で Tiles
プロパティの x を「8」にしています。つまり、8枚に分割してください、という設定です。
パラメーターの設定
「中心に集まる」エフェクトと、「爆発する」エフェクトの2つがあります。一例だとこんなの。
「中心に集まる」エフェクト
「爆発する」エフェクト
サンプル
今回のサンプルは GitHub に公開しています。