この記事はUnityとC#を用いてFPSゲームを作成する講座の第7回です。
前回は敵を作成し、矢を当ててHPを減らし倒せるようにしました。
前回の記事:
今回は前回作成した敵キャラクターが移動などの行動をとれるようにしていきましょう。
NavMeshを使用した敵の徘徊移動パターンの作り方
ではまず「Enemy1」という名前のワニっぽい敵を動かしていきましょう。
AnimatorContoller
まずは、アニメーションを設定します。
「Assets/AppMain/Animator」フォルダ(なかったら作成してください)に、右クリック「Create/AnimatorController」で新しいアニメーターコントローラーを作成し「EnemyCrocAnimatorController」という名前にします。
そして、同じところに「Croc」というフォルダを作成しておきましょう。
アニメーションの複製
続いて、「Assets/Creature_Monsters_X/Animation」にあるファイルを見てください。このうちの一つ「Monster_X@Idle」というファイルの左の三角マークをクリックして子を開きます。すると、下の方にある「Idle」というファイルを選択します。
これがアニメーションのファイルで選択すると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」です。
障害物を避ける移動AIを作成する方法 NavMeshObstacleの使い方
最後に「NavMeshObstacle」を解説します。これは詳細な設定になりますのでやらなくても問題にはなりません。
簡単にいうとナビメッシュ上の障害物を設定できます。たとえば現在ナビメッシュが移動できる経路上に岩があったりします。そして岩はコライダーを持っています。
その上で「Enemy1」もコライダーを持っているので、岩にひっかかると動けなくなったりする可能性もあります。
そこで、岩を障害物として設定することで、その部分のみを歩けない場所として設定することができます。
では、まずは一部の岩に適応してみましょう。
適用するのは下の画像の二つで「Stone01(3)」「Stone02(4)」という名前です。分かりやすいように名前の頭に「+」を付けておきますが、付けなくても大丈夫です。好きなもの、また全てに適応しても構いません。
ではこの二つにInspectorの「AddComponent」で「NavMeshObstacle」を付与します。そして「Shape=形」「Center=中心」「Size=大きさ」を「Scene」ウインドウにでる緑色の枠を参考に設定してください。そして必ず「Carve」にチェックを入れましょう。
形状大きさの設定ができたら、再度「Navigation」ウインドウを開いて「Bake」を押しましょう。すると、設定した部分が青くなくなっているのがわかると思います。
これでNavMeshで移動しているものが、岩を避けて移動するようになります。
これで作業は完了です。
再生して動きを確かめてみてください。開始したら、どこかの目的地に向かって歩き出し近づいたらまた別のところに向かって歩き出すという敵キャラが徘徊する移動処理ができていたらOKです。
また、攻撃して倒してみるとちゃんと倒れるアニメーションが再生されることも確認しておきましょう。
今回は以上です。次回はコウモリの方の移動処理をまた別の方法で作成していきます。
次回の記事 :
コメント