FPSゲームの作り方7 Unityで障害物を避けて徘徊する敵の移動AIをNavmeshで作る

Unity FPSゲームの作り方


Unity入門の森オリジナル本格ゲーム制作講座はこちら
8種類の本格ゲームの全ソースコード公開・画像&動画による解説付き

この記事はUnityとC#を用いてFPSゲームを作成する講座の第7回です。

前回は敵を作成し、矢を当ててHPを減らし倒せるようにしました。

前回の記事:

FPSゲームの作り方6 敵キャラクターの作成と攻撃処理の実装
本講座では、UnityとC#を用いて3DFPSゲームを作成します。今回は第6回です。 第五回ではプレイヤーのエイム照準器による当たり判定処理や攻撃処理を作成し、敵にヒットさせることができるようになりました。 前回の記事 :  ...

今回は前回作成した敵キャラクターが移動などの行動をとれるようにしていきましょう。


【Line登録者限定のプレゼントもあるよ!】

NavMeshを使用した敵の徘徊移動パターンの作り方

ではまず「Enemy1」という名前のワニっぽい敵を動かしていきましょう。

AnimatorContoller

まずは、アニメーションを設定します。

「Assets/AppMain/Animator」フォルダ(なかったら作成してください)に、右クリック「Create/AnimatorController」で新しいアニメーターコントローラーを作成し「EnemyCrocAnimatorController」という名前にします。
そして、同じところに「Croc」というフォルダを作成しておきましょう。

アニメーションの複製

続いて、「Assets/Creature_Monsters_X/Animation」にあるファイルを見てください。このうちの一つ「Monster_X@Idle」というファイルの左の三角マークをクリックして子を開きます。すると、下の方にある「Idle」というファイルを選択します。

これがアニメーションのファイルで選択するとInspectorの下にプレビューウインドウがでてきます。そのプレビューウインドウの左上に再生ボタンがあるので試しに動かしてみましょう。

プレビューウインドウがInspectorの一番下に最小化された状態で隠れている場合があります。そのときは、上端をドラックして上に引き上げてください。
また、もしプレビューウインドウのモデルがワニでない場合、ウインドウの右上の人マークをクリックするとプレビューのモデルを選択できます。

次に、この「Idle」を選択した状態で、「ctrl+D」(Macでは「command+D」)でファイルを複製します。するとのこ「Idle」ファイルのみが複製されます。この複製された「Idle」をドラック&ドロップで先に作成した「Create/AnimatorController/Croc」フォルダに移動します。

これが、まずは使用する「Idle」アニメーションになります。同じように他に使用するアニメーションを複製し移動していきます。複製するのは下記のアニメーションです。(()内が親の名前)

Idle(Monster_X@Idle) 待機中アニメーション
Walk(Monster_X@Walk) 歩きアニメーション
Attack(2)(Monster_X@Attack(2)) 攻撃アニメーション
Dead(Monster_X@Dead) 死亡時アニメーション

複製、フォルダに移動したら「AnimatorController」フォルダにある「EnemyCrocAnimatorController」をダブルクリックしましょう。すると「Animator」ウインドウが開き初期状態は下記のようになっています。

この四角は「ノード」と言われるもので、キャラクターアニメーションを構成する一つ一つの状態を表します。これらを追加したり線で繋いだりしてアニメーションの遷移を設定していきます。

複製しなくても使用はできますので、そのほうがいい方はそれでも構いません。ここでは使用ファイルを別途まとめておくことで分かりやすくするために複製しています。

AnimatorControllerの作成

では先ほど作成した、AnimatorControllerである「EnemyCrocAnimatorController」に複製したアニメーションを設定して遷移を作成していきます。

まず「Croc」フォルダにある「Idle」を「Animator」ウインドウ内にドラック&ドロップします。すると「Idle」というオレンジ色のノードができ、「Entry」という緑色のノードから自動的に矢印が繋がったかと思います。

「Entry」というのは開始位置でそこから「Idle」に矢印が伸びていると、開始したらまず「Idle」アニメーションが始まります。

では他の遷移を設定していきましょう。まず「Croc」フォルダに複製した「Idle」以外の「Attack(2)」「Dead」「Walk」をAnimationウインドウにドラック&ドロップして、適当に並べておいてください(並び方は処理に影響はありませんので見やすいようにお好きに並べてください)。

遷移の作成

矢印をつないでいきましょう。つないだ結果が下記画像になります。

まずは、矢印をつなぐには開始ノード、たとえば「Idle」で右クリックして「MakeTransition」をクリック。するとマウス位置に「Idle」から矢印が伸びるのでそのまま繋ぎたいノード、たとえば「Walk」をクリックすると「Idle→Walk」の遷移ができます。逆に「Walk→Idle」を作成するときは「Walk」を右クリックして「MakeTransition」をクリックすればOKです。

では追加した矢印を一覧にします。「遷移元→遷移先」です。

Idle → Walk
Walk → Idle
Attack(2) → Idle
Any State→ Attack(2)
Any State→ Dead
パラメータの作成

次にパラメーターを作成します。パラメーターというのは、アニメーションの遷移の条件になるもので下記の種類があります。

Float 小数(指定値より大きい(Greater)か小さい(Less)か)
Int 整数(指定値より大きい(Greater)か小さい(Less)か)
Bool ブール値(trueかfalse)
Trigger トリガー(実行時のスイッチみたいなもの)

まずAnimationウインドウの左側の上部のタブが「Layers」「Parameters」とありますので「Parameters」を選択してください。

次に上部にある「+」ボタンを押して、「Trigger」を押します。すると新しいTriggerパラメーターができますので、それを「Attack」という名前にします。

同じようにもう一つのトリガーを作成し「Dead」という名前にします。次に「Float」のパラメータを追加して「Speed」という名前にしましょう。これでパラメータの作成の完了です。

HasExitTimeとCondtionsを使った遷移条件の設定

最後にどの矢印がどんな条件で遷移するのかを設定していきます。

まずは「Idle→Walk」の「⇨矢印」を選択してInspecterを見てください。このような表示になります。重要な部分を解説します。

 

Has Exit Time アニメーションの終了で遷移するかのフラグ
Conditions 遷移条件

「Idle」は「待機中のアニメーション」で、「Walk」は「歩きアニメーション」です。この遷移は移動速度を条件にしたいので、まずは「Conditions」の右下の「+」マークをクリックして左側を「Speed」を選択し「Greater」「0.1」にします。

そして「HasExitTime」は「false」にします。これで、アニメーションの終了で終わらずに、「Speed」の値が「0.1」より「大きい(Greater)」場合に「Idle」から「Walk」に遷移するようになりました。

ここで、「HasExitTime」を「false」にしている、つまりアニメーションが終わっても遷移はしないので、アニメーションが遷移しないときはループさせておく必要があります。

なので、「Croc」フォルダにある「Idle」アニメーションを選択してInspectorで、「LoopTime」を「true」にしておきましょう。また同様に「Walk」のアニメーションも選択し「LoopTime」を「true」にしておきます。

では他の遷移を設定していきます。それぞれ矢印を選択しInspectorで設定します。

遷移 Has Exit Time Conditions
Walk → Idle false Speed/Less/0.1
Attack(2) → Idle true (なし)
Any State→ Attack(2) false Attack(Trigger)
Any State→ Dead false Dead(Trigger)

Animator ControllerをEnemy1のモデルにセットして再生

最後にここまでで作成した「EnemyCrocAnimatorController」をヒエラルキーのEnemy1/Monster_X_GreenのインスペクターのAnimatorのController部分にアタッチしましょう。

これでAnimatorControllerの設定の完了です。一旦再生してみましょう。

この段階では「Idle」アニメーションを繰り返している状態になります。

 

NavMeshを用いた敵キャラクター移動処理の作成

次に敵の移動処理を作成していきます。

移動には「NavMesh」というUnityで使用できるAI機能を使っていきます。これを使うことで、細かい経路はしていなくても、目的地に向かって勝手に経路を計算して移動してくれるようになります。

では、まずAIが移動するためのフィールドを指定します。

フィールドにStatic設定

移動するのは当然地面ですので、まずはHierarchyで地面である「Forest/Terrain」を選択してInspectorを見てください。右上に「Static」という項目がありますのでここにチェックを入れます。(おそらく「Terrain」は最初から入っているのでそのままでOK)

また、橋がありここも歩けるようにしたいので「Forest/Bridge」と「Forest/Bridge(1)」にも同じように「Static」にチェックを入れてください。

このとき下記のようなウインドウが出ますので、「Yes, change children」を選択してください。意味は「子のオブジェクトも全てStaticに変更しますか?」です。

フィールドのNavMesh設定

次にUnity上部のメニューから「Window/AI/Navigation」を選択し「Navigation」ウインドウを開きます。そして「Navigation」ウインドウの上部の「Bake」を選択し、値は特に何も考えず下記のように設定して「Bake」ボタンを押しましょう。

簡単に説明すると、「Agent」つまりナビメッシュで移動するものの移動できる高さや角度を設定しています。とりあえずはあまりいじらなくても大丈夫なので、現状は極端な変更はしないようにしましょう。

「Bake」を押して少し待つと「Static」に設定していたものが、「Scene」ウインドウで青くなっているのがわかると思います。この青い部分が移動できる部分になります。

もし青くならない場合は、「Scene」ウインドウ右上の「Gizmo」が有効になっているか、また右下の「NavMeshDisplay」の「ShowNavMesh」にチェックが入っているかを確認してください。

移動経路の作成

次に敵の移動経路、目的地になる位置を作成します。まずはこの位置情報をまとめるために「EnemyMovePoints」という空オブジェクト作成してください。

そして、その子に「Cube」を作成し「Goal」という名前にして「Scale」を( 0.2, 1, 0.2)にしておきましょう。

これはただの目印なので「Cube」でなくて空オブジェクトでも構いません。ここでは解説用に見やすいように「Cube」を残しておきます。残している場合は「Cube」の場合「BoxCollider」などコライダーが初めからついていますので消しておいてください(RemoveComponent)。

これらを適当に今回は4つに複製します。そのそれぞれを地面の少し上くらいに来るように散らしてNavMeshの青い移動できる位置に配置してください。

なお、見やすいようにワニの敵を広めの位置に移動していますが、どこでやっても大丈夫です。

この位置を目的地として、あるゴールに着いたら他のゴールを目指す….を繰り返して徘徊させます。

処理の作成

では処理を作成していきましょう。ここで同時にアニメーションの設定処理も作成していきます。

追加するのは「EnemyCrocodile」です。

続きを読む

このコンテンツはパスワードで保護されています。 コンテンツを読みたい方はUnity入門の森ショップ(https://unityforest.stores.jp/)で講座閲覧権を取得してね。

障害物を避ける移動AIを作成する方法 NavMeshObstacleの使い方

最後に「NavMeshObstacle」を解説します。これは詳細な設定になりますのでやらなくても問題にはなりません。

簡単にいうとナビメッシュ上の障害物を設定できます。たとえば現在ナビメッシュが移動できる経路上に岩があったりします。そして岩はコライダーを持っています。

その上で「Enemy1」もコライダーを持っているので、岩にひっかかると動けなくなったりする可能性もあります。

そこで、岩を障害物として設定することで、その部分のみを歩けない場所として設定することができます。

では、まずは一部の岩に適応してみましょう。

適用するのは下の画像の二つで「Stone01(3)」「Stone02(4)」という名前です。分かりやすいように名前の頭に「+」を付けておきますが、付けなくても大丈夫です。好きなもの、また全てに適応しても構いません。

ではこの二つにInspectorの「AddComponent」で「NavMeshObstacle」を付与します。そして「Shape=形」「Center=中心」「Size=大きさ」を「Scene」ウインドウにでる緑色の枠を参考に設定してください。そして必ず「Carve」にチェックを入れましょう。

形状大きさの設定ができたら、再度「Navigation」ウインドウを開いて「Bake」を押しましょう。すると、設定した部分が青くなくなっているのがわかると思います。

これでNavMeshで移動しているものが、岩を避けて移動するようになります。

これで作業は完了です。

再生して動きを確かめてみてください。開始したら、どこかの目的地に向かって歩き出し近づいたらまた別のところに向かって歩き出すという敵キャラが徘徊する移動処理ができていたらOKです。

また、攻撃して倒してみるとちゃんと倒れるアニメーションが再生されることも確認しておきましょう。

今回は以上です。次回はコウモリの方の移動処理をまた別の方法で作成していきます。

次回の記事 : 

FPSゲームの作り方8 Unityで空を飛ぶ敵の自動行動AI・プレイヤー追尾処理を作る
この記事はFPSゲームの作り方講座の第8回目です。空を飛ぶ敵のAIを作成していきます。 前回はNavMeshを使って敵の移動処理、そしてNavMeshObstacleを使って敵が障害物を避ける処理等を作成しました。 前回の記事:...


Unity入門の森オリジナル本格ゲーム制作講座はこちら
8種類の本格ゲームの全ソースコード公開・画像&動画による解説付き

コメント

タイトルとURLをコピーしました