Unity で テトリス風ゲームを作ってみる(Particle)
Unity Version 2022.3.4
パーティクル(ParticleSystem)
前回まで、よりゲームらしくするためにテトリミノのアニメーション処理を実装してきた。今回からさらにゲームらしい演出を加えるため、パーティクル(ParticleSystem)を適用していく。
ライン削除時のパーティクル演出
ライン削除が発生した時に、削除するブロック位置に横方向へ雷が走るみたいな演出をパーティクルを使って実現する。
雷のパーティクルを作成する時に参考にしたサイトはこちら。
【Unity】雷(サンダー)のエフェクトの作り方 - おーみんブログ
- パーティクルの作成
Hierarchy タブの"+"ボタンから"Effects"→"Particle System" を選択してHierarchy 上にParticle オブジェクトを作成する。
作成したParticle Object の名前を"ExplosionParticle" に変更して、予め作成しておいた"Prefab" フォルダにDrag & Drop してPrefab 化する。その後 Hierarchy 上のParticle Object は削除しておく。
- パーティクルの設定
作成したParticle のPrefab を選択して、Inspector からパーティクルを設定して雷のエフェクトを作成する。パーティクルの設定項目はかなり多いので注意が必要。Unity のマニュアルでもかなりの量があることがわかる。デフォルトからの変更点を以下に記載する。
-
- Duration
- 0.5 : パーティクル全体の実行期間
- Loop
- Disable(チェックを外す): 実行期間が終了後、再度初めから再開し続けるかどうかの設定
- Start LifeTime
- 0.5 : 個々のパーティクル要素の生存期間
- Start Speed
- 100(Min)/ 150(Max): 各パーティクル要素の初速。デフォルトでは固定値を1つだけ入力できるが、右側の"▼"ボタンを押して"Random Between Two Constatns" を選択すると、最初値と最大値を設定できるようになる。この二つの値の範囲でランダム値となる。
- Start Size
- 0.1(Min)/ 0.5(Max): 各パーティクル要素のサイズ。こちらも"Random Beween Two Constatns" を選択して、最初値と最大値を設定。
- Gravity Source
- 2D Physics : 重力のソース。今回重力は使わないので変更しなくてもよさそうだが、念のため。
- Gravity Modifier
- 0 : Physics で設定している重力値に掛ける倍率。0 は重力を使わないという意味。
- Play On Awake
- Disable(チェックを外す): パーティクルオブジェクトが生成(Awake)したときに、パーティクルの再生を開始するするかどうかの設定。今回はスクリプトから開始トリガーをかけるためDisable にしておく。
- Stop Action
- Destroy : パーティクルの実行期間が終了したときに起こすアクションの選択。Destroy の場合はパーティクルオブジェクトが削除される。コールバックをもらいたい場合は、"Callback" を選択する。この場合、パーティクルオブジェクトにアタッチしたスクリプトの"OnParticleSystemStopped" メソッドが呼ばれることになる。
- Duration
-
- Emission Rate Over Time
- 0 : 単位時間ごとに生成されるパーティクル要素の数。"Bursts" の項目で制御するので、ここは"0" を設定。
- Emission Bursts(パーティクル要素の生成を時間ことにトリガーできる)
- Time 0 : パーティクル要素を生成する時間
- Count 5 : 時間が来た時に1 度に生成するパーティクル要素の数
- Cycles 1 : 時間が来た時に何回繰り返し生成するかの回数
- Interval 0.010 : Cycle をどれくらいの間隔で実行するかの時間
- Probability 1.0 : パーティクル要素生成時の生成確率。"1" だと必ず生成される。
- Shape Circle : パーティクル要素を生成するジェネレータの形。イメージとしては、水道の水がパーティクル要素としたら、蛇口の形。
- Emission Rate Over Time
-
- Color over Lifetime
- (下図参照): パーティクル要素の色を時間経過に伴って変更する際のグラデーションの値。左が生成時、右が終了時。
- Noise Strength
- 10(Min)/ 20(Max): 各パーティクル要素の動きに与えるノイズ効果の強度
- Noise Frequency
- 10 : ノイズを加える頻度
- Noise Scroll Speed
- 2 : (よくわかならない。マニュアル参照)
- Noise Octaves
- 4 : ノイズのレイヤー数。ノイズをどの程度複雑化するかの設定。
- Noise Octaves Multiplier
- 1 : ノイズのレイヤーを重ねる際の強度の減衰量(割合)。値を大きくすると(最大1) ノイズが細かくなるみたい。
- Noise Octaves Scale
- 2 : ノイズのレイヤーを重ねる際のノイズ周波数の減衰量。ローパスフィルターのようなものか?よくわかない。。。
- Color over Lifetime
正直ノイズの設定項目は、Preview 画像と実際の実行結果を見ながら適当に調整するしかなさそう。よくわかない。
-
- Trails Color Over Trail
- (下図参照): トレイルの色の設定。トレイルとは、パーティクル要素に対して尾ひれのように(弾道のように)移動の軌跡を表現するために使われるもの。
- Renderer Mode
- Streched Billboard :
- Speed Scale
- 0.1 : パーティクル要素の速度に応じて、パーティクル画像を引き延ばす
- Material
- Default-ParticleSystem : パーティクル要素のレンダリングに使用するマテリアル
- Trail Material
- Default-ParticleSystem : トレイル要素のレンダリングに使用するマテリアル
- Trails Color Over Trail
Particle の設定が完了したので、スクリプトからPerticle Prefab を生成して再生する部分を作る。
Field.cs の抜粋
Field クラスのメンバにParticlePrefab GameObject のメンバを追加。
- private GameObject _explosionParticlePrefab;
Filed クラスの初期化メソッド(Init)で、ParticlePrafab アセットリソースをロード。
- public void Init(IFieldEventListener listener) {
- // 中略
- // Load Particle Prefab
- _explosionParticlePrefab = Resources.Load("Prefabs/ExplosionParticle") as GameObject;
ライン削除時に、ロードしておいたParticlePrefab をインスタンス化し、Y 座標を削除したラインの高さ、X 座標をフィールド中央の位置に移動。Particle オブジェクトからParticleSystem コンポーネントを取得して、Play メソッドで再生を開始する。Particle 設定にて、Stop Action をDestroy にしているので、削除処理は不要(のはず)。
- public void DestroyBlocks (List<GameObject> blocks) {
- float y = blocks[0].transform.localPosition.y;
- foreach (var block in blocks) {
- _blocks.Remove(block);
- Destroy(block);
- }
- var particleObject = Instantiate(_explosionParticlePrefab, this.transform);
- particleObject.transform.localPosition =
- new Vector3(ScreenConfig.FIELD_WIDTH*0.5f, y, 0);
- var particle = particleObject.GetComponent<ParticleSystem>();
- particle.Stop();
- particle.Play();
- }
上記を実装した結果がこちら。
次の記事
(準備中)