週刊SleepNel新聞

SleepNel所属のぽうひろが日々の個人開発で気になったことを綴ります。

RAIN(AI)でWayPointパトロールAIを実装してみた

みなさん、こんにちは。ぽうひろです。

突然ですが、ゲームを作成するとき、敵の動きをプログラムするのめんどくさいですよね。

あ、そうでもないですかねw

僕はめんどくさいので、アセットの力を借りたいと思います。

RAIN AI for Unity
https://www.assetstore.unity3d.com/jp/#!/content/23569
f:id:pouhiroshi:20170405192716p:plain

こちらのアセットを使えば、(あまり)プログラミングしないでAIによるキャラクターの動作を制御することができます!!

今日は、決めたポイント(Waypoint Route)をうろうろパトロールする処理をやってみましょう。
まずはじめに、大事な設定を行います。
RAIN->Help->SettingsからShow Advancedをチェックしておきます。
これを行うとRAINの細かい設定ができるようになるのですが、この中に、視界センサが壁を突き抜けないようにする設定が混ざっており、デフォルトがOFFなんですよね。。。。
なんでONにしとかないの!悪意を感じます・・・

では、はじめにAIを作成します。
f:id:pouhiroshi:20170405193711p:plain
AIをつけたいキャラクタを選んで、メニューバーにあるRAIN->CreateNew->AIを選びます。
するとAIコンポーネントが作成され、Inspector上でいろいろ設定を行うことができます。

まずは視覚センサーをつけましょう。
f:id:pouhiroshi:20170405194431p:plain
作成されたAIオブジェクトを選ぶと、Inspector上にRAIN Rig ScriptがGUIで表示されます。
この中の「目」のアイコンを選ぶとセンサーの設定ができます。
Add Sensorセレクトボックスから「Visual Sensor」を選びます。すると、
視界の範囲が作成されます。紫色の帯の範囲です。
f:id:pouhiroshi:20170405194708p:plain
視界は360度にしていますが、Horizon Angleで90度とかに狭められるので、狭めてみましょう。
f:id:pouhiroshi:20170405194820p:plain

次にパトロールするポイント(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);
	}
}

とりあえずこれで実行してみましょう。
f:id:pouhiroshi:20170406095722p:plain
はい、緑色の丸みたいなポイントがWayPointです。

f:id:pouhiroshi:20170406095708p:plain
WPNというオブジェクトをInspectorでみると、Waypoint NETWORKにちゃんと4つWaypointが設定されてますね。

これだけではパトロールしませんので、最後にAIを作成します。
ツリーエディタがあるので、これで部品を組み合わせて作ります。
キャラクターに作ったAIの頭のアイコンタブを開くと下の方にOpen Behavior Editorというボタンがあるのでクリックします。
f:id:pouhiroshi:20170406100042p:plain

すると、Behavior Editorというウインドウが開きますので、右のBehavior Treeの中から、Create New Behavior Treeを選びます。
f:id:pouhiroshi:20170406100207p:plain
すると名前を聞かれますので、なんでもいいのですがPatrolAIとでもしておきましょうか。
f:id:pouhiroshi:20170406100331p:plain
すると選べるようになりますので、選ぶと編集ができるようになります。
f:id:pouhiroshi:20170406100430p:plain
右クリックで追加部品を選べます。Create->Dicisions->Waypoint Patrolを選びましょう
f:id:pouhiroshi:20170406100727p:plain
WAYというのが追加されましたね。必要な項目を記述します。
Waypoint Route の所に作成したWaypointRigの名前を文字列で入力します。
GameObject tObject = new GameObject("WPN"); としたので、"WPN" と書きます。eと書いてある部分はプログラム記法で書いてねという意味らしいので、ここでは文字列なのでダブルクォーテーションで囲まないとエラーになります。
あと、Move Target Variableに 移動対象変数名を宣言します。ここにはeと書いてないので、ダブルクォーテーションで囲まなくて良いです。
好きにつけて良いのでwpとしておきます。

さて、ここからwaypointpatrol部品上で右クリックして、子ノードを追加します。
Create->Actions->Moveを選びます。
f:id:pouhiroshi:20170406101144p:plain

moveが追加されたら、必要な項目を設定します。
Move TargetにWaypoint Patrolで設定したMove Target Variableの変数名 wpを入れます。eと書いてあるのでダブルクォーテーションで囲むと思いきや、プログラム記述になるのでwpのままでOKです。
Move Speedも設定します。ここは数値なのでダブルクォーテーションで囲まなくて良いです。1としておきましょう。
f:id:pouhiroshi:20170406101735p:plain

はい、これで必要な設定は終わりました。AIの保存は自動でやってくれるようです。
最後にAIのBehavior Treeで今作成したAIを選びます。
PatrolAIでしたね。
f:id:pouhiroshi:20170406101538p:plain

はい、これでひとまず完了です! 実行してみましょう!

警官がWaypointをパトロールしていますね!

Behavior Treeで、mecanimでアニメーション制御とかもできるので、歩かせたりとかもできます。

あまりSampleがなく、最初はかなりとっつきにくいですが、慣れたらサクッと敵AIを作れるようになるのではないでしょうか!!(勉強中)

次回は、パトロール中にプレイヤーを発見したら、追っかけてくるようなAIを発展させて作ってみようと思います。

それではまた!