(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]

パーティクルの再生が終わった時の処理(コールバック)を設定する【Unity】【Particle System】


このエントリーをはてなブックマークに追加

この記事でのバージョン
Unity 2018.4.0f1


はじめに

今回はタイトル通り、パーティクルの再生が終わった時に何か処理をしたい場合の話です。

イメージとしては以下のような感じ。


f:id:kan_kikuchi:20190525055036g:plain


ちなみにUnity 2018(.1?)からの機能ですのであしからず。


OnParticleSystemStopped

パーティクルの再生が終わった時に処理をしたい場合は

MonoBehaviourのOnParticleSystemStoppedを使います。



使い方は簡単、Particle SystemのStop ActionをCallbackにして、


f:id:kan_kikuchi:20190525055215j:plain


MonoBehaviourを継承したクラスにOnParticleSystemStoppedを実装

using UnityEngine;

public class NewBehaviourScript : MonoBehaviour{
  
  /// <summary>
  /// パーティクルの再生が終わった時に実行される
  /// </summary>
  private void OnParticleSystemStopped(){
    Debug.Log("パーティクル終わったよ!");
  }

}


さらにそのクラスをParticle Systemと同じGameObjectにAddするだけ。


f:id:kan_kikuchi:20190525055222j:plain
f:id:kan_kikuchi:20190525055036g:plain


なお、当たり前ですが

Loopingを有効にしてると終了しないので、OnParticleSystemStoppedは実行されません。

f:id:kan_kikuchi:20190525073157j:plain


ただし、ParticleSystemのStopを使って止めた場合はOnParticleSystemStoppedが実行されます。

(Loopingが無効の場合も同様)

using UnityEngine;

public class NewBehaviourScript : MonoBehaviour{
  
  private float _time = 0;
  
  private void Update() {
    
    if (_time >= 0.5f) {
      return;
    }

    _time += Time.deltaTime;
    
    //0.5秒過ぎたらパーティクルを止める
    if (_time >= 0.5f) {
      GetComponent<ParticleSystem>().Stop();
    }
  }

  /// <summary>
  /// パーティクルの再生が終わった時に実行される
  /// </summary>
  private void OnParticleSystemStopped(){
    Debug.Log("パーティクル終わったよ!");
  }

}


なお、Stopの瞬間にOnParticleSystemStoppedが実行されるのではなく、

Stopの時点で表示されているパーティクルの再生が終わったら実行されます。


f:id:kan_kikuchi:20190525073631g:plain