春日部つむぎ no ゲーム作ってみよう!【UE5/UE4】 - 街中を歩き回るNPC【UE5】

https://youtu.be/8RlLQosYFPA

00:00 オープニング
00:22 1.NavMeshBound Volumeの配置
01:21 2.NPCキャラクターの作成
02:16 3.NPCブループリントの作成
04:08 4.特定の場所で移動するNPC
06:26 ざっくりまとめ!
06:37 設定ファイル
06:44 エンディング

1.NavMeshBound Volumeの配置 00:22

Unreal Engineのナビゲーションシステムは、
人工知能(AI)でスタート位置から目的地まで、最適なパスを検索します。

「アクタを配置」より
NavMeshBound Volumeをレベル上にドラッグアンドドロップします。

ナビゲーション メッシュ バウンズ ボリューム。

NavMeshBound Volumeは、
レベル内でナビゲーションする領域を指定します。

[詳細]パネル>[Scale] でプレイ領域全体を覆うようにします。

X = 30、Y= 30、Z = 30 に設定します。

キーボードのPキーを押すと、
レベル内のナビゲーションメッシュを視覚化できます。
デフォルトでは緑色で視覚化されます。

視覚化が見にくい場合は、
アウトライナーで、 [RecastNavMesh-Default]を選択します。



[詳細]パネル>[表示]>[オフセットを描画]で
ナビゲーション メッシュが描画される高さを調整することができます。



値を「50」にしてみます。
高さが変わります。

2.NPCキャラクターの作成 01:21

[BP_ThirdPersonCharacter] ブループリントを複製します。

名前を「BP_NPC_Nav」にします。
ファイルを開きます。

カメラは不要なので削除します。

分かりやすいようにマテリアルを変更します。

歩くスピードを300にします。

イベントグラフで、入力ノードをすべて削除します。

3.NPCブループリントの作成 02:16

準備ができたので、ブループリントを記述していきます。

Custom Eventノードを配置します。
名前を「MoveNPC」にします。

Get Actor Locationノードを配置します。

GetActorLocation ノードからGet Random Reachable Point In Radiusノードを配置します。
[Radius (半径)]を1000に設定します。



Get Random Reachable Point In Radiusノードは、
指定された原点位置から到達可能な、ランダムな位置を生成します。

AI Move Toノードを配置します。
カスタムイベントMoveNPC ノードにつなぎます。
PawnピンにSelfをつなぎます。
DestinationピンにGet Random Reachable Point In Radiusノードをつなぎます。

出力ピン、[On Success]ピンに、Delayノードをつなぎます。
[Duration] を「2」に設定します。
カスタムイベントMoveNPCノードをつなぎます。

出力ピン、[On Fail]ピンに、Delayノードをつなぎます。
[Duration] を「0.1」に設定します。

Event BeginPlayノードを配置します。
カスタムイベントMoveNPCノードをつなぎます。

コンパイルして、保存します。

レベル内に「BP_NPC_Nav」をドラッグアンドドロップします。
たくさん配置します。



起動します。

NPCがレベル内をランダムに歩きまわります。

4.特定の場所で移動するNPC 04:08

特定の場所をランダムに行き来するNPCを作成します。

「BP_NPC_Nav」を複製します。
名前を「BP_NPC_aimNav」にします。

ファイルを開きます。

分かりやすいようにマテリアルを変更します。
歩くSpeedも変更してみましょう。
「1000」にしてみます。

「+」をクリックして、変数を追加します。
変数名「TargetList」にします。
変数の型を「Actor」、[オブジェクト参照] を選択します。
[詳細]パネルで「配列」に変更します。
インスタンス編集可能を有効にします。

変数TargetList Getノードを配置します。

変数TargetList Getノードから、Last Indexノードをつなぎます。
Random Integer in Rangeノードを配置します。
MaxピンLast Indexノードをつなぎます。

変数TargetList Getノードから、Get (a copy)ノードをつなぎます。
下のピンにRandom Integer in Rangeノードをつなぎます。


Get (a copy)ノードを
Get Actor LocationノードのTargetピンにつなぎます。

Get Random Reachable Point In Radiusノードの[Radius(半径)] の値を 150 を設定します。
移動先Actorの半径150cm内でランダムな座標を作成します。

AI MoveTo ノードの Acceptance Radius (許容半径)を「50」に設定します。

コンパイルして、保存します。

レベル内に「BP_NPC_aimNav」をドラッグアンドドロップします。

適当なStatic Meshesを配置します。
4つ配置します。



レベル内に「BP_NPC_aimNav」を選択します。
[詳細]パネルのデフォルト>[Target List]で
「+」をクリックして移動先のActorを追加します。



ItemLabelから選択します。
または、スポイトで選択します。

起動します。

NPCが指定したActor間をランダムに行き来します。



5.回避設定 追記

NPC同士が衝突する場合、回避を設定します。

5-1.RVO回避

[BP_Ther] ブループリントを開きます。
[Character Movement] コンポーネントを選択します。
詳細パネル>[Character Movement: Avoidance (キャラクタームーブメント:回避)]
[Use RVOAvoidance (RVO 回避を使用)] を有効にします。
[Avoidance Consideration Radius (回避考慮半径)] を調整します。

コンパイルして保存します。

5-2.Crowd Detour 回避

[BP_NPC_NoAvoidance] ブループリント開きます。
詳細パネル>ボーン>AI Controller Class
[AIController] から[DetourCrowdAIController] に変更します。

コンパイルして保存 します。

Detour Crowd Manager の調整は、
[Settings (設定)] > [Project Settings (プロジェクト設定)] > [Crowd Manager]
[Max Agents (最大エージェント)]、 [Max Agent Radius (最大エージェント半径)] などを調整します。

ざっくりまとめ! 06:26

設定ファイル 06:37

BP_NPC_Nav


BP_NPC_aimNav

NPCを配置するメリット

物語の深化:

NPCは、プレイヤーに対してクエストを与えたり、ストーリーの進行に関わる役割を担うことができます。
これにより、プレイヤーはより深く物語に没入することができます。

ゲームの世界観の拡大:

NPCは、ゲームの世界観を拡大するために使用されることがあります。
NPCが持つ独自のバックストーリーや、ゲーム内の文化や歴史に関する情報を提供することができます。

プレイヤーのサポート:

NPCは、プレイヤーに対してアドバイスやヒントを提供することができます。
これにより、プレイヤーはゲームの進行をスムーズに進めることができます。

ゲームの難易度の調整:

NPCは、ゲームの難易度を調整するために使用されることがあります。
NPCがプレイヤーに提供するクエストやアイテムは、プレイヤーのレベルに合わせて調整されることがあります。