RAIN(AI)でWayPointパトロールAIを実装してみた
みなさん、こんにちは。ぽうひろです。
突然ですが、ゲームを作成するとき、敵の動きをプログラムするのめんどくさいですよね。
あ、そうでもないですかねw
僕はめんどくさいので、アセットの力を借りたいと思います。
RAIN AI for Unity
https://www.assetstore.unity3d.com/jp/#!/content/23569
こちらのアセットを使えば、(あまり)プログラミングしないでAIによるキャラクターの動作を制御することができます!!
今日は、決めたポイント(Waypoint Route)をうろうろパトロールする処理をやってみましょう。
まずはじめに、大事な設定を行います。
RAIN->Help->SettingsからShow Advancedをチェックしておきます。
これを行うとRAINの細かい設定ができるようになるのですが、この中に、視界センサが壁を突き抜けないようにする設定が混ざっており、デフォルトがOFFなんですよね。。。。
なんでONにしとかないの!悪意を感じます・・・
では、はじめにAIを作成します。
AIをつけたいキャラクタを選んで、メニューバーにあるRAIN->CreateNew->AIを選びます。
するとAIコンポーネントが作成され、Inspector上でいろいろ設定を行うことができます。
まずは視覚センサーをつけましょう。
作成されたAIオブジェクトを選ぶと、Inspector上にRAIN Rig ScriptがGUIで表示されます。
この中の「目」のアイコンを選ぶとセンサーの設定ができます。
Add Sensorセレクトボックスから「Visual Sensor」を選びます。すると、
視界の範囲が作成されます。紫色の帯の範囲です。
視界は360度にしていますが、Horizon Angleで90度とかに狭められるので、狭めてみましょう。
次にパトロールするポイント(WayPoint)を作成します。
ここではプログラムから4地点作ってみます。
WaypointRigというコンポーネントにWayPointをAddしていくイメージです。
using System.Collections; using System.Collections.Generic; using UnityEngine; using RAIN.Navigation.Waypoints; public class EnemySample : MonoBehaviour { // Use this for initialization void Start () { CreateWaypointNetwork(); } // Update is called once per frame void Update () { } void CreateWaypointNetwork() { GameObject tObject = new GameObject("WPN"); tObject.transform.position = Vector3.zero; WaypointRig tWaypointRig = tObject.AddComponent<WaypointRig>(); //Choose either Network or Route for the type tWaypointRig.WaypointSet.SetType = WaypointSet.WaypointSetType.Network; tWaypointRig.Serialize(); Waypoint point1 = new Waypoint(); point1.Position = transform.position + new Vector3(5f,0.2f,0f); Waypoint point2 = new Waypoint(); point2.Position = transform.position + new Vector3(10f,0.2f,0f); Waypoint point3 = new Waypoint(); point3.Position = transform.position + new Vector3(10f,0.2f,5f); Waypoint point4 = new Waypoint(); point4.Position = transform.position + new Vector3(5f,0.2f,5f); tWaypointRig.WaypointSet.AddWaypoint(point1); tWaypointRig.WaypointSet.AddWaypoint(point2); tWaypointRig.WaypointSet.AddWaypoint(point3); tWaypointRig.WaypointSet.AddWaypoint(point4); } }
とりあえずこれで実行してみましょう。
はい、緑色の丸みたいなポイントがWayPointです。
WPNというオブジェクトをInspectorでみると、Waypoint NETWORKにちゃんと4つWaypointが設定されてますね。
これだけではパトロールしませんので、最後にAIを作成します。
ツリーエディタがあるので、これで部品を組み合わせて作ります。
キャラクターに作ったAIの頭のアイコンタブを開くと下の方にOpen Behavior Editorというボタンがあるのでクリックします。
すると、Behavior Editorというウインドウが開きますので、右のBehavior Treeの中から、Create New Behavior Treeを選びます。
すると名前を聞かれますので、なんでもいいのですがPatrolAIとでもしておきましょうか。
すると選べるようになりますので、選ぶと編集ができるようになります。
右クリックで追加部品を選べます。Create->Dicisions->Waypoint Patrolを選びましょう
WAYというのが追加されましたね。必要な項目を記述します。
Waypoint Route の所に作成したWaypointRigの名前を文字列で入力します。
GameObject tObject = new GameObject("WPN"); としたので、"WPN" と書きます。eと書いてある部分はプログラム記法で書いてねという意味らしいので、ここでは文字列なのでダブルクォーテーションで囲まないとエラーになります。
あと、Move Target Variableに 移動対象変数名を宣言します。ここにはeと書いてないので、ダブルクォーテーションで囲まなくて良いです。
好きにつけて良いのでwpとしておきます。
さて、ここからwaypointpatrol部品上で右クリックして、子ノードを追加します。
Create->Actions->Moveを選びます。
moveが追加されたら、必要な項目を設定します。
Move TargetにWaypoint Patrolで設定したMove Target Variableの変数名 wpを入れます。eと書いてあるのでダブルクォーテーションで囲むと思いきや、プログラム記述になるのでwpのままでOKです。
Move Speedも設定します。ここは数値なのでダブルクォーテーションで囲まなくて良いです。1としておきましょう。
はい、これで必要な設定は終わりました。AIの保存は自動でやってくれるようです。
最後にAIのBehavior Treeで今作成したAIを選びます。
PatrolAIでしたね。
はい、これでひとまず完了です! 実行してみましょう!
RAIN AI Waypoint Patrol Sample : )
— ぽうひろ👊アーバンナックル (@pouhiroshi) 2017年4月6日
#Unity #RAIN pic.twitter.com/EolyYloiRk
警官がWaypointをパトロールしていますね!
Behavior Treeで、mecanimでアニメーション制御とかもできるので、歩かせたりとかもできます。
あまりSampleがなく、最初はかなりとっつきにくいですが、慣れたらサクッと敵AIを作れるようになるのではないでしょうか!!(勉強中)
次回は、パトロール中にプレイヤーを発見したら、追っかけてくるようなAIを発展させて作ってみようと思います。
それではまた!