11001001 (C9)

UE4の勉強用覚え書きやお仕事、3DCG関連、雑記など書いていきます。

UE4 覚え書き キャラクターのAIを作成する

モブくまキャラクターにAIを搭載して、自くまキャラを追いかけてくるBPを作りました。

www.youtube.com

登場するピンクのモブくまは最大で300匹!1秒毎にスポーンされるようにしています(笑)最初はレベル内を適当に歩き回っていますが、自分のキャラを発見すると追いかけてくるというAIになっています。発見してすぐはガンガン追っかけてきますが、数秒経つと途中で追うのを諦めるような仕組みにしてます。(そうしないと凄く機械的な感じになってしまうのでバラツキがでるようにしています。)

下準備

①AIを設定するキャラクターを作成する。

ブループリントクラス(親クラス=キャラクター)を新規作成して、メッシュのコンポーネントの詳細設定の「Mesh」にAIを設定したいキャラクター(今回はしろくま)のスケルタルメッシュを設定、「Animation」の「Anim Class」の欄は「Mesh」で設定したキャラクター用のアニメーションBPを設定する。

 

②AI Controllerのブループリントクラスを作成する。

ブループリントクラス(検索からAI Controller)を新規作成。

作成後、①で作成したAIキャラクター用BPを開き「クラスのデフォルト」ボタン(プレイやコンパイルボタンの並び)を押すと詳細の設定画面が出てくるので、その中の「AI Controller Class」の項目を②の初めで作成したAI ControllerのBPに変更しておく。

 

 ③ビヘイビアツリーを作成する。

新規追加からAI→ビヘイビアツリーでビヘイビアツリーを作成する。

②で作成したAI Controllerのイベントグラフを開いてビヘイビアツリー実行用のノードRun Behavior Treeを追加する。

f:id:uzupiyo:20181110155003p:plain

「BTAsset」の項目を③の初めで作ったビヘイビアツリーにしておく。

ビヘイビアツリーの主な役割はキャラクターが行動する上での判断分岐を司る部分のようです。

 

 ④ブラックボードを作成する。

新規追加からAI→ブラックボードでブラックボードを作成する。

「新規キー」からベクター形式のキーを作成する。今回は「Move Location」という名前で作成。(ここにAIが移動したい位置の情報が納められる)

f:id:uzupiyo:20181110160846p:plain

③で作成したビヘイビアツリーを開いて、「Blackboard Asset」の項目を作成したブラックボードに変更しておく。

f:id:uzupiyo:20181110161731p:plain

ブラックボードの主な役割はAIに必要な情報(モブくまの移動目的座標、自くまキャラの位置座標など)を保管するためのもののようです。

 

実際に動作するAIを作っていく

⑤ビヘイビアツリータスクの作成

 ビヘイビアツリーを開き、メニューの中から「新規タスク」をクリックする。するとコンテンツブラウザ内に新しいブループリントクラスが作成されるのでそれを開く。

f:id:uzupiyo:20181112001915p:plain

モブくまがレベル内のどこに向かって歩いていくかをランダムで決定するブループリントを設定する。

f:id:uzupiyo:20181112003004p:plain

 

⑥ビヘイビアツリーの作成

基本はブラックボードがROOTとなりそこから矢印が伸び、分岐してモブくまの行動が変化していくようになる。

f:id:uzupiyo:20181112004642p:plain

ビヘイビアツリーの行動の流れは常に上から下へ、行動の分岐は左から右へと行われる。(ノードの右上に〇で囲まれた数字が行動が実行される順番)

※タスク処理、デコレーターに関しては今回は割愛して別途まとめ&研究したいと思います。

 

⓻モブくまの行動可能範囲を設定する

「モード」の「ボリューム」から「Nav Mesh Bounds Volume」を選んでレベル内に配置する。このボリューム内に収まっている範囲がモブくまの移動可能な範囲になるので、大きさ、位置などを調整して配置する。

f:id:uzupiyo:20181112010146p:plain

配置するとモブくまが歩行移動可能な地面が緑色になるのですが、自動的に歩く場所を検出してくれるので凄く優秀!道が細すぎると歩行可能と認識されないようですが、これは凄く便利な機能ですね。

f:id:uzupiyo:20181112011202p:plain

 

⑧モブくまが自くまキャラを捜索するようにする

②で作成したAI Controllerを開き、ビューポート内で「コンポーネントを追加」から「Pawn Sensing」コンポーネントを追加する。 f:id:uzupiyo:20181112012557p:plain

このコンポーネントは他のキャラクターが視界に入ったか、物音がしているかを判定するもので、視界の範囲の設定なども可能。

 

⑨自くまキャラを発見した際のBPの処理を作成

まず、ブラックボードに自くまキャラを発見した際の情報を格納しておくキーを作成しておく。今回は「Player」というキーを「Object型」で作成。

 次に追加した「Pawn Sensing」コンポーネントを右クリックして、「Add Event」から「On See Pawn」イベントを追加する。

f:id:uzupiyo:20181113023803p:plain

On See Pawnイベントはモブくまが自くまキャラを発見した際にイベントが発生する。発見すると、自くまキャラの情報をBBの[Player]キーに書き込むような仕組み。[Player]に自キャラ情報が書き込まれると、ビヘイビアツリーでMove To Playerの処理が行われるようになる。

f:id:uzupiyo:20181113023817p:plain

また、モブくまたちの動きに不規則さを持たせるために、発見して6秒追いかけてきた後に追うのを諦める(正確には見失うですが)処理も入れてます。ここの処理ではBBの[Player]にnullを入れる事で自くまキャラを追いかけなくなるようにしています。

  

以上、少し端折ってるところもありますが、AIに関しては細かく書き出すとキリがないような気がするのでとりあえずここまで・・。

UE4 覚え書き イベントディスパッチャーを使ってみる

今回はイベントディスパッチャーを使用して1つのアクターへの操作を切っ掛けに他のアクターへの指示を出すブループリントを作成してみました。

Unreal Engine | イベント ディスパッチャー

作ったものは以下のアクター2つを用意して

f:id:uzupiyo:20181028142840p:plain

「A」キーを押すと「test_pylamid」アクターが「Hello」と発信、続いて「test_box」アクターのBPを呼び出して「World」と発信するというもの。

f:id:uzupiyo:20181028143238p:plain

呼び出し対象となるアクターは複数でも大丈夫なので、「test_box」をコピペして増やして実行すると、増やした分だけ「World」の発信の数が増えます。

下準備

f:id:uzupiyo:20181028143958p:plain

発信元のアクターでイベントディスパッチャーを作成。それをBP内に「呼び出す」で配置する。

f:id:uzupiyo:20181028144134p:plain

 発信先のアクターでは、まず発信元のアクターを変数化(変数名「Hello Text」=「test_pylamid」)、インスタンス編集可にチェックを入れ、BP内に配置、更にそこから青線のリンクを伸ばしてBind Event to~ノードで先ほど作成したイベントディスパッチャーとバインドする。

イベントディスパッチャー用のイベント発生ノードは自動的に作られるので、そこに実行したいBPを繋げる。

f:id:uzupiyo:20181028145731p:plain

また、発信先アクターの詳細内に「デフォルト」という項目が出来るので、そこの項目は発信元アクター名が入るようにしておく必要があります。(これを忘れるとエラーになる)

UE4 自主練 シーケンサーを使ってムービーを作ってみた

UE4シーケンサー「Level Sequence」を使って簡単な実機ムービーを作ってみた。

www.youtube.com

新規で作ったアニメーション素材などはない状態で全てありものだけで作成しています。シーケンサー自体の使い方はPremiereあたりが使えれば理解しやすいし、制作時間20分くらいでカメラワーク含めて出来たのでかなりお手軽な感じで実機ムービー作れます。

将来的にはUE4で短編アニメとか作りたいと思っていますが、まるまる1話をシーケンサーのみで作るのは無理があるのかな・・?数カット毎にレベル別に分けてムービーを書き出し、他の映像編集ソフトでつなげる方が現実的かも。

UE4 覚え書き スコア表示と加算処理

画面上へのスコアを表示と箱を破壊するとスコアに100点ずつ追加されるという処理を追加しました。(スコアは足されていくがゲーム的要素は皆無・・)

www.youtube.com

下準備

①スコア管理用BPの作成

新規追加でブループリントクラスから「GameStateBase」のクラスを作成する。

f:id:uzupiyo:20181021003836p:plain

作成したBP内でスコア用の変数をINT型で作成、「インスタンス編集可」にチェックを入れておく。

また、プロジェクト設定の「マップ&モード」の「Game State Class」の欄を上記で作成したBPの名前に変更する。

 

②UIの作成

 新規追加でユーザーインターフェイスから「ウィジットブループリント」を作成する。

f:id:uzupiyo:20181021021013p:plain

ブループリントを開くとUIデザインの画面になるので、左側にある「パレット」からTextを選び任意の場所に配置していく。今回はスコア表示なので「SCORE:」の文字とスコアの数字が入るテキスト2つを作成する。テキストの内容は「Content」⇒「Text」に記入する事で変更できる。スコアの数字の方は「000000」などにしておいて、更にバインドの項目をクリックして「バインディングを作成」を選択。すると以下のようなノードが新しく出来るので

f:id:uzupiyo:20181021022449p:plain

ここに①で作成したBPからスコアの数値を引っ張ってくるBPを追加

f:id:uzupiyo:20181021022957p:plain

①で作ったBP(MyGameState)からCastしてScoreの変数の内容をゲットしてくる。

スコアの加算処理

箱を破壊したら100点追加という事で、加算の処理は破壊の処理の後に追加する事にした。Castしてスコアの数値を持ってくるという部分は上記のスコア表示の際と同じ処理なのでBPをコピペして流用する。

f:id:uzupiyo:20181021024341p:plain

単純にゲットしてきたスコアに100を足したものをセットするという処理を行う。

 ----------------------------------------------------------------------------------------------------------

 UIに関してはゲームの見栄えを左右するところでもあるので、フォントの使い方、ゲージの表示など今後も細かく勉強していきたいです。

UE4 覚え書き BPにてマテリアルを変化させる

 UdemyのUE4のコースに出てきたキャラクターがアクターに接触するとアクターの色が変化するという処理をちょっとアレンジしてまとめました。

youtu.be

触ると色が変化(発光)します。 

 
 マテリアルの準備

f:id:uzupiyo:20181018232033p:plain

エミッシブカラー(発光色)にMultiplyノード(乗算)を繋げ、「A」にConstans4Vectorノードで赤い色を、「B」にScalarParameterノードを繋げる。

ScalarParameterは他のBPからの制御によって値が変化するので、値によって赤い発光具合が変化する。

 

マテリアルインスタンスの作成

まずはBPクラスで今回発光させるアクター(今回は円柱)を作成する必要がある。

f:id:uzupiyo:20181019010912p:plain

更に、マテリアルの内容をBPでコントロールする場合は、マテリアルインスタンスを作成する必要がある。

  • Create Dynamic Material Instance

Targetとなるのは今回発光させようとしている円柱のアクター(En Cyuu)

Return Valueからは「Promote to variable(変数に昇格)」で変数にする必要があるようです。(今回は「Henka MID」という変数にしてます)

 

キャラクターとの接触判定⇒マテリアルに変化を加える

f:id:uzupiyo:20181019020344p:plain

  •  Cast to ThirdPersonCharacter

Event Hitの「Other」の中には円柱にヒットしたアクターの情報が入っているので、Cast to~ノードを使用してThirdPersonCharacter(プレイヤーキャラ)かどうかの判定を行い、判定が「真」の場合のみ次の処理工程に進む。

タイムライン内の情報はスカラーパラメーターに渡される数値が入っています。

インスタンス化したマテリアルに変化を加えるため、「Henka MID」をゲットしてきて、そのスカラー値に変化を加えたいので、Set Scalar Parapeter Valueノードを作成、Valueをタイムラインからの出力を繋げるとタイムラインの数値変化をスカラー値に渡すことが出来る。

  •  Set Scalar Parapeter Value

注:Parameter Nameの欄は、変化を行いたいマテリアルのスカラーパラメーターの名称と同じに合わせておく必要がある。

UE4 覚え書き 被破壊性メッシュの作成&破壊!

被破壊性メッシュを使用してオブジェクトの破壊表現を試してみた。

www.youtube.com

下準備

①破壊するアクターを作る

まず、コンテンツブラウザ内の破壊したいオブジェクト(スタティックメッシュ)を右クリックしてメニューの中から「被破壊性メッシュを作成」を選択。

f:id:uzupiyo:20181013002239p:plain被破壊性メッシュの設定画面が出るので、「フラクチャメッシュ」ボタンを押せば自動的に破片に分割してくれる。破片の細かさを調整したい場合は、「フラクチャ設定」⇒「Voronoi」⇒「Cell Site Count」の数値を大きくすれば分割数が増える。

②アクター破壊用のブループリントクラスを作る

コンテンツブラウザ内にブループリントクラスを「Actor」クラスで新規作成する。そのBPクラスをダブルクリックして設定画面を出るので「コンポーネントを追加」から「Destructible」を選択。

f:id:uzupiyo:20181013024031p:plain

詳細設定に被破壊性メッシュの設定を入れられるようになるので

f:id:uzupiyo:20181013025513p:plain

 「Destructible Component」の「Destructible Mesh」の項目に①で作成した被破壊性メッシュを入れる。

「Materials」の項目は「エレメント0」が被破壊メッシュの表面の質感、「エレメント1」が断面の質感になるので必要に応じて入れる。

メッシュ破壊発動用のBPを作成

上記の動画では、くまがキューブに1回触れると赤く発光、2回目に触れた際にキューブが破壊され同時に爆発エフェクトが発生するという流れになっていますが、発光部分は後日自主練でまとめなおすとして今回は破壊部分のBPのみをまとめる事にします。

イベント自体はくまとの接触判定にて開始。

f:id:uzupiyo:20181013030905p:plain

被破壊性メッシュのある座標に爆発エフェクトを発生

  • Spawn Emitter at Location

f:id:uzupiyo:20181013031503p:plain

キューブの破壊開始。

破壊開始場所を被破壊性メッシュのある場所にしていするようにしているが、位置の表記が何故「Location」でなく「Hurt Origin」なのかは謎。。

f:id:uzupiyo:20181013031719p:plain

全体的な流れは以下のような感じになります。

f:id:uzupiyo:20181013203722p:plain

 くまとの接触回数は「Count」変数に記録され、1回目の場合はキューブが発光、2回目の場合は爆発エフェクトを発生させた後にキューブの破壊処理を行うようになっています。

UE4 覚え書き コンポーネントに相対的な変化を加える

今回課題で作成したキャラクターがドアに近づくと扉が自動的に開くというもので、ドア全体(アクター)の向きは変わらず、扉部分(コンポーネント)だけ開閉するような処理になっています。

f:id:uzupiyo:20181012232142p:plain

ドアに近づいたかどうかの判定はBOXコリジョンで判定。BOX内に侵入した場合はドアの開閉アニメーションのタイムラインが再生され、BOX外に出た場合はリバースで再生される。

f:id:uzupiyo:20181012232714p:plain

Targetは扉にすることで扉が回転するようになる。

 

今考えると、ヘリのローターはこれで回せば良かったんでは・・・と思ったけど、やり方はどうあれちゃんと回っているので問題無いかなと・・。