タイトルの通りです
待機状態のとき、決められた範囲内でランダムな目的地を取得して移動し、また待機状態に戻るようにしたいのですが、範囲を決めると待機状態に戻らなくなり等速直線運動し続けるようになってしまいました。(範囲を与える前はうまく動いていました)
目的地の設定がうまくできていないのだと思いますが、なぜなのかがわかりません
以下が本体でちゃんとうごいていました
C#
1 private void Urouro() 2 { 3 if ((moku - transform.position).sqrMagnitude < 0.89f) 4 { 5 toutyaku = true; 6 }//到着スイッチ 7 if (seisi) 8 { 9 RndVel(); 10 seisi = false; 11 } 12 else if (toutyaku) 13 { 14 eRb.velocity = Vector3.zero; 15 time += Time.deltaTime; 16 17 if (time > taikiTime) 18 { 19 seisi = true; 20 time = 0f; 21 toutyaku = false; 22 } 23 } 24 } 25 private void RndVel() 26 { 27 float rndPosiX = Random.Range(-10f, 10f); 28 float rndPosiY = Random.Range(-10f, 10f); 29 float idouVX = rndPosiX; 30 float idouVY = rndPosiY; 31 float mokuX = rndPosiX + transform.position.x; 32 float mokuY = rndPosiY + transform.position.y; 33 moku = new Vector3(mokuX, mokuY, 0.0f);//目的地 34 if ((moku - transform.position).sqrMagnitude < 1f) 35 { 36 moku = moku.normalized * Random.Range(1, 4); 37 } 38 idouV = new Vector3(idouVX, idouVY, 0.0f); 39 eRb.velocity = (idouV.normalized / Time.deltaTime) * urotukiV; //ランダムな向きの一定の速さ 40 }
以下が追加したものです。StartでTyakutiten()を呼び出し範囲を決め、4分割した座標面からは出られないようにしたつもりでしたが、境界面を越えてどこかへ飛び立ちます
C#
1 [System.Serializable] 2 public class Bounds 3 { 4 public float xMin, xMax, yMin, yMax; 5 } 6 [SerializeField] Bounds bounds = null; 7 8 private void RndVel() 9 { 10 //float mokuY = rndPosiY + transform.position.y; 11 mokuX = Mathf.Clamp(mokuX, bounds.xMin, bounds.xMax); 12 mokuY = Mathf.Clamp(mokuY, bounds.yMin, bounds.yMax); 13 //moku = new Vector3(mokuX, mokuY, 0.0f); 14 } 15 private void Tyakutiten() 16 { 17 var startPosi = transform.position; 18 if (startPosi.x >= 0f && startPosi.y >= 0f) 19 { 20 Debug.Log("A"); 21 bounds.xMin = 5f; 22 bounds.xMax = 95f; 23 bounds.yMin = 5f; 24 bounds.yMax = 95f; 25 }//A(++) 26 else if (startPosi.x < 0f && startPosi.y >= 0f) 27 { 28 Debug.Log("B"); 29 bounds.xMin = -95f; 30 bounds.xMax = -5f; 31 bounds.yMin = 5f; 32 bounds.yMax = 95f; 33 }//B(-+) 34 else if (startPosi.x < 0f && startPosi.y < 0f) 35 { 36 Debug.Log("C"); 37 bounds.xMin = -95f; 38 bounds.xMax = -5f; 39 bounds.yMin = -95f; 40 bounds.yMax = -5f; 41 }//C(--) 42 else if (startPosi.x >= 0f && startPosi.y < 0f) 43 { 44 Debug.Log("D"); 45 bounds.xMin = 5f; 46 bounds.xMax = 95f; 47 bounds.yMin = -95f; 48 bounds.yMax = -5f; 49 }//D(+-) 50 }
長くなってしまいましたが、よろしくおねがいします
「どこかへ飛び立」ったことをコード内で検出し(※)その時の bounds の値と mokuY, mokuY をログに出して、「この bounds の値の時には処理に漏れがあっておかしな場所に移動してしまうのだな」などとその原因を調べるとよいでしょう。何度もテストして、問題が起きた時の法則性がないか調べるのもよいでしょう。また、この問題はそれを調べてそれで終わりではなく、調べた結果を元にまた次は何を調べたらいいか考えてさらに調べることになるでしょう。
(※)多分、「どこかへ飛び立」った時は x, y のどちらかが 100 以上もしくは -100 以下になるんでしょうから、それを「異常状態」として検出してログを出したらいいんじゃないかと思います。
返信ありがとうございます。問題特定の手法参考になりました
回答1件
あなたの回答
tips
プレビュー