質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1174閲覧

一定の範囲内でうろうろさせたいが、まれにどこかへ飛んでいってしまう

a-min

総合スコア2

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/07/03 10:00

タイトルの通りです
待機状態のとき、決められた範囲内でランダムな目的地を取得して移動し、また待機状態に戻るようにしたいのですが、範囲を決めると待機状態に戻らなくなり等速直線運動し続けるようになってしまいました。(範囲を与える前はうまく動いていました)
目的地の設定がうまくできていないのだと思いますが、なぜなのかがわかりません
以下が本体でちゃんとうごいていました

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 }

長くなってしまいましたが、よろしくおねがいします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bboydaisuke

2020/07/04 20:27

「どこかへ飛び立」ったことをコード内で検出し(※)その時の bounds の値と mokuY, mokuY をログに出して、「この bounds の値の時には処理に漏れがあっておかしな場所に移動してしまうのだな」などとその原因を調べるとよいでしょう。何度もテストして、問題が起きた時の法則性がないか調べるのもよいでしょう。また、この問題はそれを調べてそれで終わりではなく、調べた結果を元にまた次は何を調べたらいいか考えてさらに調べることになるでしょう。 (※)多分、「どこかへ飛び立」った時は x, y のどちらかが 100 以上もしくは -100 以下になるんでしょうから、それを「異常状態」として検出してログを出したらいいんじゃないかと思います。
a-min

2020/07/05 17:55

返信ありがとうございます。問題特定の手法参考になりました
guest

回答1

0

自己解決

目的地を設定することをやめて、単に移動時間を決めることで解決しました

投稿2020/07/05 17:58

a-min

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問