(:3[kanのメモ帳]

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

(:3[kanのメモ帳]



パーティクルの再生速度(Simulation Speed)をInspectorやプログラムから変更する方法【Unity】【Particle System】


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


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


はじめに

今回はパーティクル(Particle System)の再生速度をInspectorやプログラムから変更する方法です。

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

f:id:kan_kikuchi:20200713064313g:plain


なお、記事中では以下のアセットを使っています。

Magic Arsenal | Spells | Unity Asset Store



パーティクルの再生速度をInspectorから変更

パーティクルの再生速度はSimulation Speedという項目で設定出来ます。

f:id:kan_kikuchi:20200713062147j:plain


実際に操作してみると以下のような感じ。

f:id:kan_kikuchi:20200713062602g:plain



パーティクルの再生速度をプログラムから変更

次にプログラムから変更する方法ですが、

ParticleSystemではなくそのmainのsimulationSpeedという値で設定します。

また、直接変更が出来ない点にも注意が必要です。

/*particleがParticleSystem、speedはfloat*/

//ParticleSystemのmainを取得し、そのmainのsimulationSpeedを変更する事で再生速度を変更
var main = particle.main;
main.simulationSpeed = speed;
/*ParticleSystemにsimulationSpeedはないのでエラー*/
particle.simulationSpeed = speed;

/*mainのsimulationSpeedを直接変更出来ないのでエラー*/
particle.main.simulationSpeed = speed;


参考に、子にある全てのParticleSystemを取得し

再生速度を変更するようなスクリプトを作ってみると以下のような感じ。

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

/// <summary>
/// パーティクルのスピードを変えるクラス
/// </summary>
public class ParticleSpeedChanger : MonoBehaviour {

  //速度を変える対象のパーティクル
  private List<ParticleSystem> _particleSystems;

  //パーティクルの速度
  [SerializeField]
  private float _spped = 1;
  
  //=================================================================================
  //初期化
  //=================================================================================

  private void Start() {
    //子にある全てのパーティクルを取得
    _particleSystems = gameObject.GetComponentsInChildren<ParticleSystem>().ToList();
  }
  
  //=================================================================================
  //イベント
  //=================================================================================

  //Inspectorで値(_speed)を変更した時に呼ばれる
  private void OnValidate() {
    //実行中以外はスルー
    if (!Application.isPlaying) {
      return;
    }
    
    //全パーティクルの速度を変更
    foreach (var particle in _particleSystems) {
      ChangeSpeed(particle, _spped);
    }
  }

  //=================================================================================
  //変更
  //=================================================================================

  //指定したパーティクルの速度を変更
  private void ChangeSpeed(ParticleSystem particle, float speed) {
    var main = particle.main;
    main.simulationSpeed = speed;
  }
    
}
f:id:kan_kikuchi:20200713064313g:plain