ゲーム作りの合間に息抜きのゲーム作り パート8
ただいま製作中のゲーム! UnrealEngine4で『暁の航路』制作中(メインプログラマー:GAISUTO) Unityで『(タイトル未定)』制作中(メインプログラマー:ざわわ) UnrealEngine4で『大旗取合戦(仮タイトル)』(息抜き&学習用)
本職に影響がでないように製作するので結構スローペースになります。 原稿の合間に落書きを描いて、ゲーム作りの合間に息抜きでゲームを作って、仕事の合間はゲームをして息抜き。
——–本日!——–
NPCユニティちゃんの数を増やして試してみたところ、かなり重くなったので、AIを軽くする方向でもう1つ作ってみました。 パート7で作ったのが、全体探索のレベル上全フラグクラスを探索するAI 新たに作ったのが、全フラグの場所と色情報だけを持ったものを検索するAI
結果は、あまり変わらなかったです。
ただ、もう1つAIを作ったおかげで、FPSを大きく下げる原因を見つけることができた。 LineTraceByChannelのラインを表示させていたのが原因みたいです。 これがあるときに40体ぐらいだしてると、FPSの通常が70ぐらいで、団子が大きくなったあたりで30ぐらいまで落ちてた。 LineTraceByChannelを切ったら、通常が90~100、団子が大きくなってもあまり変化なし。
処理がちょっとごちゃっとしたので採用しなかったけど、とりあえず作ったので備忘録だけ残しておく。
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を返します。
レベルBPの中身。 フラグを作成する際に、位置情報と色情報を追加しています。 追加された配列の位置が位置情報と色情報を結びつけます。 ごちゃごちゃしているのは、AppendとPrintStringを使って、自分がほしい形でデバッグ情報をだしているからです。
AIConrollerの中身。 TeamTag(BlueTeamかRedTeamの文字列情報)をキャラクターのカプセルコンポーネントのタグから送ってもらって、番号に置き換えています。 ブラックボードを使う宣言をして、ブラックボードのTeamTagに取得してきたTeamTagを、TeamColorにさっき置き換えた番号をいれます。 この後で、ビヘイビアツリーが起動してます。
Flagの中身。(パート4参考) パート4で作ったフラグの続きに作ってます。 Flag自身が自分の位置情報を使いゲームインスタンスの位置配列からインデックスと色配列を取得。 インデックスで色配列に変更を加えていきます。 新しい色情報で上書きできたらよかったのですが、見つからなかったので、新しい自分を追加して古い自分を削除するかたちをとりました。
ゲーム作りの合間に息抜きのゲーム作り パート7
ただいま製作中のゲーム! UnrealEngine4で『暁の航路』制作中(メインプログラマー:GAISUTO) Unityで『(タイトル未定)』制作中(メインプログラマー:ざわわ) UnrealEngine4で『大旗取合戦(仮タイトル)』(息抜き&学習用)
本職に影響がでないように製作するので結構スローペースになります。 原稿の合間に落書きを描いて、ゲーム作りの合間に息抜きでゲームを作って、仕事の合間はゲームをして息抜き。
——–本日!——– 『ゲーム作りの合間に息抜きのゲーム作り パート6』で作成したAIの振る舞いを変更せず、BPのみから、ビヘイビアツリー(以後、BT)とブラックボードを使う変更を行いました。
NPCBTTask_MoveはいろいろやってるうちにBTに用意されているMoveToを使うことになったので、破棄。
NPCキャラのBPのBeginPlayの後半を変更。 カプセルコンポーネントにいれているチームタグをNPC_AIControllerに送っているだけです。
NPC_AIControllerに送ったタグを変数にいれて、ブラックボードを使う宣言をして、ブラックボードにチームタグを書き込んで、ビヘイビアツリーを起動してます。 ブラックボードのチームタグはまだ使ってません。 今後どうするかは検討中。 NPC・NPC_AI・ブラックボードの3つにタグの変数をたらい回しにしてるのがあまり気持ちよくない。
ビヘイビアツリーが起動されたら、シーケンスの左から処理をしていきます。 FlagSearchで全フラグを調べて、向かうFlagを決める。行く先が決まったら、MoveToで向かう、決まらなかったらずっと調べ続けるという流れです。
NPCBTTask_Searchの中でTargetFlagBTにセットした値をブラックボードのTargetFlag(Flagクラス)にいれてます。
BlackBoardKeyにTargetFlagをいれてます。
NPCBTTask_Searchの中身。 AIからタグと本体を持ってきてます。 処理の中身は前回と同じです。
全部のFlagをみて、行く先が見つかったら、Success! 目的地に向かいます。 行く先が見つからなかったら、3秒まってfailure! 目的地を探し続けます。
~今後~ ブラックボードに、変数をインスタンス全域で同期させるチェックがあったからここにFlagクラス情報を持たせて、レベル上を毎回全部チェックしなくていいようにできないかな。 ここの変数に持たせたクラスが参照だったら、レベルBPで最初に全部突っ込んでおいて、あとはここを見続けるだけでいいんだ。 そうでなかったら、フラグが変更されるたびにブラックボードの値を書き換えにいく。 レベルBPやアクターからブラックボードの数値を書き換えにいけるのかなぁ
NPCユニティちゃんが自動で生成されて、チームタグを召喚地点によって変化するようにしたいな。
ゲーム作りの合間に息抜きのゲーム作り パート6
ただいま製作中のゲーム! UnrealEngine4で『暁の航路』制作中(メインプログラマー:GAISUTO) Unityで『(タイトル未定)』制作中(メインプログラマー:ざわわ) UnrealEngine4で『大旗取合戦(仮タイトル)』(息抜き&学習用)
本職に影響がでないように製作するので結構スローペースになります。 原稿の合間に落書きを描いて、ゲーム作りの合間に息抜きでゲームを作って、仕事の合間はゲームをして息抜き。
——–先日!——– ぷちコン制作、UE4勉強会、アンリアルフェスなどなど大忙しの日々を過ごしてました。 やっと落ち着いて開発できる。平日は3Dモデリングばっかりで、UE4ももっと触りたい。
さて、大旗取合戦の仲間や敵NPCのAIを作りはじめました。 今回作成したのはこちら、全体探索型近く狙い
NPCキャラのBP 頭の上のアイコンのマテリアルインスタンスを作って、キャラのCapseleComponentのタグの0番目に青チームか赤チームの文字をいれているのでチーム分け。 頭の上のアイコンの色がここで変化します。
チームの色情報をNPC_AIControllerに送る。
ここからNPCのAI チームの色を保持して、Flagクラスを全部取得して全部見ていく。 2回目に呼び出されたとき、TargetFlagを持ってると困るので、ここで初期化。 これで空っぽにしてくれてるみたいなんだけど、こういう使い方って大丈夫なのかな。
TargetFlagが空なのでIsNotValidから出てきます。
マクロの中で、Flagが自分のチーム以外のものだったらこのFlagをそのままTargetFlagにします。
TargetFlagを1つ確保している状態で、他のFlagを見ていきます。 自身から一番近いFlagをターゲットにするようにTargetFlagを置き換えていきます。 GetDistanceToの上側で自身と他のFlagの距離を、下側で自身と確保しているFlagの距離を取得して、小さい方(近い方)をObjectで取得。 Flagにキャストして、TargetFlagにします。
全部のフラグを見終えて、TargetFlagがあったらそこに向かう。 無かったら3秒まってもう1回調べます。
このAIの問題点 ・旗の中にいるときに他の旗に変化すると一旦旗の外にでてから触らないといけない。 自分がいる位置が他のチームの旗なので取ろうとして動かなくなる。
ゲーム作りの合間に息抜きのゲーム作り パート5
ただいま製作中のゲーム! UnrealEngine4で『暁の航路』制作中(メインプログラマー:GAISUTO) Unityで『(タイトル未定)』制作中(メインプログラマー:ざわわ) UnrealEngine4で『(タイトル未定)』(息抜き&学習用)
本職に影響がでないように製作するので結構スローペースになります。 原稿の合間に落書きを描いて、ゲーム作りの合間に息抜きでゲームを作って、仕事の合間はゲームをして息抜き。
——–本日!——– 息抜きでUnrealEngine4でゲームを制作です。本日は5時間半、累計制作時間29時間 長時間座りっぱなしで体が・・・カッチカチになってしまいそう。 そうだ、ラジオ体操をしよう。 一気に体がほぐれるので結構おすすめです!
作業 ・NPCユニティちゃんの追加。まだ動かない。 ・ユニティちゃんが攻撃できるようになった。まだ見た目だけ ・マップの拡張
○NPCユニティちゃんの追加。まだ動かない。 キャラクターBPを「PNPoawn_SD_unitychan」と名前をつけて作成。 TagにBlueTeamを付けて、マップに配置して、動かないけど青チームのユニティちゃんが出現! 敵の視野チェック参考:http://unrealengine.hatenablog.com/entry/2014/10/11/003032 NPCユニティちゃんからライントレースがでます。 緑のラインが貫通で赤のラインがぶつかったら途切れるみたいです。
[LineTraceByChannel]のOut Hitからライントレースに当たったアクターの情報をとってきて、[BreakHitResult]で情報の分解をして、タグを取得します。 いろいろ試行錯誤をして、次の形に落ち着きました。 試行錯誤・・・なんででしょう・・・[ActorHasTag]がユニティちゃんが持っている"Player"というタグに反応して、tlueという返事を返してくれません!!! -●-●-●-が通過しているルートです。 なんでぇ・・・
○ユニティちゃんが攻撃できるようになった。まだ見た目だけ 攻撃参考(下記のURLのスレッドの13-20を参考) http://unrealengine.hatenablog.com/entry/2015/07/05/180000 自分の周りに広がるエフェクト(ShotWeapon2)のあと、とんでいく(ShotWeapon)の2つのエフェクトを組み合わせました。
あ、左クリックじゃなくて、Xキーで発動するようになってます。
モーションはこんな感じに、ちょっとジャンプして片手を上げる感じになります。(次回)
今後のモーションも含めて、ATKフォルダを作ってまとめておきました。
階段の先のフロアに上段と下段が出現! 下段から向こう側の下段を橋みたいなので繋いでみましたハラハラゾーンです! ここで接敵すると怖いですねぇ恐ろしいですねぇ暴れるのが楽しそうです。
<次回> ・NPCユニティちゃん、決められたルートを走る! ・ユニティちゃん、攻撃時のモーションが付く! 天に右手を掲げ、落ちる稲妻! ・マップの拡張! 上段と下段どっちを通るのがいいの?
ゲーム作りの合間に息抜きのゲーム作り パート4
ただいま製作中のゲーム! UnrealEngine4で『暁の航路』制作中(メインプログラマー:GAISUTO) Unityで『(タイトル未定)』制作中(メインプログラマー:ざわわ) UnrealEngine4で『(タイトル未定)』(息抜き&学習用)
本職に影響がでないように製作するので結構スローペースになります。 原稿の合間に落書きを描いて、ゲーム作りの合間に息抜きでゲームを作って、仕事の合間はゲームをして息抜き。
——–本日!——– 息抜きでUnrealEngine4でゲームを制作です。本日は6時間、累計制作時間23時間30分 久しぶりにバゲットを丸々1本使ってサンドイッチ作った。 太くておっきいので半分はお昼ごはん、もう半分は夜ご飯です。 今日のパンは顎がしんどい。
作業 ・旗に触れると旗が変化して、チームの得点が加算される。
まずは、ブループリントを整理しました。 GameModeのブループリント(ゲームのルール) GameInstanceのブループリント(レベルが変わっても値を持っている) レベルが変わるとは(タイトルレベル→バトルレベル→リザルトレベル)みたいなもの ブループリントなんてどれも同じだろうと思ってたのでGameInstanceの存在を知って目から鱗でした。 得点を加算とか減算ってゲームのルールじゃないのかなぁとGameModeでずっと作ってましたが破棄しました。
編集→プロジェクトの設定 GameInstanceに自分の作ったMyGameInstanceを設定。 これで値を保持してくれるはず! 一応、GameDefaultMapとEditorStartupMapに作業中のマップを設定して、 DefaultGameModeもThirdParsonのやつからBattleModeに変更。 DefaultPawnClassはユニティちゃんです。
MyGameInstanceの中身。 5つほど変数を作りました。 得点関係、時間関係、旗の位置情報(※) ※使い道なかったら削除予定
旗に触れて旗が変化する部分の処理 TriggerBoxにFlag(int型)の変数を作ったので、そこを初期化しておきます。 最初は0に固定されてるという安心感がほしい。 Flag:0が中立旗、1が赤旗、2が青旗
・自分は赤チーム、旗中立の時の流れ(青チームが接触したときも同じ流れ)
・赤の得点加算 ・中立フラグかそうでないかを見る →中立旗の場合(なにもしない) →青旗の場合(青の得点減算)
・旗の情報を赤にする。
旗が赤へ変化した後、シーケンスで2つ処理 1つ目はMyGameInstanceから赤得点をゲットして、1足して、セット。 [Switch on int]にこのBoxTriggerのFlag情報をいれます。 Flag情報が0なら中立旗なので、Flag情報に1をいれて赤旗にします。 2なら青旗なので、青の得点を減算して、Flag情報に1をいれて赤旗にします。 (今後、加算・減算系は関数化すると思います。)
スコアを表示 本番ではゲーム時間が10分の場合5分の時に30秒だけ表示するようにしようと思います。 4チームバトルができるようになったらこれが、面白い方向に作用してくれるはず! 見た目の部分は、パレットから画面にVerticalBoxをドラッグ&ドロップ設置して、その中にTextを2つ上下に設置。 右側のプロパティの中でContentのTextに上側はRedTeamScore、下側は0と設定 下側のTextの一番右にバインディングを作成とあるので作成 バインディング ここが納得がまだいってない場所! GameInstanceの参照ができない! なのでキャストで作成してます。 関数の名前をRedTeamScoreにして、得点をMyGameInstanceからゲットして、[ToText]で得点をtext型にして、ReturnValueに与えます。 これで表示されている0が変化します。 どうにかすれば、こんな感じにシンプルになるはず、"NOTE"という表示もなくなるし
つぎにゲーム画面でRedTeamScoreと得点を表示させる。 コンテンツブラウザとかフィールドが表示されている画面の上のツールバーのブループリントから レベルブループリントを開いて、ゲームが始まったらウィジェットを表示するようにします。 [GameStateウィジェットを作成]で上で作ったGameStateを作成して、AddtoViewportで画面に表示。
あとは、ゲームを初めて、旗に接触したら旗が変わって、赤チームタグを持つユニティちゃんなので 赤チームの得点が加算されます。
<次回> ・NPCユニティちゃんが出現!? ・フィールドを拡張、陸地から続く長い階段の先に待つフロアは一体・・・
ゲーム作りの合間に息抜きのゲーム作り パート3
ただいま製作中のゲーム! UnrealEngine4で『暁の航路』制作中(メインプログラマー:GAISUTO) Unityで『(タイトル未定)』制作中(メインプログラマー:ざわわ) UnrealEngine4で『(タイトル未定)』(息抜き&学習用)
本職に影響がでないように製作するので結構スローペースになります。 原稿の合間に落書きを描いて、ゲーム作りの合間に息抜きでゲームを作って、仕事の合間はゲームをして息抜き。
——–本日!——– 息抜きでUnrealEngine4でゲームを制作です。本日は4時間半、累計制作時間17時間30分 あれ・・・意外と今日の作業時間短い ・触れるとキャラクターの所属するチームの色に変化する旗を作ったぞー ・フィールドを拡張
〈メモ〉 旗を自分の色に変えることがこんなにも大変なのか!! 土曜日は出かけてたので、ノーパソでエクセルに旗の処理の流れを3つぐらい準備してたのに、組み合わせれるかと思ってたものが組み合わせれなかったりして、速攻で設計変更することになった。
○触れるとキャラクターの所属するチームの色に変化する旗を作ったぞー ユニティちゃんBPでチーム識別用のタグをつける。 BP上で上書き可能らしいので、ゲーム開始前にチーム設定で変更できるようにしていきたい。 とりあえず、赤チームにしました。
パート2で組んだ旗用のBoxTriggerのBPを改造していきます。 BoxTriggerに触れたら[Get Components by Tag]でターゲット(ボックスに触れたユニット)からタグを取得する。 ・・・・・・のではなく、[Get Components by Tag]で触れたユニットがRedTeamのタグを持っていたら、持っているタグを全て次に渡して、[Get]で渡された配列の0番地にあるRedTeamというタグを次に渡して、[ComponentHasTag]で渡されてきたタグがRedTeamというタグか?という問答でイエスを返させる。 そうすると[ブランチ]は真という回答をだします。 ブルーチームが触れたときはの流れは、赤とほぼ同じ流れで下で待機してて、上側のブランチが偽をだし、真という回答を送りたそうにしている下のブランチの背中を押してあげる。
上記の先の処理 [DoOnce](一度通ると、2回目はResetを押されるまで次の処理に行かない)物を使います。 参考(最初に知っておきたいBlueprintノード集):http://historia.co.jp/archives/534
赤チームの流れの続き、[DoOnce]を通過して、赤旗を設置後、音を鳴らして、中立旗もしくは、青旗を見えなくします。そのあと、青チームの[DoOnce]のResetを押しに行く。 で、まだテスト中に1度も音が鳴ってない!!あれぇ・・・おっかしいなぁ
○フィールドを拡張
階段を下りる場所から橋を作り、大地を作り、奥へと会談を伸ばし、フロアを作り、そしてさらに右側に伸びる。 形的には + になりそうな感じです。真ん中をつないだり、上下をさらに作ったりして、シンプルでいてかつ走りがいのあるマップにしていきたい。 あと10パートぐらいで + の形にはなりそう。
<次回> ・得点を管理するBPとすべての旗の情報をもったBPを作る ・NPCユニティちゃんが出現!? ・フィールドを拡張、陸地から続く長い階段の先に待つフロアは一体・・・