(:3[kanのメモ帳]

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

(:3[kanのメモ帳]


本ブログの運営者kan.kikuchiが個人で開発したゲームです!


パーティクルの一つ一つ粒子の位置や速度の取得方法【Unity】【Particle System】


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

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


はじめに

UnityではParticle Systemを使ってパーティクルと呼ばれる

複数の粒子で構成されたエフェクトを簡単に作る事が出来ます。

f:id:kan_kikuchi:20210803121614j:plain


ただ、この粒子自体はHierarchy上に実体(GameObject)が無いので直接は座標等が分かりません。

f:id:kan_kikuchi:20210803121631j:plain


なので今回はパーティクルの一つ一つ粒子の位置や速度の取得方法の紹介です!

f:id:kan_kikuchi:20210805082156g:plain


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

Sci-Fi Arsenal | VFX Particles | Unity Asset Store



Particle_Position

まず各粒子はParticleSystemのGetParticlesで取得可能です。

ただし、直接返り値として取得出来るわけでなく引数で配列を渡す感じになります。

//各粒子を取得/*_particleSystemがParticleSystem*/
ParticleSystem.Particle[] particles = new ParticleSystem.Particle[_particleSystem.particleCount];
_particleSystem.GetParticles(particles);


実際に以下のようなパーティクルの座標をログで表示してみると、

f:id:kan_kikuchi:20210805081423j:plain


以下のような感じになります。

//対象のパーティクル(Inspectorで設定)
[SerializeField]
private ParticleSystem _particleSystem;
    
private void Update() {
  //粒子の数を取得、まだ出ていなければスルー
  var particleCount = _particleSystem.particleCount;
  if (particleCount == 0) {
    Debug.Log($"粒子が出ていません");
    return;
  }

  //各粒子を取得
  ParticleSystem.Particle[] particles = new ParticleSystem.Particle[particleCount];
  _particleSystem.GetParticles(particles);
    
  //1個目の粒子の座標取得、ワールド座標に変換
  var particleLocalPosition = particles[0].position;
  var particleWorldPosition = _particleSystem.transform.TransformPoint(particleLocalPosition);
    
  //1個目のパーティクルのワールド座標表示
  Debug.Log($"1個目の粒子の座標 {particleWorldPosition}");
}
f:id:kan_kikuchi:20210805082156g:plain


ちなみに角度(rotation)や速度(velocity)を取得する事も可能です。

f:id:kan_kikuchi:20210805080854j:plain