読者です 読者をやめる 読者になる 読者になる

ゲーム作りの合間に息抜きのゲーム作り パート8

ただいま製作中のゲーム! UnrealEngine4で『暁の航路』制作中(メインプログラマー:GAISUTO) Unityで『(タイトル未定)』制作中(メインプログラマー:ざわわ) UnrealEngine4で『大旗取合戦(仮タイトル)』(息抜き&学習用)

本職に影響がでないように製作するので結構スローペースになります。 原稿の合間に落書きを描いて、ゲーム作りの合間に息抜きでゲームを作って、仕事の合間はゲームをして息抜き。

——–本日!——–

NPCユニティちゃんの数を増やして試してみたところ、かなり重くなったので、AIを軽くする方向でもう1つ作ってみました。 パート7で作ったのが、全体探索のレベル上全フラグクラスを探索するAI 新たに作ったのが、全フラグの場所と色情報だけを持ったものを検索するAI

結果は、あまり変わらなかったです。

ただ、もう1つAIを作ったおかげで、FPSを大きく下げる原因を見つけることができた。 LineTraceByChannelのラインを表示させていたのが原因みたいです。 これがあるときに40体ぐらいだしてると、FPSの通常が70ぐらいで、団子が大きくなったあたりで30ぐらいまで落ちてた。 LineTraceByChannelを切ったら、通常が90~100、団子が大きくなってもあまり変化なし。

こんな感じでテストしてました。区切りはあまり意味ないです。 20160605221320

処理がちょっとごちゃっとしたので採用しなかったけど、とりあえず作ったので備忘録だけ残しておく。 20160605221015 20160605221217

 

NPCVTTask_FlagSearch_BTの中身。 フラグの位置と色の情報は、位置配列と色配列でゲームインスタンスに持たせるようになってます。 配列の番号で紐づくようになってます。

~流れ~ ・自分の位置を保持。 ・AIContorollerにキャストして、自分のチームカラーを取得。 ・Targetの位置を初期化 ・ゲームインスタンスにキャストして、全フラグの色配列と位置配列を取得。

色配列でループをまわす。(Elementを使ってすぐに旗の判別ができる) ・色配列ループのIndexを使って、位置配列から位置を取得。 ・自分の色と違うなら真の処理にすすむ。 ・初期化された直後なら真にすすむ(1つ目に来た位置情報をTarget候補にする) ・TargetVectorの位置情報が入っている(2つ目以降のループ)なら位置を比較して、 ・自分から近い方をTarget候補にする。 ・Target候補と自身の距離、ループで回ってきた位置情報と自身の距離を比較。 ・X座標Y座標Z座標を絶対値にして足して比較しています。 (数学の3次元の距離計算をすると処理がえらいことになるので簡略化してます。)

ループが終わった後の処理。

・Targetが決まったら、FINDで位置配列からTargetのインデックスをとってくる。 ・そのインデックスで色配列から色情報をとってくる。(自身が立っている場所が敵のフラグで、一旦離れなければ旗を取れないときの処理に使います) ・Targetが初期状態の場合、偽にすすみ、3秒待って、もう一度ループ(取れるフラグがない時) ・Targetが決まっている場合、ブラックボードに位置情報を書き込む。(これをビヘイビアツリーでMoveToに渡して、移動してもらいます。)

Flag3Count(これが一旦離れて旗を奪う処理です) 3回連続で同じフラグをTargetにしたら、Targetから少し離れてビヘイビアツリーにfailureを返す。離れてもすぐに次のTargetとしてこのフラグが選ばれるので、旗が取れます。 (最有力候補にあがるだけなので、離れた瞬間味方が奪うと、別をターゲットとします。)

・3Count配列に色情報がない場合は真へ進み3Count配列に追加。Successをビヘイビアツリーに返す。 ・3Count配列に色情報がある場合は、来た色情報と今持っているの色情報を比較。 ・違う場合は配列を捨てます。Successをビヘイビアツリーに返す。 ・同じ場合は追加します。 ・追加した情報が2つ目の場合はSuccessをビヘイビアツリーに返す。 ・追加した情報が3つ目の場合はTargetから少し離れた位置に移動します。 (チームによって移動する位置をずらそうとしてました。) (今気が付いたのですが、チームカラーが2、つまり青チームのとき動かなかったのって、ここのPawnをつなぎ忘れてたからか) ・配列を空にして、failureを返します。

20160605221238 2016060522105020160605221101 20160605221105 2016060522113520160605221141

レベルBPの中身。 フラグを作成する際に、位置情報と色情報を追加しています。 追加された配列の位置が位置情報と色情報を結びつけます。 ごちゃごちゃしているのは、AppendPrintStringを使って、自分がほしい形でデバッグ情報をだしているからです。 20160605221522 2016060522150020160605221505

AIConrollerの中身。 TeamTag(BlueTeamかRedTeamの文字列情報)をキャラクターのカプセルコンポーネントのタグから送ってもらって、番号に置き換えています。 ブラックボードを使う宣言をして、ブラックボードのTeamTagに取得してきたTeamTagを、TeamColorにさっき置き換えた番号をいれます。 この後で、ビヘイビアツリーが起動してます。

20160605221537 2016060522155620160605221601

Flagの中身。(パート4参考 パート4で作ったフラグの続きに作ってます。 Flag自身が自分の位置情報を使いゲームインスタンスの位置配列からインデックスと色配列を取得。 インデックスで色配列に変更を加えていきます。 新しい色情報で上書きできたらよかったのですが、見つからなかったので、新しい自分を追加して古い自分を削除するかたちをとりました。 20160605235436

2016060523545920160605235531

20160605235550

最後にちょっとだけ。 ランプ追加した。 20160605230017