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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

2回答

1752閲覧

生成されたエージェントが目的地を重複しないように巡回させたい

MIRIS88

総合スコア3

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2021/07/19 12:44

前提・実現したいこと

  1. NavmeshAgent
  2. エージェントが複数の目的地を配列の目的地を巡回する
  3. 目的地に一定時間滞在する

  • 目的地にたどり着く前に、エージェントを認識する

以下のどちらかを実現したい
0. エージェントがいれば、エージェントがいなくなるまで待つ
0. エージェントがいれば、次の目的地を入れる

発生している問題・エラーメッセージ

複数エージェントいるため目的地で重なるまたは衝突するときがある

public class Patrol : MonoBehaviour { // 巡回地点オブジェクトを格納する配列 public Transform[] points; // 巡回地点のオブジェクト数(初期値=0) private int destPoint = 0; // NavMesh Agent コンポーネントを格納する変数 private NavMeshAgent agent; // 滞在時間を計測する変数 private float countup; //滞在時間用の変数 public float remainTime = 1.0f; void Start() { // 変数"agent"に NavMesh Agent コンポーネントを格納 agent = GetComponent<NavMeshAgent>(); // 巡回地点間の移動を継続させるために自動ブレーキを無効化 //(エージェントは目的地点に近づいても減速しない) agent.autoBraking = false; // 次の巡回地点の処理を実行 GotoNextPoint(); } // 次の巡回地点を設定する処理 void GotoNextPoint() { // 巡回地点が設定されていなければ if (points.Length == 0) { // 処理を返します return; } // 現在選択されている配列の座標を巡回地点の座標に代入 agent.destination = points[destPoint].position; // 配列の中から次の巡回地点を選択(必要に応じて繰り返し) destPoint = (destPoint + 1) % points.Length; } // ゲーム実行中の繰り返し処理 void Update() { // エージェントが現在の巡回地点に到達したら if (!agent.pathPending && agent.remainingDistance < 0.5f) { countup += Time.deltaTime; // 次の巡回地点を設定する処理を実行        if(countup >= remainTime) { GotoNextPoint(); } } } }

引用:http://corevale.com/unity/16

補足情報(FW/ツールのバージョンなど)

Unity ver2020.3.12.f1

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

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

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

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

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

guest

回答2

0

ベストアンサー

複数の目的地について,

  • 今現在,誰かに目標にされているか?
  • 今現在,誰かが滞在しているか?

といった情報を管理し,エージェントが次に向かう目的地を決定する際には,この情報を参照すれば他のエージェントと被ることを回避できるのではないでしょうか.


例えば,目的地が{A,B,C,D}の4個あって,エージェントが{P,Q}の二人いるとしたら

ABCD
フリーPが滞在中Qが目標としているフリー

みたいな,目的地の個数分の配列か何かで情報を持てばよいでしょう.

例えば,ここでPの滞在期間が終わり,次の目的地としてCに行きたいと思うとき,
この配列のCのところをチェックすれば,CはQが目標としていることがわかる.
だから,Bに留まる時間を延長してみるとか,あるいは空いている別の目的地Dを目指すことにするとか,そういう行動をとることができる.
(言うまでも無いが,後者の場合には,この配列のBの場所を「フリー」に,Dの場所を「Pが目標としている」に更新する)

投稿2021/07/22 02:12

編集2021/07/22 02:13
fana

総合スコア11996

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

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

MIRIS88

2021/07/22 04:52

アドバイスありがとうございます。 いわゆる占有フラグをつくりたくて、bool型を使うことはわかるのですが、正直何から手をつけてよいのかわかりません。 なにかヒントになるスクリプトはありますか?
fana

2021/07/22 04:58

例えば「エージェントの次の目的地を決めてくれるやつ」みたいなのを用意して,情報管理はそいつが行う形にすればいいんじゃないかな. 各エージェントは必要な時にそいつに「次どこ行けばいい?」と指示を仰ぐ的な. 私自身は Unity を知らないので, どこにどういう形でコードを書く物なのか? 等は判断できないです.
MIRIS88

2021/07/22 08:45

別で情報管理すればできそうです。 ご丁寧にありがとうございます。
guest

0

他のエージェントと目的地が被っていたら、いなくなるまで待つか、
別の目的地に行くようにすればよいと思います。

投稿2021/07/21 16:46

ganta7188

総合スコア436

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

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

fana

2021/07/22 01:45

低評価の理由: > 以下のどちらかを実現したい > 1. エージェントがいれば、エージェントがいなくなるまで待つ > 2. エージェントがいれば、次の目的地を入れる という話に対して,この回答は「それをやればいいよね」って言ってるだけ.何の情報も無い.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問