Developer

【Unity実践】#13 パーティクルで紙吹雪を作成【ランゲーム】
2021.11.01
Lv2

【Unity実践】#13 パーティクルで紙吹雪を作成【ランゲーム】

今回の内容

今回はやや応用的ですが、パーティクルシステムを使ってクリア時の紙吹雪を作成したいと思います。
それほど凝ったものではなく、以下のような簡易的な紙吹雪を作成します。

※初めての方はこちらから
【第1回記事】導入とサンプルの紹介

サンプルシーンを作成

紙吹雪を作成するに当たって、作成用のサンプルシーンを用意しましょう。
ConfettiSampleScene という名前で作成しました。

マテリアルを作成

紙吹雪のカラーバリエーションはマテリアルで区別します。
3つマテリアルを作成して、名前はそれぞれ下記とします。
ConfettiOrangeMaterial
ConfettiGreenMaterial
ConfettiPurpleMaterial

各マテリアルの設定は以下の通りですが、細かい色などはお好みで調整して下さい。

単色の紙吹雪を作成

まずは単色の紙吹雪を発生させるパーティクルを作成します。
後に複製して色の設定だけ変えることで、カラフルな紙吹雪を実現します。

まずは Particle System を追加して、名前を ConfettiOrange とします。

位置を(0, 0, 0)としておきます。

ここから ParticleSystemコンポーネントを調整して行きます。
どこから始めても良いですが、まずは Renderer の項目を下記に設定します。

パーティクルの形状をキューブに変えて、マテリアルに先ほどのオレンジを指定したので、
以下のようなパーティクルが生成されます。

(公式リファレンス)
Rendererモジュール

次に ParticleSystem の基本設定を変更します。

Duration はパーティクルの再生時間で、ここでは0.5秒に設定しました。
Looping をオフにすることで、1回だけ再生されるようにします。
Start Lifetime はパーティクルの生存時間です。
3D Start Size によって、Cubeの形状を薄いカードのような形状に変更しています。
Gravity Modifier が重力です。少しふわっと落下させるように、低めの数値にしました。

以下の動きとなります。

(公式リファレンス)
Particle System メインモジュール

初期設定では秒間のパーティクル放出数が少ないため、スカスカになっています。
これは Emission を下記に設定することで解決します。

Rate Over Time は秒間の放出量の設定です。
200に設定すると、以下の動きとなります。

(公式リファレンス)
Emission モジュール

次は Shape を編集して、放出の形状を調整します。

Angle は円錐の広がり方、Radius は放出面の半径を指定しています。
いずれも標準より狭めたことで、以下の動きとなります。

(公式リファレンス)
Shape モジュール

Rotation by Speed で放出後に回転を与えます。

(公式リファレンス)
Rotation By Speed モジュール

これで一旦、オレンジ単色での紙吹雪は完成となります。
設定値はいずれも後で調整してみて下さい。

3色の紙吹雪を作成

ConfettiOrange を元に、緑と紫の紙吹雪を作成します。
まずは ConfettiOrange を2つ複製して、それぞれ ConfettiGreen, ConfettiPurple とします。

あとはそれぞれ、マテリアルのみ変更します。

ConfettiGreen の場合

ConfettiPurple の場合

これらを1つの親オブジェクトにまとめたいと思います。
空のオブジェクトを生成して名前を ConfettiParticles とします。
配置は(0, 0, 0)にします。

3色のオブジェクトを ConfettiParticles の子要素としましょう。

親と子、各オブジェクトの位置が(0, 0, 0)であることを改めて確認しておいてください。
再生すると、以下のように動きとなります。

これでパーティクルは良い感じになってきたので、一旦プレハブ化して Stage1 の編集に戻りたいと思います。

クリア時の演出に紙吹雪を組み込む

改めて Stage1 を開きましょう。

先ほど作成した ConfettiParticles を2つ、Goalオブジェクトの子要素として配置します。
名前をそれぞれ ConfettiLeft, ConfettiRight として、デフォルトは非アクティブにします。
配置と回転を以下に設定します。

次に、ゴール地点にトリガーを置いて、プレイヤーが触れたら紙吹雪がアクティブになるような仕組みを作成します。
Goalオブジェクトの子要素として空のオブジェクトを作成し、名前を ConfettiEmitter とします。

配置は(0, 0.5, 0)とします。
BoxColliderコンポーネントを追加し、サイズを変更します、
また、IsTrigger にチェックを入れます。

次に新規スクリプトを作成して、名前は ConfettiEmitterScript とします。
以下を記述してください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ConfettiEmitterScript : MonoBehaviour
{
    [SerializeField]
    List<GameObject> confettiList;

    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            foreach(var confetti in confettiList)
            {
                confetti.SetActive(true);
            }
        }
    }
}

これを ConfettiEmitter オブジェクトにアタッチします。
インスペクターで ConfettiList のサイズを2にして、ConfettiLeft と ConfettiRight を設定します。

再生すると以下のように紙吹雪が表示されていれば成功です。

(関連記事)
プログラムからGameObjectやComponentの有効無効を切り替える
foreach文を使って配列・List・ArrayListを楽々操作しよう!

紙吹雪はこれで完成としたいと思います。
それほど凝った作りにはしていませんので、お好みでパーティクルの設定や配置を変えて調整して下さい。

おわりに

パーティクルは設定項目が非常に多く、今回扱ったのもほんの一部の機能に過ぎませんが、
比較的よく使う項目が多かったと思うので様々なケースで役立つと思います。
実装方法についても多岐にわたるので、より良い実装方法やお好みの調整を試してみてください。

次回はステージにコインを配置したいと思います!

 

 
関連リンク ➡ 「初心者のための」Unityゲーム制作 目次

© Unity Technologies Japan/UCL