パーティクルシステム(Shuriken)に関する小技をまとめました。知っておくと便利なTIPSを紹介します。
uGUI(Screen Space – Overlay)の前にパーティクルを表示する方法
Screen Space – Overlayの場合はUIが必ず最前面に来るため、通常はパーティクルを前に表示できません。
しかしRender Textureを使えば実現できます。

テキストとボタンの間にパーティクル(レンダーテクスチャ)を入れています。
手順
- GameObject → UI → Buttonを作成
- 子にGameObject → UI → RawImageを作成
- Assets → Create → Render Texture(Particle Render Texture)を作成し、RawImageにアサイン

- パーティクル用のカメラ(ParticleCamera)を作成
- Layerに「particle」を作成し、カメラのCulling Maskをparticleに設定
- Clear FlagsをSolid Color、アルファを0に設定
- Target TextureにParticle Render Textureを設定

- ParticleCameraの子にParticle Systemを作成
- Particle Systemのレイヤーをparticleに設定
- Textを作成して、Button、RawImage、Textの階層順に配置
- 再生して、ボタンとテキストの間にパーティクルが表示されることを確認

Max Particle Sizeについて
魔法陣など大きいサイズのパーティクルを出したとき、カメラをズームしてもサイズが変わらないことがあります。その場合はMax Particle Size(デフォルト0.5)の値を大きくします。
検証結果

Particle Start Size 100 = Plane Scale 10 という結果になりました。

カメラのズーム範囲を先に決めて、パーティクルサイズに合わせてMax Particle Sizeを調整しましょう。カメラがSize 15までズームする場合、Particle Start Size 25以上のものはMax Particle Sizeの調整が必要になる可能性があります。
パーティクルでテキストを発生させる方法

Render Textureを使います。テキストが変更されるとパーティクルのテキストも更新されます。

マテリアルの準備
- Assets → Create → Render Texture(Text Render)を作成
- Assets → Create → Material(Text Material)を作成
- Text MaterialのShaderをMobile → Particle → Additiveに変更
- Text MaterialのTextureにText Renderをアサイン
シーンの作成
- Main CameraのClear FlagsをSolid Color(黒)に設定
- Main CameraをCtrl+Dで複製してText Cameraを作成
- Text CameraのProjectionをOrthographicに変更
- Text CameraのTarget TextureにText Renderを設定
- CanvasをScreen Space – Cameraに変更し、Render CameraをText Cameraに設定
- GameObject → UI → Textで文字を入力
- GameObject → Particle Systemを作成
- Particle SystemのRenderer → MaterialにText Materialを設定
カウントダウン用のスクリプト:
using UnityEngine;
using UnityEngine.UI;
public class TimeScript : MonoBehaviour
{
private float time = 10;
void Start()
{
GetComponent<Text>().text = ((int)time).ToString();
}
void Update()
{
time -= Time.deltaTime;
if (time < 0) time = 0;
GetComponent<Text>().text = ((int)time).ToString();
}
}パーティクルの描画が残り続ける場合の解消方法
パーティクルの描画が毎フレーム残り続けてしまう場合、カメラの設定が原因です。

Camera → Clear Flagsが「Don’t Clear」になっていると、パーティクルの各フレームの描画が次のフレーム上に残ってしまいます。背景を黒くしたい場合は「Solid Color」を使用してください。
パーティクルをパスに沿わせる方法

参考:https://www.youtube.com/watch?v=lIbY95qBPxc
手順
- 動画のダウンロード先から3つのスクリプトを入手(Math_Functions.cs、ParticlePathFlow.cs、Path_Comp.cs)
- Particle Systemを作成
- ParticlePathFlow.csをアタッチ
- 空のGameObjectを複数配置(ベジェのポイントになる)
- パーティクルのパラメータを調整

調整パラメータ:
- Lifetime:描くスピードに影響
- Size:太さに影響
- Color over Lifetime:色に影響
- Emission Rate:数に影響(大きすぎると1個だけ先に出てしまう)
パーティクル衝突時にヒットエフェクトを出す方法
OnParticleCollisionを使用すると、パーティクル衝突時に別のパーティクルを発生させることができます。
準備
- 当てる用のパーティクル(Beam)
- ヒット用のパーティクル(Explosion)
- 障害物(Cube)
設定
- 当てる用のパーティクルのCollisionにチェック
- TypeをWorldにして、Send Collision Messagesにチェック
- 以下のスクリプトをアタッチ
using UnityEngine;
public class FX_Test : MonoBehaviour
{
private ParticleSystem.CollisionEvent[] collisionEvents = new ParticleSystem.CollisionEvent[16];
private ParticleSystem ps;
void Start()
{
ps = GetComponent<ParticleSystem>();
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
ps.Play();
}
}
void OnParticleCollision(GameObject other)
{
GameObject hitParticle = GameObject.Find("Explosion");
int safeLength = ps.GetSafeCollisionEventSize();
if (collisionEvents.Length < safeLength)
collisionEvents = new ParticleSystem.CollisionEvent[safeLength];
int numCollisionEvents = ps.GetCollisionEvents(other, collisionEvents);
for (int i = 0; i < numCollisionEvents; i++)
{
Vector3 collisionHitLoc = collisionEvents[i].intersection;
GameObject instance = Instantiate(hitParticle, collisionHitLoc, Quaternion.identity);
instance.GetComponent<ParticleSystem>().Play();
Destroy(instance, 1.0f);
}
}
}まとめ
- uGUIの前にパーティクルを表示するにはRender Textureを使う
- 大きいパーティクルはMax Particle Sizeを調整する
- パーティクルが残り続ける場合はClear Flagsを確認する
- パスに沿わせるには専用スクリプトを使用する
- 衝突エフェクトはOnParticleCollisionで実装できる
