バーチャル3Dクリエイター神部まゆみです(*^-^*)
この記事はunityのJUTPS3アセットで敵AIを設定してみたメモです。
前回の記事はこちら。
使用したバージョンはunity2020.3.19です。




敵AIなどを作る際のNavmeshはこちらも参考になるかもしれません。
一応舞台のアセットを配置してみる
ゲームっぽくするために舞台のアセットを配置してみます。
以前買ったsimple townアセットを使うか…。
ちょっと車が大きいから調整する必要はあるけど、これだけでなんかゲームっぽいぞ( *´艸`)
プレイヤーを大きくすれば良いか。
1.5倍くらいにしたらちょうど良いサイズ感になった。




敵キャラクターとかも1.5倍にすれば良いかな。
敵を配置してAIで巡回させる
これができれば最低限のゲームっぽくなりそう。
あとはゴール設定したりして、余裕があればシナリオっぽいムービーとかを作ればゲームになるかな。
敵を配置する
JU TPS3のデフォルトの敵でもいいけど、せっかくだからゾンビを配置してみます。
これは無料で使いやすいと思います。
サイズ感も丁度良いですね。


敵AIを設定してみる
敵AIは以前少しだけやってみたけど、改めて設定してみます。
こちらの公式マニュアルに詳しく書いてある。



2-オンにしますIsAIオプション タグを Enemy(または「Player」以外のタグ)に設定します。
3- JU Health コンポーネントと JU インベントリを追加する
1~3までやる
simpleTPSで設定して、PatrolAIを追加する。
IsAIにチェック。


JU Healthとインベントリは既に追加されてました。


NavMeshについてよく知らないので調べる ※知ってたら読まなくていいです
私はまだNavMeshって使ったことがなかった…。
一応unityの公式ページに説明が載ってるのでだいたいは分かった。




youtubeで検索したら、テラシュールブログさんの中の人が解説している動画があった。あの人unityの人だったのか…。
少し古いけど今と基本的な部分は変わってないっぽいです。
まぁまだよくわからないのでChatGPT氏に聞いてみるか。


NavMesh は、Unity のゲームオブジェクトが移動可能な地形を理解するためのシステムです。NavMesh は、通常、AI キャラクターやプレイヤーキャラクターなどの移動を管理するために使用されます。NavMesh は、ゲームオブジェクトの移動範囲を定義し、移動可能な場所を自動的に計算しますが、敵がプレイヤーを見つけたり追跡したりする機能は NavMesh には含まれていません。
通常、敵がプレイヤーを見つけたり追跡したりする場合、NavMesh を使用して敵が移動可能な領域を計算し、その後、別途スクリプトを使用して敵の行動を制御します。この制御スクリプトは、プレイヤーを見つけた場合に敵の挙動を変更するためのロジックを含むことが一般的です。
例えば、プレイヤーを見つけた場合、敵がプレイヤーの方向に移動したり攻撃を行ったりするような処理は、NavMesh とは直接関係のない、別のスクリプトで実装する必要があります。
NavMesh は移動可能な地形を管理するためのツールであり、その他の挙動(例:プレイヤーの発見や追跡)は別の方法で実装する必要があります。
こんな便利な機能あったのか…今まで知らなかったΣ(゚Д゚)
なんか一つのシーンに一つのNavMeshファイルで、キャラクターがどんなにたくさん配置されていても同じ一つのNavMeshファイルを共有しているっぽいです。


通常、一つのシーンには一つの NavMesh が存在します。NavMesh はシーン全体の移動可能な領域を定義し、複数のキャラクターが共有して利用することができます。敵キャラクターごとに個別の NavMesh を作成する必要はありません。代わりに、同じ NavMesh を共有して、複数の敵キャラクターが移動する際に使用します。NavMesh はシーン内のすべての移動可能な領域を表現するため、一つの NavMesh でシーン内のすべてのキャラクターが移動できるようになります。
NavMesh をシーン全体に適用することで、複数のキャラクターが同じ環境で自然な移動を行うことができます。NavMesh の設定や制御によって、異なるキャラクターが移動する方法や行動を個別に制御することができますが、その基盤となる移動可能な領域は一つの NavMesh で共有されます。
はい、その通りです。NavMesh は一つのシーン内で共有されるため、どれだけ多くのキャラクターが配置されていても、同じ NavMesh を共有して移動可能な領域を定義します。NavMesh はシーン全体の移動可能な領域を表現するため、すべてのキャラクターが同じ環境で自然な移動を行うことができます。
静的なオブジェクトのコライダーのみを考慮して、移動可能な場所を勝手に推定してくれる感じっぽい?です。ちゃんと検証してないから本当にそうなのかは分からないが…。


はい、通常、NavMesh は静的なオブジェクトのコライダーのみを考慮します。NavMesh は、”Static” チェックボックスがオンになっているオブジェクトのコライダーを使用して移動可能な領域を計算します。
“Static” チェックボックスがオンになっているオブジェクトは、Unity の静的オブジェクトとしてマークされます。これらのオブジェクトの位置や形状はプログラムによって変更されないため、NavMesh はこれらのオブジェクトのコライダーを使用して移動可能な領域を効率的に計算できます。
一般的に、NavMesh は動的なオブジェクトのコライダーを考慮しないため、動的なオブジェクト(例えば、他の NPC など)は NavMesh の計算には直接影響しません。動的なオブジェクトの移動を考慮する場合、それらの動きをプログラムによって処理する必要があります。
したがって、NavMesh を使用する場合、静的なオブジェクトのコライダーのみが移動可能な領域の計算に使用されます。動的なオブジェクトの移動や相互作用を考慮する場合、それに対するプログラム的な処理が必要になります。
NavMeshを設定してベイクしてみる
unityのページに載ってる方法だと、床を選択してベイクしてますね。






ナビゲーションウィンドウをアクティブにしながら、下の「ナビメッシュを表示」にチェックを入れるとナビメッシュの範囲が青く表示されるみたい。


あれ、でも選択した範囲だけじゃなく、歩行可能な場所が全部表示されてるっぽい?
段差があるところや水場は青くなってないけど、インスペクターの「静的」にチェックが入ってなかったからこれが原因かな?


Navimeshについては後でもう少し詳しくやってみようかな。
WaypointPathを設定して巡回させる
WaypointPathを指定すれば巡回させられます。
巡回ポイントはCtrl+Dでコピペすれば伸ばせる。
On End PathにRestart Pathを指定すると、終点まで行ったらまた視点に戻るっぽい。


これで一応動かせた!
しかしデフォルトで走る設定にしてあるからか、ちょっと小回りが利かない感じだな…。
このあたりはサンプルを見ながら微調整する必要がありそう。
設定すれば敵も銃を撃てるっぽい
↓はサンプルシーンから持ってきた敵AIだけど、見つかると銃を撃ってきます。
武器の設定方法はプレイヤーと同じっぽい。
しかし先に巡回のところをもう少しちゃんとできるようになってからのほうが良いかな(;^_^A
おわりに
舞台と敵を設定するとかなりゲームっぽくなってきた気がする。
でも敵AIの設定とかはもう少し詰めたほうが良いかな…。
もう少しNavmeshについても勉強したほうが良さそう。
まぁもう少しいじってみます(*^-^*)