この記事でのバージョン
Unity 2020.3.11f1
はじめに
UnityではParticle Systemを使ってパーティクルと呼ばれる
複数の粒子で構成されたエフェクトを簡単に作る事が出来ます。
ただ、この粒子自体はHierarchy上に実体(GameObject)が無いので直接は座標等が分かりません。
なので今回はパーティクルの一つ一つ粒子の位置や速度の取得方法の紹介です!
また、記事中では以下のアセットを使っています。
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);
実際に以下のようなパーティクルの座標をログで表示してみると、
以下のような感じになります。
//対象のパーティクル(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}"); }
ちなみに角度(rotation)や速度(velocity)を取得する事も可能です。