概要
- Unityでパーティクルを使ったスクリプトを作成していて行き詰ってしまいました。
- 困っていることの概要は以下になります。原因や解決方法についてご意見いただけないでしょうか。
よろしくお願いいたします。
作業環境
- windows10 pro
- unity 2021.2.7f1
やりたいこと
- Unityで放出されているパーティクルの座標の最大最小値を取得したい
- パーティクルはcone状に発生、発生元から上(y軸+方向)に上がっていく
問題
- パーティクルによって、座標値がうまく取得できていないと思われる結果になる
- 発生元と、パーティクル最大最小の座標がずれる
- 発生する速度やサイズなど主なパラメータについては揃えてみたが改善しない
- 取得方法の実装について間違いがある?
実装
- 計算部分を抜粋した内容は以下になります
cs
1[SerializeField] 2 private ParticleSystem _particleSystem; 3 4void Update () 5{ 6 // パーティクルを取得 7 var particleCount = _particleSystem.particleCount; 8 ParticleSystem.Particle[] particles = new ParticleSystem.Particle[particleCount]; 9 _particleSystem.GetParticles(particles); 10 11 // パーティクルのワールド座標を取得 12 Vector3[] particles_worldpos = new Vector3[particleCount]; 13 for( int i=0 ; i<particleCount ; i++ ){ 14 particles_worldpos[i] = _particleSystem.transform.TransformPoint(particles[i].position); 15 } 16 17 // 最大最小を求める 18 var pos3_min = min_pos3( particles_worldpos, particleCount ); // get min in particles 19 var pos3_max = max_pos3( particles_worldpos, particleCount ); // get max in particles 20 21 // 出力 最小値、最大値、パーティクルシステム座標値 22 Vector3 tmp_s = _particleSystem.transform.position; 23 string s1 = $"particle min: {pos3_min}, max: {pos3_max}, system: {tmp_s}"; 24 Debug.Log($"{s1}"); 25 26} 27 28// 最大最小を計算する 29Vector3 min_pos3( Vector3[] pos, int count ) 30 { 31 Vector3 ret= new Vector3(); 32 float min_x = float.MaxValue; 33 float min_y = float.MaxValue; 34 float min_z = float.MaxValue; 35 36 for( int idx=0 ; idx<count ; idx++ ){ 37 if( min_x > pos[idx].x ) min_x = pos[idx].x; 38 if( min_y > pos[idx].y ) min_y = pos[idx].y; 39 if( min_z > pos[idx].z ) min_z = pos[idx].z; 40 } 41 42 ret.x = min_x; 43 ret.y = min_y; 44 ret.z = min_z; 45 46 return( ret ); 47 } 48 49 Vector3 max_pos3( Vector3[] pos, int count ) 50 { 51 Vector3 ret= new Vector3(); 52 float max_x = float.MinValue; 53 float max_y = float.MinValue; 54 float max_z = float.MinValue; 55 56 for( int idx=0 ; idx<count ; idx++ ){ 57 if( max_x < pos[idx].x ) max_x = pos[idx].x; 58 if( max_y < pos[idx].y ) max_y = pos[idx].y; 59 if( max_z < pos[idx].z ) max_z = pos[idx].z; 60 } 61 62 ret.x = max_x; 63 ret.y = max_y; 64 ret.z = max_z; 65 66 return( ret ); 67 } 68
出力結果
- パーティクルA、Bを同じ位置に設置。見た目での大きさもほぼ同じぐらいに設定
- パーティクルAでのログ(frame=10)
particle min: (18.62, -31.04, 67.70), max: (20.08, -28.89, 68.80), system: (18.72, -31.04, 68.18)
- パーティクルBでのログ(frame=10)
particle min: (22.41, -37.23, 81.55), max: (22.68, -36.32, 81.84), system: (18.72, -31.04, 68.18)
- パーティクルBでは、設置した位置から座標値が大きくずれてしまう

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/02/22 07:24