2017年6月10日土曜日

UnityでNPC作りたい_前編

Unityで敵さんのNPCを作るとき、色々方法はあるらしいのですが、今回はQiitaからビヘイビアツリーなる物をEditor上で作れるシステムがあり、それを弄って使おうと思ったらサンプルの構成や各ファイルの意味が理解できなかったので、自分なりにまとめた。
Editor拡張のFrameworkを使ってBehaviour Designer のようなAIシステムを作る。



Unityちゃんのプレハブについて
最初からあるようなやつ(=AIに関係ないやつ)
Transform
位置(X,Y,Z)と姿勢(ピッチ、ヨー、ロール)の情報。

Animator
アクション時のアニメの設定。
(これないと動けなくなる)

Rigidbody
物理エンジンに関わる各係数の情報。

CapsuleCollider
当たり判定の設定。
(これないと床をすり抜けて落ちる)

AIに必要なやつ
ThirdPersonCharacter
動く際のパラメーター。要はステータスみたいなモノ。
スタンダードアセットについてくるスクリプト。
(これないとスポーンした直後にアクションできないので宙に浮いたまま動かなくなる)

ActionController
ハイキックの状態保持やアニメーションを行うために有る。
(これないと走り続けて落下する)

Pown
スポーン地点に戻る為にある?(正直わからない)
(これないと回復しようとする際、相手に向かって走り続ける)

BTreeAction
AIの行動処理があるスクリプト。
(これないとそもそもスポーンした直後にアクションできないので宙に浮いたまま動かなくなる)

BTreeDecoratorFunc
AIの条件式があるスクリプト。
(これないとスポーンした直後にアクションできないので宙に浮いたまま動かなくなる)

BTreeManager
Btreeの操作を行うスクリプト。
(これないとスポーンした直後にアクションできないので宙に浮いたまま動かなくなる)

RunTimeNodeEditor
画面上にNodeEditorを表示するスクリプト。
(これないとゲーム開始時にNodeEditorの動きが見れない)

設定されている各スクリプトの説明
BTreeManager
AIの一番最初に動くやつ。最初はこれを見てね。
こいつはAIの読み込み、構築が主な仕事内容。
構築が終わったらメソッド「Update」で
延々とノードの実行、非実行を行い、AIを動かす。

Start
AIのスタート地点です。
別途指定されているAIファイルへのパスを基に、AIファイルをロードする。
開始ノードを探し、そこからノードの作成を行い、BTreeを構築する。
ちなみに指定されているファイルは「BTreeSample」なので、
そのファイルを消したり書き換えたりすると動きが変わるよ。

CreateNodes
ノードの作成、登録を行う。
「Start」から呼ばれる。
具体的なノード作成は「CreateBehaviorTreeBase」に投げる。
作成は投げ、変数への登録はこいつがする。

ちなみに、登録前に構築したBtreeの全ノードが「Ready」状態か確認しています。
Startノードはまあ開始してるわけですが、それ以外にも「Ready」状態じゃない場合、
「ResetCoroutineStart」が2回呼ばれて、再初期化を試みます。
普通はロード時、全てReady状態なので、たぶんリスポン用ですねこれ。

CreateBehaviorTreeBase
ノードの具体的な作成を行う。
「CreateNodes」から呼ばれる。
Btree特有のプロパティやアクションの設定をしてくれる。

ResetCoroutineStart:Btreeの再構築を行う。
具体的な処理は「ResetCoroutine」に投げる。


ResetCoroutine
最初に停止場所がある。※コルーチン:処理の中断、再開を行えるプログラム構造。
ノードの全削除、トップノードからの再登録を行う。

ChangeColorTask
ノードの実行と非実行を切り替える処理。
なんにしてもノードの実行はこいつが握ってます。
そしてこいつは「Update」で常に呼ばれ、ノードを動かします。

BTreeDecoratorFunc
Btreeのデコレーターノードに適用されるメソッド群がここにあります。
要はAIの行動の条件となる処理が、ここに全てあるわけです。

ここに定義されているメソッドは、エディター上で使用可能で、
逆にここで定義しないと、それはエディター上で使用できません。
つまりここで条件を書き、エディター上で条件分岐ノード(デコレーターノード)として
始めて使えるようになるわけです。

BTreeAction
Btreeのアクションノードに適用されるメソッド群です。
要はAIの行動処理が、全てここにあるわけです。

つまりここで条件を書き、エディター上で行動ノード(アクションノード)として
始めて使えるようになるわけです。

ちなみにダメージを受ける処理もここに有ります。

ActionController
「BTreeAction」で行われるアクション時、
アニメーションを動かしたり、ログを出力しているのがここです。
それ以外のことはしてません。

これを自前のゲームキャラクターに持たせるとなると、これらのスクリプトにあるステータス参照、アニメーション参照、各ロジックを色々弄くりまわす必要が出てくる。

次はパッドコントローラーを通した入力を前提に、NPCを動かすとかしてみる予定。