独習 Unity アプリ開発

独習でスマフォ向けアプリ開発を勉強中

Unity で テトリス風ゲームを作ってみる(Particle)

 Unity Version 2022.3.4

 

パーティクル(ParticleSystem)


前回まで、よりゲームらしくするためにテトリミノのアニメーション処理を実装してきた。今回からさらにゲームらしい演出を加えるため、パーティクル(ParticleSystem)を適用していく。

 

ライン削除時のパーティクル演出


ライン削除が発生した時に、削除するブロック位置に横方向へ雷が走るみたいな演出をパーティクルを使って実現する。

雷のパーティクルを作成する時に参考にしたサイトはこちら。

【Unity】雷(サンダー)のエフェクトの作り方 - おーみんブログ

 

  • パーティクルの作成

Hierarchy タブの"+"ボタンから"Effects"→"Particle System" を選択してHierarchy 上にParticle オブジェクトを作成する。

Particle Object 作成

作成したParticle Object の名前を"ExplosionParticle" に変更して、予め作成しておいた"Prefab" フォルダにDrag & Drop してPrefab 化する。その後 Hierarchy 上のParticle Object は削除しておく。

Particle Prefab 作成

 

  • パーティクルの設定

作成した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" メソッドが呼ばれることになる。

Particle Inspector #1

 

    • 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 : パーティクル要素を生成するジェネレータの形。イメージとしては、水道の水がパーティクル要素としたら、蛇口の形。

Particle Inspector #2

 

    • Color over Lifetime 
      • (下図参照): パーティクル要素の色を時間経過に伴って変更する際のグラデーションの値。左が生成時、右が終了時。
    • Noise Strength
      • 10(Min)/ 20(Max): 各パーティクル要素の動きに与えるノイズ効果の強度
    • Noise Frequency
      • 10 : ノイズを加える頻度
    • Noise Scroll Speed
    • Noise Octaves
      • 4 : ノイズのレイヤー数。ノイズをどの程度複雑化するかの設定。
    • Noise Octaves Multiplier
      • 1 : ノイズのレイヤーを重ねる際の強度の減衰量(割合)。値を大きくすると(最大1) ノイズが細かくなるみたい。
    • Noise Octaves Scale
      • 2 : ノイズのレイヤーを重ねる際のノイズ周波数の減衰量。ローパスフィルターのようなものか?よくわかない。。。

正直ノイズの設定項目は、Preview 画像と実際の実行結果を見ながら適当に調整するしかなさそう。よくわかない。

Particle Inspector #3
    • Trails Color Over Trail
      • (下図参照): トレイルの色の設定。トレイルとは、パーティクル要素に対して尾ひれのように(弾道のように)移動の軌跡を表現するために使われるもの。
    • Renderer Mode
    • Speed Scale
      • 0.1 : パーティクル要素の速度に応じて、パーティクル画像を引き延ばす
    • Material
      • Default-ParticleSystem : パーティクル要素のレンダリングに使用するマテリアル
    • Trail Material
      • Default-ParticleSystem : トレイル要素のレンダリングに使用するマテリアル

Particle Inspector #4

 

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();
  •   }

 

上記を実装した結果がこちら。

www.youtube.com

 

次の記事


(準備中)

 

 


目次に戻る