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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

1回答

656閲覧

agentが任意の方向に動かない

kosho206

総合スコア41

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2020/05/31 07:45

プレイヤー同士10人が戦う3Dゲームを作っています。
プレイヤーが人数分集まらなかった時のためにbotを作り、それを動かすためのコードを今書いているのですが、上手く動かない部分があります。
このbotにやらせたい挙動は以下です。
1.他のプレイヤーを追いかけさせたい
2.他プレイヤーに近距離まで近づいたら追いかける対象を切り替えるようにしたい
3.常にプレイヤーを追いかけ続けると、bot同士が互いに追いかけ続けて一か所に固まってしまうので、4秒間の移動距離が指定した数より少なかったら追いかけるのをやめ、最も遠いオブジェクト(設置物)を目指して4秒間だけ進み、そのあとまたプレイヤーを追いかけ始めるようにしたい

上記の1と2はできたのですが、3がうまくできません。
このbotのコードは下のもので、3を処理している部分はコードの一番下のif文です。

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; public class UnkoBot : MonoBehaviour { NavMeshAgent agent; GameObject[] AllUnkoman; GameObject disObject; int Chasetarget; int sakkino; int ObjTarget; Vector3 UnkomanPos; Vector3 movementDif; Vector3 movement; bool ChaseMode; float StayTime; float NotChaseTime; bool ObjContact; void Start() { agent = GetComponent<NavMeshAgent>(); AllUnkoman = GameObject.FindGameObjectsWithTag("Player"); Chasetarget = Random.Range(0, AllUnkoman.Length); UnkomanPos = this.transform.position; ChaseMode = true; ObjContact = false; } void OnTriggerEnter(Collider other) { if(other.gameObject.tag == "Player") { Chasetarget = Random.Range(0, AllUnkoman.Length); while (Chasetarget == sakkino) { Chasetarget = Random.Range(0, AllUnkoman.Length); } } } void OnCollisionEnter(Collision collision) { if(collision.gameObject.tag == "Object") { ObjContact = true; } } GameObject searchTag(GameObject nowObj, string Object) { float tmpDis = 0; float nearDis = 0; GameObject targetObj = null; foreach (GameObject obs in GameObject.FindGameObjectsWithTag("Object")) { tmpDis = Vector3.Distance(obs.transform.position, nowObj.transform.position); if (nearDis < tmpDis) { nearDis = tmpDis; targetObj = obs; } } return targetObj; } void Update() { if (AllUnkoman[Chasetarget] == this.gameObject) { Chasetarget = Random.Range(0, AllUnkoman.Length); } sakkino = Chasetarget; Debug.Log(ChaseMode); if (ChaseMode == true) { StayTime += Time.deltaTime; agent.destination = AllUnkoman[Chasetarget].transform.position; if (StayTime < 4f) { movementDif = this.transform.position - UnkomanPos; movement += movementDif; } if (StayTime >= 4f) { if (movement.magnitude <= 20) { ChaseMode = false; } StayTime = 0f; movement = Vector3.zero; } } UnkomanPos = this.transform.position; if(ChaseMode == false) { NotChaseTime += Time.deltaTime; disObject = searchTag(gameObject, "Object"); agent.destination = disObject.transform.position; if(NotChaseTime > 4f || ObjContact == true) { ChaseMode = true; ObjContact = false; } } } }

botは7体設置しています。
上記の3の部分で、2つの問題があります。
・Debug.Logで確認しましたが、ChaseModeがfalseになっているのにも関わらず、設置物のオブジェクトを目指して進んでくれません。また、行き先のオブジェクトの取得も問題なくできています。
・実行して4秒経つと、ChaseModeがflaseになるのですが、なぜかfalseの状態が8秒続き、8秒後にtrueになったあと再びfalseになることがありません。

この問題の原因が何なのか、1日自分で考えましたが分かりませんでした。
どなたかわかる方がいましたら教えてください。

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

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

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

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

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

sakura_hana

2020/06/01 00:44

Debug.Logで怪しい値を片っ端から調べてみてください。 movement.magnitude、NotChaseTime、agent.pathStatusなど。 少なくともNotChaseTimeを0にしている所が無いのは問題かなとは思います(今回挙がっている部分とは無関係かもしれませんが)。
kosho206

2020/06/01 08:00

NotChaseTimeを0にしないまま使っていたのは確かに問題でした。 それを修正しただけでは上手く動きませんでしたが、今日もう一度よく考えてみたところ自己解決できました。 ありがとうございます
guest

回答1

0

自己解決

NotChaseTimeを0にリセットしていなかったのと、「最も遠いオブジェクト」をUpdate内で常に取得していたことが原因でした。
常に取得することで、毎フレームターゲットが切り替わってしまい、上手く動きませんでした。
if (movement.magnitude <= 20)
{
ChaseMode = false;
}
の中でオブジェクトを取得することで解決しました。

投稿2020/06/01 08:04

kosho206

総合スコア41

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問