Unity│パーティクルに関するエフェクト小技集まとめ│Shuriken

パーティクルシステム(Shuriken)に関する小技をまとめました。知っておくと便利なTIPSを紹介します。

目次

uGUI(Screen Space – Overlay)の前にパーティクルを表示する方法

Screen Space – Overlayの場合はUIが必ず最前面に来るため、通常はパーティクルを前に表示できません。

しかしRender Textureを使えば実現できます。

uGUIの前にパーティクルを表示

テキストとボタンの間にパーティクル(レンダーテクスチャ)を入れています。

手順

  1. GameObject → UI → Buttonを作成
  2. 子にGameObject → UI → RawImageを作成
  3. Assets → Create → Render Texture(Particle Render Texture)を作成し、RawImageにアサイン
RawImageの設定
  1. パーティクル用のカメラ(ParticleCamera)を作成
  2. Layerに「particle」を作成し、カメラのCulling Maskをparticleに設定
  3. Clear FlagsをSolid Color、アルファを0に設定
  4. Target TextureにParticle Render Textureを設定
カメラの設定
  1. ParticleCameraの子にParticle Systemを作成
  2. Particle Systemのレイヤーをparticleに設定
  3. Textを作成して、Button、RawImage、Textの階層順に配置
  4. 再生して、ボタンとテキストの間にパーティクルが表示されることを確認
階層構造

Max Particle Sizeについて

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

検証結果

Max Particle Sizeのテスト1

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

Max Particle Sizeのテスト2

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

パーティクルでテキストを発生させる方法

パーティクルでテキストを発生

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

テキストの更新

マテリアルの準備

  1. Assets → Create → Render Texture(Text Render)を作成
  2. Assets → Create → Material(Text Material)を作成
  3. Text MaterialのShaderをMobile → Particle → Additiveに変更
  4. Text MaterialのTextureにText Renderをアサイン

シーンの作成

  1. Main CameraのClear FlagsをSolid Color(黒)に設定
  2. Main CameraをCtrl+Dで複製してText Cameraを作成
  3. Text CameraのProjectionをOrthographicに変更
  4. Text CameraのTarget TextureにText Renderを設定
  5. CanvasをScreen Space – Cameraに変更し、Render CameraをText Cameraに設定
  6. GameObject → UI → Textで文字を入力
  7. GameObject → Particle Systemを作成
  8. 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();
}
}

パーティクルの描画が残り続ける場合の解消方法

パーティクルの描画が毎フレーム残り続けてしまう場合、カメラの設定が原因です。

Clear Flagsの設定

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

パーティクルをパスに沿わせる方法

パスに沿ったパーティクル

参考:https://www.youtube.com/watch?v=lIbY95qBPxc

手順

  1. 動画のダウンロード先から3つのスクリプトを入手(Math_Functions.cs、ParticlePathFlow.cs、Path_Comp.cs)
  2. Particle Systemを作成
  3. ParticlePathFlow.csをアタッチ
  4. 空のGameObjectを複数配置(ベジェのポイントになる)
  5. パーティクルのパラメータを調整
パスに沿わせる設定

調整パラメータ:

  • Lifetime:描くスピードに影響
  • Size:太さに影響
  • Color over Lifetime:色に影響
  • Emission Rate:数に影響(大きすぎると1個だけ先に出てしまう)

パーティクル衝突時にヒットエフェクトを出す方法

OnParticleCollisionを使用すると、パーティクル衝突時に別のパーティクルを発生させることができます。

準備

  • 当てる用のパーティクル(Beam)
  • ヒット用のパーティクル(Explosion)
  • 障害物(Cube)

設定

  1. 当てる用のパーティクルのCollisionにチェック
  2. TypeをWorldにして、Send Collision Messagesにチェック
  3. 以下のスクリプトをアタッチ
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で実装できる
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次