ゲーム開発備忘録

ゲームプログラマー UE4・5向けの記事を書いておりますので見ていただけるとありがたいです。

【UE4・UE5】〈Tips〉物理マテリアルを使って押したアイテムが滑ったり跳ねたりするようにする。

目次

 

はじめに

物理マテリアルは、摩擦係数や弾力などの物理現象をセットアップしたものです。

その名の通り物理で動いているモノにのみ影響を受けます。

(SetSimulatePhyics + CollisionEnabled Physics)

特に通常のマテリアルと同じような運用ができ、マテリアル自体にも設定することができるので、凍りマテリアル=滑る物理アセットのような使い方もできます。

 

解説

①レベルの作成

サードパーソンテンプレートを使って解説します。

 

ファイル/新規レベルから

 

Basicを選びました。

 

名前を付けて保存しておきます。

 

②床の配置

物理マテリアルを適応する床を作ります。

アクタを配置からCubeを選びます。

 

スケールを20,2,0.1にしました。

 

③プレイヤースタートとアイテムの配置

ゲームを開始した際にプレイヤーのスポーン位置を固定できるようにPlayerStartを配置します。

 

ThirdPersonテンプレと一緒についてくるSM_ChamferCubeをマップに配置します。

 

この時めり込まないように気を付けてください。

 

詳細から可動性をムーバブル・SimulatePhysicsにチェックを入れます。



実行して押せることを確認しましょう。

 

確認出来たらスナップを100にして床とキューブをいくつか複製しておきます。

 

④物理マテリアルの作成

 

コンテンツ右クリックから物理マテリアルを作成。

名前は物理マテリアルのPM_を付けます。

 

今回は跳ねるPM_Bound、滑るPM_Slip、引っ掛かるPM_Stuckの3つを用意しました。

 

⑤物理マテリアルの適応

 

物理マテリアルの適応には主に2パターンあります。

1.マテリアルと紐づける

特定のマテリアルとペアにセットします。

特定の素材などと相性がいいです。

 

2.コンポーネントからoverrideする

コンポーネントの設定から上書きします。



今回はすべて同じマテリアルなので、2の手法で適応していきます。

一番左以外にそれぞれに物理マテリアルを適応しました。

 

⑥物理マテリアルの設定

PM_Boundを開いてみましょう。

 

一番いじるのはFriction(摩擦),StaticFriction(静止摩擦),Restitution(反発)の3つです。

 

Restitutionを1にしてみましょう。

 

浮かせた状態で実行してみましょう。

 

跳ねますw

 

次は、PM_Slipです。

摩擦を0にします。

 

少し触れただけで滑っていきます。

 

最後はPM_Stuckです。

摩擦を上げます。

 

押してもゴム素材の上のように動かしづらくなります。

 

物理アセットはアイテム自体にも床にもつけることができます。

 

スケート場には床側に、ゴムボールにはアイテム側につけるなど最適なセットアップを行いましょう。

 

 

最後に

UE4やUE5向けの記事を書いています。

皆様の応援が投稿のモチベーションになりますので

コメントやTwitterのフォローなどしていただけるとありがたいです。

それではよきゲーム開発を。

【ゼロからアンリアルエンジン5】〔AI編〕⑩NPCの注意をそらすアイテムを投げる仕組みを作ろう~予測線と投擲システム~

目次

 

はじめに

 

注意

UE5.0.3の現在の情報です。

今後のアップデートによりUIや機能が変更される可能性があることをあらかじめご理解ください。

 

弾道予測と投擲システムを解説します。

 

前回

namiton.hatenablog.jp

 

解説

①弾道予測関数を作る

弾道システムは以前こちらの記事でやりましたので、

これを応用して実装します。

namiton.hatenablog.jp

 

BP_ThirdPersonCharacterを開きます。

 

関数TrajectoryCalculationを作成します。

 

リターンノードを追加して画像のように組みます。

 

②ソケットを追加する

投げるアイテムの位置を決めるためにソケットを追加します。

 

SK_Mannequinを開きます。

hand_rを右クリックしてソケットを追加します。

名前はSocket_hand_rとします。

 

Previewアニメーションから投げるポーズを選択して

 

作成したsocketにPreviewアセットのCylinderを追加

 

持ってる風になるように位置合わせをします。

 

位置合わせが完了したら、プレビューアセットを取り除きます。

 

念のためスケールは戻しておきましょう。

 

 

③予測線を出す

作成した関数を使って予測線を出します。

 

カスタムイベントThrowTrajectoryを作ります。

 

画像のように組みます。

作成したソケットの位置からカメラの距離を元に目的地を作成して弾道を表示します。

ActorsToIgoneにSelfを入れることでプレイヤーキャラが弾道をブロックしないようにしています。


イベントの呼び出し
DoFの呼び出しを変更してこのイベントを呼べるようにします。

 

実行してみましょう。

予測線が出ていたら成功です。

またカメラのベクターの掛け算から投げる強さと方向を変更できます。

設定しやすいように変数化しておきましょう。

山なり具合を変更することもできます。

 

⑤ノイズ軽減用のフラグを作る

構えた状態で連続して投げるモーションをすると、画像のように一瞬関係のない予測線が表示されます。

 

原因はアニメーションブレンドです。

予測線のフラグはアニメーション通知のAC_ThrowEndを見ていますが、アニメーションを綺麗につなげるために0.2秒構えるまでにラグがあります。

 

そのため完全に構え終わったフラグを作成して、ラグを考慮するようにします。

 

投げられるかどうかのCanThrowを作ります。

 

投げるられるかの確認フラグに変更

ラグ(0.2秒)を考慮して0.25秒遅らせます。

予測のフラグにCanThrowを使います。

実行してブレンド中は表示されないことを確認しましょう。

 

⑤予測線のカスタマイズ

こちらの記事で紹介した通りです。

namiton.hatenablog.jp

 

▼全体像

⑥ガビガビをなくす

被写界深度を切っても、画面を激しく動かすと予測線がガビガビします。

これはモーションブラーのせいなので無効化します。

 

FollowCameraからMotionBlurを検索して0にします。

UpdateDoFにも設定しておきましょう。

ガビガビしなくなりました。

 

⑤予測線に色を付ける

こちらの記事を参考に

namiton.hatenablog.jp

 

半透明かつ影を落とさないようにします。

 

⑥BP_SparkGrenadeの編集

こちらの記事を参考に作ります。

namiton.hatenablog.jp

 

BP_SparkGrenadeを開きます。

コリジョンプリセットを編集します。

 

ループ処理を切断して、音が鳴ってから5秒後に自壊させます。

 

BeginPlayを削除してカスタムイベントThrowGranadeに変更します。

これで持っている間に爆発しなくなります。

 

予測線通りに飛ばすための仕組みを追記します。

 

⑦持つイベントの作成

 

BP_ThirdPersonCharacterにGrabItemをつくります。

 

インプットに持つか離すかのフラグを作って持っているものがあれば破棄するようにします。

 

その後、アクタを生成して用意したソケットにアタッチします。

Aimイベントに配置します。

 

自動でも再度持てるように追加します。

 


実行してみてアイテムを持つかどうか確認してみましょう。

 

⑧投げるイベントの作成

 

カスタムイベントThrowItemを作成します。

 

TrajectoryCalculationを開いて変数へ昇格します。



デタッチ後、BP_SparkGrenadeを呼び飛ばします。

 

⑨アニメーションにタイミングの指定

投げるイベントをアニメーション開始と同時に呼ぶとズレが出てしまうので遅延を入れてから呼び出します。

 

⑩キャラクターと干渉しないようにする

投げるアニメーションと投げるモノが干渉してしまうので、独自のコリジョンプリセットを作成して回避します。

 

プロジェクト設定を開きます。

 

コリジョンから新規オブジェクトチャンネルを押します。

 

PlayerPawnThrowItemを追加します。

 

新規プリセットからThrowItemPlayerPawnの二つを追加します。

それぞれが物理的に干渉しないようにします。

 

それぞれコリジョン設定を変更します。

▼BP_SparkGrenade

▼BP_ThirdPersonCharacter

・CapculeComponent

・Mesh

これで干渉しなくなります。

 

最後に

UE4やUE5向けの記事を書いています。

皆様の応援が投稿のモチベーションになりますので

コメントやTwitterのフォローなどしていただけるとありがたいです。

それではよきゲーム開発を。

【ゼロからアンリアルエンジン5】〔AI編〕⑨NPCの注意をそらすアイテムを投げる仕組みを作ろう~アニメーション編~

目次

 

はじめに

 

注意

UE5.0.3の現在の情報です。

今後のアップデートによりUIや機能が変更される可能性があることをあらかじめご理解ください。

 

今回はプレイヤーがAIが反応するアイテムを投げれるようにします。

長くなるので二部構成にして、この記事ではアニメーションを作成するまでを実装します。

 

前回

namiton.hatenablog.jp

 

解説

①エイムする仕組みを作ろう

エイムについては素晴らしい記事があるのでこちらを参考に実装します。

free-gamer.hatenablog.com

 

エイムするためのキーを割り当てます。

 

編集からプロジェクト設定

 

エンジン・インプットからアクションマッピングを追加から

 

Aimからマウスの右ボタンを設定します。

 

投げるアクションも作成しましょう。

 

BP_ThirdPersonCharacterを開きます。

イベントグラフにインプットアクションから作成したAimを設定します。

 

タイムラインを作成してフロートトラックを追加

 

0.25秒で0~1にするようにします。

 

このLarpからカメラのスプリングの値を変更します。

 

ゲームを実行して右クリックを押したらカメラが寄るようにします。

 

被写界深度は視認性に影響が出る可能性があるので、オンオフできるようにします。

変数のBool型を追加してUseDOFという名前に設定します。



記事のように関数を作成します。

ビネット効果を追加しました。

 

タイマーで関数を実行します。

 

UseDOFをオンにしていい感じの絵作りをします。

 

②移動速度を下げる

MaxWalkSpeedで移動速度を変更できます。

 

③アニメーションの適応

以前書いたこちらの記事を読んでThrowアニメーションを使用できるようにしてください。

namiton.hatenablog.jp

 

④ステートマシンの作成

ABP_Mannyを開きます。

ステートマシンからキャッシュされたポーズを作成します。

 

名前を変更します。

 

ステートマシンを新規作成して名前をOverride Statesとします。

 

ステートを2個追加します。

 

リネームします。

 

MainStatesにはキャッシュしたものを設定

 

遷移情報を取得できるようBP_ThirdPersonCharacterをキャストして変数化しておきます。

 

遷移の設定をします。

 

⑤アニメーションポーズの作成

まず構えるポーズを取得します。

リターゲットしたThrowアニメーションを開きます。

 

36フレーム当たりのポーズを使います。


アセットを作成→アニメーションを作成→現在のポーズ

名前はThrow_Anim_Poseとしました。

 

1フレーム分のアニメーションができた。

 

⑥トリミングしたアニメーションの作成

投げるポーズからアニメーションを再生するのではじめから再生すると重複してしまいます。そこで重複分をカットしたアニメーションを作成します。

 

Originalを複製します。

Throw_Anim_Cutとしました。

 

~35フレームをカットします。

 

同様に61フレーム以降を削除します。

 

⑦イベントの作成

投げたかどうか判定するThrow変数を作成します。

 

インプットアクションのThrowを出してエイムしているときにThrowをTrueにします。

 

⑧ステートと遷移の編集

▼完成図

 

まずAimStatesの中身です。

 

まずレイヤードブレンドで作成したポーズの上半身のみを上書きします。

これでspine_02より末端のアニメーションをPoseに上書きできます。

 

次にルックアットです。指定した骨に対してLocation方向へ向けることができます。

身体が60度以上曲がらないように制限しています。

 

ピンとして公開を押すことでLookatLocationをピンにできます。

そこから変数へ昇格しましょう。

 

LookatLocationに設定する変数は

カメラが見ている場所なので、アニメーションBPのイベントグラフからカメラからの正面1500の位置に向けるようにします。

 

次にThrowStatesの中身です。

やっていることはほぼ同じです。

再生しているのがPoseではなくCutなので気を付けてください。

またループは外しておきましょう。

左右に大きく動くアニメーションとルックアットの相性はよくないので省いています。

 

遷移一覧

 

▼AnimStatesとThrowStatesははじめから再生してほしいので

Always~にチェックをいれます。

 

▼投げたかどうかのフラグです。

 

▼投げた後に再び構える遷移です。

投げるアニメーションが9割再生されたら遷移します。

 

▼投げたらそのまま通常移動に戻る遷移です。

 

⑨アニメーション通知の設定

アニメーション通知を楽にするためにこちら記事を行ってください。

namiton.hatenablog.jp

 

EN_NotifyCategoryにActionを追加します。

 

BPI_ReceiveAnimNotifyにNotify_ActionEventを追加します。

 

BP_CustomAnimNotifyからインタフェースの呼び出しを追加します。

 

Throw_Anim_Cutの50フレームにカスタム通知を配置して名前をAC_ThrowEnd、CategoryをActionにします。

 

⑩イベントの編集

BP_ThirdPersonCharacterを開きます。

Actionイベントを実装します。

 

イベントから名前でスイッチを行いThrowフラグをFalseにするようにします。

 

実行してみましょう。

被写界深度のオンオフと投げモーションが正しく遷移するか確認しましょう。

 

よくよく見るとアニメーションのブレンドが綺麗に見えないところがあります。

これはMixamoからダウンロードしたアニメーションとUE5のアニメーションは別のモノだからです。AAAゲームがよく見えるのは高クオリティでつながりに違和感がない豊富なアニメーションが大きく作用していると考えています。

 

UE5のマーケットプレイスには高クオリティなアニメーションアセットが多数販売されています。見栄えのするアニメーションはモチベーションにもつながるので、ぜひ見てみてはいかがでしょうか?

 

 

www.unrealengine.com

最後に

UE4やUE5向けの記事を書いています。

皆様の応援が投稿のモチベーションになりますので

コメントやTwitterのフォローなどしていただけるとありがたいです。

それではよきゲーム開発を。

【ゼロからアンリアルエンジン5】〔AI編〕⑧プレイヤーを見失ったら探すNPCを作る。

目次

 

はじめに

 

注意

UE5.0.3の現在の情報です。

今後のアップデートによりUIや機能が変更される可能性があることをあらかじめご理解ください。

 

今回はプレイヤーを見失ったら最後に見た場所まで移動して探すNPCを作ります。



 

前回

namiton.hatenablog.jp

 

 

解説

⓪スムーズな回転を実装する

以前紹介させていただいたPavilion DV7さんの記事を参考に実装します。

qiita.com

 

▼CharacterMovementコンポーネント

RotationRateは180にしました。

▼クラスのデフォルト

 

ビヘイビアツリーに組み込むのでBTT_CustomMoveToというタスクを使用します。

Acceptance Distを100にして判定を甘くしている以外はそのまま利用させていただきます。

 

BTT_CustomMoveToは位置情報を元に移動するタスクなのでアクターを追いかける設定にしているMoveToタスクとはそのまま運用できないので修正します。

 

BTT_SetActionPointの修正

アクタキーからLocationKeyに変更します。

 

これでアクタへ移動するために移動先のアクタを渡していたのを、位置座標で指定できるようにしました。

 

音が鳴った時の挙動はそもそもLocationに向かうように運用していたので、そのまま入れ替えるだけで使えます。

 

プレイヤーを追いかける部分はこれまで通りMovetoで運用します。

 

▼全体像

 

実行してみましょう。

経路探索の表示とAIがいい感じに移動していたら成功です。

 

①見失ったキーの追加

BB_NPCを開きます。

bool型のキーLostPlayerKeyを作成します。

 

②コントローラーからキーの設定

BP_CustomAIControllerを開きます。

プレイヤーを見つけた分岐からLostPlayerKeyに見失ったらTrueにします。

 

③見失った位置を登録するタスクの作成

プレイヤーを最後に見た場所を設定するタスクをつくります。

名前はBTT_SetLostPlayerPositionにしました。

 

LocationKeyにプレイヤーの位置をセットするだけの簡単なタスクです。

④BTTClearKeyの改良

LostPlayerKeyをFalseにするためのタスクが必要ですが同じようなタスクを大量に作ると管理が大変なので同じタスクを使いまわせるようにします。

 

型に依存しないクリアを行うにはClearBackboardValueを指定します。

 

⑤ビヘイビアツリーに組み込み

 

まず聞こえたり見つけたりするよりも優先度はどちらも低いのでセレクターでまとめておきます。

Sequenceにデコレーターを追加してLostPlayerKeyで分岐を行います。

プレイヤーを探していることが分かるようにアイコンと色を設定します。

あとはプレイヤーの位置をセットして、ロストした位置に移動します。移動が完了したらLostPlayerKeyをクリア=falseにして再びこのSequenceが呼ばれないようにします。

 

実行してみましょう。
プレイヤーを見失ったらアイコンが変化して最後に見た場所に移動します。

移動中に再び視界内に入ったら追いかけます。

 

⑥+α もうちょい探すタスクを作る

最後に見た場所まで来てもプレイヤーは既にどこかに行ってしまっていることが多いでしょう。そこで見失った位置から一定の範囲内をランダムに移動できるようにします。

 

タスク名はBTT_SetRandomPositionとしました。

 

一定の距離からランダムな位置を取得するのは以下でできるのですが、もう少し高度な判定をしてみましょう。

 

以下の図のようにNPCを背にした範囲に移動してもプレイヤーがいる可能性が低いとします。その場合、このノードだけでは欲しい位置を取得することができません。

 

そこで内積を使うことで”いい感じの位置”になるまで再試行します。

EQSなどの機能でも実装できますが、今回は計算で行ってみたいと思います。

 

ココからは確認なので見るだけでも大丈夫です。

まず、ランダムな位置を300個作ります。

 

アクターの前ベクトルとランダム位置とNPCのベクトルを内積で計算して、使いやすいようにラジアンと度の変換を行います。InRangeでソートして結果を見てみましょう。 

 

このように前ベクトルから90度の範囲で分割されます。

 

MaxAngleを30にすると前方60度の範囲で分割できます。

 

ついでに最小範囲を除外しておきます。

 

これを使ってより優れた結果を厳選します。

こうして出来上がったタスクがこちらになります。

ビヘイビアツリーに組み込みます。



⑦スタック防止処理を入れる

NPCがスタックして到達できない場合の処理を入れます。

 

Move系のタスクにデコレーターのTimeLimitを追加します。

 

TimeLimitはノードに入ってから指定した時間を過ぎると失敗します。

Move系に入れることで20秒内に目的地に到着できなかったら失敗扱いになります。

失敗したら新しい目的地が設定されて移動を開始します。

 

▼全体像

最後に

UE4やUE5向けの記事を書いています。

皆様の応援が投稿のモチベーションになりますので

コメントやTwitterのフォローなどしていただけるとありがたいです。

それではよきゲーム開発を。

【UE5】〈Tips〉全部無料!!MixamoからアニメーションをUE5のキャラで使ってみよう

目次

 

はじめに

 

今回はアニメーション素材サイトで有名なMixamoというサイトからUE5にアニメーションを使えるようになるまでの解説です。

www.mixamo.com

 

解説

①アニメーションのダウンロード

サイトにアクセスしたらほしいアニメーションを選びましょう。

 

今回はThrowという投げるモーションをダウンロードしていきます。

 

ダウンロードを押すとこのような画面が出てきます。

ゲーム用に使うので60FPSにしました。

 

②UE5へインポート

ダウンロードできたらUE5のコンテンツにドラッグアンドドロップします。

 

今回はアニメーションをUE5のキャラクターで使用するので、ImportAnimationsをTrueにしてマテリアルは生成しないようにします。

 

③IKリグを作ろう

 

ここから先は以前書いたこちらの記事と同様です。

なのでやり方のみ書いていきます。

namiton.hatenablog.jp

 

コンテンツ右クリックからIKリグを作成。

 

この時インポートした骨を選択。

 

Hipsをリターゲティングルートに指定

 

チェーンを作っていきます。

 

このように、背骨、首、頭、左腕、右腕、左足、右足とセットアップして完了です。


リタゲ先のUE5モデル側も同様のセットアップをします。

 

④IKリターゲッタの作成

コンテンツ右クリックからIKリターゲッタを作ります。

 

コピー元はThrowを選択

 

名前はIKRetargeter_Throw_UE5Manneにしました。

 

⑤リタゲしよう

アニメーションの適応先のIKRigを選択

 

チェーンマッピングが一致していることを確認します。

ポーズの新規作成をして

 

ポーズの編集

 

骨を回転させて一致させます。

 

調整が終わったらポーズの編集を再度押しましょう。

 

 

アセットブラウザから任意のアニメーションを選んでうまく動いているか確認しましょう。

 

変な感じがしたら再度ポーズの編集をしてくださいね。

 

⑥エクスポートしよう

納得いくモーションになったら書き出しましょう。

 

完成!!

 

最後に

UE4やUE5向けの記事を書いています。

皆様の応援が投稿のモチベーションになりますので

コメントやTwitterのフォローなどしていただけるとありがたいです。

それではよきゲーム開発を。

【ゼロからアンリアルエンジン5】〔AI編〕⑦メ〇ルギア風にNPCが見つけたら頭の上にアイコンを出してみる

目次

 

はじめに

 

注意

UE5.0.3の現在の情報です。

今後のアップデートによりUIや機能が変更される可能性があることをあらかじめご理解ください。

 

今回はメタルギア風にAIの反応に応じて表示するアイコンを作ってみたいと思います。

 

解説

ウィジェットの作成

アイコンを表示するためのウィジェットを作成します。

 

コンテンツ右クリックからウィジェットブループリントを選択します。

 

ウィジェットブループリントの頭文字WBP_を付けて、WBP_NPCIconとしました。

 

適当にペイントソフトでアイコン用の画像を作成します。

 

素材は下に置いています。(商用不可)

▼?マーク

▼!マーク

そのままコンテンツにドラッグアンドドロップしてインポートします。

 

ウィジェットブループリントの編集

パレットからImageと検索してドラッグアンドドロップします。

 

Canvas Panelでラップします。

 

ついでに名前をIconImageに変更しておきます。

 

Imageの詳細からアンカーを真ん中にします。

 

位置を0,0

サイズを512×512

Alignmentを0.5,0.5

に変更します。

 

アンビアランスに画像を適応してカラーなどを変更します。

 

③アニメーションを作成する

 

ただアイコンを出すだけだと味気ないのでアニメーションを付けます。

下のタブからアニメーションを押してアニメーションウィンドウを出します。

 

+を押してMoveIconという名前にしました。

 

トラックを押してIconImageを選択します。

 

IconImageのトラックからTransformを選択します。

 

スケーリングのYにキーを打ちます。

タイムライン上の赤いラインを移動して長さを0.1秒にしましょう。

0の時に0を0.1の時に1を打ちます。

 

同様にVisibilityのキーも追加します。

 

0の時にHidden、0.01と0.1にNotHit-Tastableにします。

 

プレイを押してアイコンがあるので再生して調整します。

 

イメージとカラーの変更をするためにバインドを押します。

 

グラフに移動します。

 

関数名をSetIconImageにします。

 

ReturnValueを変数に昇格します。

名前はIconDataとします。

 

 

NPCキャラクターの編集

BP_NPC_Characterを開きます。

 

Widgetコンポジットを追加します。

 

ウィジェットClassに作成したウィジェットを設定します。

Headのソケットを選択してサイズと位置を修正しましょう。



 

調整が終わったら、WBP_NPCIconを開いてIconImageのVisibilityをHiddenにして非表示にしましょう。

 

ウィジェット制御関数の作成

ビヘイビアツリーとの制御はコントローラーで行っているのでそちらに作成します。

BP_CustomAIControllerを開きます。

 

関数の+を押してNPCWidgetControlとします。

 

インプットにSlateBrush型のIconDataとBool型のReverse、Bool型のNotDataSet(UseNowData)を作成します。

 

ウィジェットが存在するかチェックしてキャストします。

WBP_NPCIconは見やすいようにローカル変数に昇格しています。

 

アイコン用のデータを上書きするかどうかの判定を行います。

また、設定されたイメージ画像がない場合はアニメーションを再生しないように分岐します。

 

メモ

関数の中ではインプットに記述した内容をつながなくてもノードとして取得できます。

※ただしリネームした際には反映されないので注意!

 

ウィジェットからアニメーションの再生または逆再生を行います。

 

▼全体像

 

⑥アイコンを回転させる

このままだとアイコンは常にNPCの正面を向いてしまうので、改良します。

 

BP_NPC_Characterを開いてプレイヤーカメラを常にルックアットするように回転させます。

 

⑦タスクの作成と編集

ビヘイビアツリーからNPCWidgetControl関数を制御するタスクを作成します。

 

名前をBTT_ChangeIconとしました。

 

変数を4つ作成してそれぞれインスタンス編集可能にチェックを入れます。

 

次に画像のようにControllerからNPCWidgetControlを呼び出して変数をセットします。

 

⑧ビヘイビアツリーに組み込み

作成したタスクをビヘイビアツリーに組み込みます。

 

まずはランダム移動からです。

ここではアイコン非表示にする処理を行います。

 

左側はアニメーションを反転させるReverseフラグと、ここで登録したものをセットしない+既存のアイコンを使うためのNotDataSetにチェックを入れます。

もう一つはIconに何も設定させないものです。

これをすることで左のBTT_ChangeIconが再生されないようにします。

※BP_CustomAIControllerのNPCWidgetControlで分岐させている。

 

音のした場所へ移動するところです。

用意したQuestionアイコンを色は黄色っぽいものを指定しました。


最後にプレイヤーを追いかけるところです。

画像にExclamationと色は赤で登録しました。

 

▼全体像

 

実行してみましょう。

AIの動作に応じてアイコンが表示されるのを変更しましょう。

 

最後に

UE4やUE5向けの記事を書いています。

皆様の応援が投稿のモチベーションになりますので

コメントやTwitterのフォローなどしていただけるとありがたいです。

それではよきゲーム開発を。

【ゼロからアンリアルエンジン5】〔AI編〕⑥物音がしたら確認しに行くNPCを作ってみよう。

目次

 

はじめに

 

注意

UE5.0.3の現在の情報です。

今後のアップデートによりUIや機能が変更される可能性があることをあらかじめご理解ください。

 

前回

 

namiton.hatenablog.jp

 

今回は耳の機能で行動を決定します。

 

解説

①音をならしたアクタのキーを追加

BB_NPCを開きます。

 

オブジェクト型の変数を作成します。

何らかの音がしたときのアクタを返してほしいので名前をHearActorKeyにしました。

 

②ビヘイビアツリーの編集

優先度は

プレイヤーを追いかける>音のするほうに移動する>ランダム移動する

という風にします。

 

BT_NPCを開いて、ランダム移動と追いかける間にSequenceノードを挟みます。

ブラックボードからキーがセットさえているか検証します。



③位置を設定するタスクの作成

MoveToはアクタのほかにもVector型で指定することができます。

今回は音が鳴った位置に移動したいので、音が鳴ったアクタの瞬間の位置を登録するためのタスクを作成します。

 

名前はBTT_SetKeyPositionとしました。

 

HearActorKeyの位置からLocationKeyに登録します。

 

④ビヘイビアツリーに組み込み

 

作成したらビヘイビアツリーに組み込みます。

⑤コントローラーの編集

BP_CustomAIControllerからブラックボードのキーに登録します。

 

ObjectValueはArrayElementに接続しています。

 

実行してうまく音を検出したら移動することを確認しましょう。

 

⑥忘れるようにするためのタスクを作成する。

このままだと音が鳴る場所から動かなくなってしまうので、元のランダム移動に戻るように音が鳴った事実を忘るようにするタスクを作成します。

 

BTTClearKeyとしました。

後で汎用性が高いものにします。

 

これで音のなった場所に到着して2秒後に巡回に戻るようになりました。

 

▼全体像

 

最後に

UE4やUE5向けの記事を書いています。

皆様の応援が投稿のモチベーションになりますので

コメントやTwitterのフォローなどしていただけるとありがたいです。

それではよきゲーム開発を。