Non-Player Character (NPC) の動作は、多くのゲームで重要な役割を果たします。 仲間からボス、商人からガードに至るまで、NPC が周囲のワールドとインタラクションする方法は、より魅力的でより没入感が高いゲームプレイにつながります。 一見すると、こうした動作はとっつきにくく思えるかもしれません。しかし、実際には、ほとんどの NPC は厳密な論理的なルール セットに従っています。 こうしたルールは NPC の作成時に重要であるため、このページでは、NPC がワールドとインタラクションする方法について、また NPC の動作を視覚化および操作し、独自のユニークな体験を作り出す方法について説明します。
NPC スポナーの仕掛けは、多くの NPC および AI のインタラクションをスムーズなものにします。 この仕掛けの詳細については、「NPC スポナーの仕掛け」、「 NPC キャラクター定義」、「カスタムの NPC 動作を作成する」と 「NPC スポナーをアニメーションで使用する」 を参照してください。
ロジックのルール
ほとんどの NPC は、ランダムにアクションするのではなく、次のアクションを状態に基づいて選択しています。 NPC の状態は、特定の時点での NPC のワールドのスナップショットとして理解することができます。 NPC が行うアクション、プレイヤーが行うアクション、NPC が認識しているその他の可変要素によって、NPC の状態が構成されます。 NPC は、状態の移行時に論理的なルールを使用して意思決定を行います。また、現在の状態に応じて、多数の異なるルールを持っている場合があります。
有限ステート マシン
状態を視覚化する一般的な方法として、有限ステート マシン (FSM) によるものがあります。 有限ステート マシンは、NPC がなる可能性があるさまざまな状態と、状態間の移行を説明するものです。 ノードは異なる状態を表し、その間の矢印は特定の状態から次の状態へと移行するのに必要な条件を説明します。 基本的な FSM の図は、以下のようなものです。
ここでは FSM には 3 つの状態があり、状態 1 から始まります。 特定の条件が満たされると、NPC は特定の条件から次の条件へとジャンプし、条件の変化に従って状態のジャンプを継続します。
たとえば、単純な戦闘における衛生兵のキャラクターについて、FSM を考えてみましょう。 負傷したチームメイトが近くにいたら、衛生兵はそのチームメイトを治療します。 敵が近くにいたら、衛生兵は敵を攻撃します。 それ以外の場合、アイドル状態になります。 このキャラクターに対する基本的な FSM は、次のようなものになります。
FSM は、キャラクターの動作を視覚化し、理解しやすくします。また、イベントやキャラクターの周囲のワールドに対する反応方法を対応付けるのに役立ちます。
ガードでの有限ステート マシンの例
ゲーム内での例として、ガードの NPC について確認しましょう。 ガードの NPC は、ガード スポナーの仕掛けからスポーンするか、ガードタイプの NPC キャラクター定義を使用して作成されます。 ガードタイプの NPC は、特定の論理的なルール セットに従います。このルールは、ガードがなり得る、次のような異なるアクティブ状態に対応します。
アイドル
パトロール中
不審
アラート
攻撃
ガードはスポーンされると、アイドリング状態を開始するか、パトロール (パトロール オプションが有効な場合) を開始します。 ガードがターゲットを検知すると、不審メーターへの入力を開始します。 このメーターがいっぱいになると、ガードはアラート フェーズになります。いっぱいにならなかった場合は、パトロールに戻ります。 アラート中は、ガードは継続的にターゲットに向かって移動し、範囲内に入ると攻撃します。 ターゲットが撃破されるか、ガードから逃げた場合は、ガードはパトロールに戻ります。 このガードのロジックは、次のように FSM によって視覚化することができます。
この FSM は、ガードの動作の概要を示していますが、さらに多くのルールやガードが行うアクションが存在する可能性があります。 NPC は複数の事柄に対して一度にアクションする可能性があります。また、体験に NPC を追加する際には環境による要素を考慮することが重要です。
NPC の状態と Verse
UEFN の NPC は AI モジュールから継承を行い、その状態を直接制御するために利用できる関数を公開します。 たとえば、navigatable インターフェースを使用すると、NPC を特定の領域に移動させることができます。また、focus_interface を使用すると、特定の目標やエージェントに対するフォーカスを強制することができます。 これらのインターフェースを Verse の仕掛けまたは NPC 動作内のいずれかで使用することにより、カスタムの NPC を作成して独自の体験に追加することができます。
独自の NPC 動作を作成する方法については、「カスタムの NPC 動作を作成する」ページを参照してください。
たとえば、次のような NPC 動作について考えてみましょう。
using { /Fortnite.com/AI }
using { /Fortnite.com/Characters }
using { /Fortnite.com/Game }
using { /Verse.org/Simulation }
on_damaged_behavior<public> := class(npc_behavior):
# This function runs when the NPC is spawned in the world and ready to follow a behavior.
OnBegin<override>()<suspends>:void=
if:
すべての NPC は damageable インターフェースを実装します。これにより、NPC はダメージを受けることができるようになります。 関数を damageable インターフェースの DamagedEvent に対してサブスクライブすると、NPC がダメージを受けた際にそれを認識し、コードを実行して反応できます。 上記のスクリプトにおいて、この動作を実装している NPC がダメージを受けると、ダメージを与えたエージェントを取得し、変数 InstigatingAgent にそれを格納します。 続いて、NPC の navigatable インターフェースを使用し、発信者を NavigationTarget として設定して追跡します。
この動作は、NPC の元の動作を拡張したものです。 このスクリプトがガードタイプのキャラクターにアタッチされた場合、キャラクターは引き続き通常のガードの動作を行いますが、ダメージを受けるとターゲットに対して直接向かっていきます。 同じ動作が、野性動物とカスタムタイプのキャラクターにも適用されます。 NPC 動作スクリプトは、NPC の機能を拡張する強力なツールであり、体験に合った独自のカスタム NPC を作成することができます。 独自のカスタム NPC 動作スクリプトを作成する方法については、「カスタムの NPC 動作を作成する」を参照してください。
NPC のタイプ
NPC にはさまざまなタイプがあり、さまざまなベースの動作が実装されています。また、こうした NPC のタイプから作成されたカスタム NPC は、こうした動作を継承します。 さまざまなベース タイプの NPC およびその関連付けられている動作の詳細については、「NPC のタイプ」を参照してください。
ワールド内容を移動する
ワールド内の移動時には、NPC は目的地に到着するための最善の経路を選択する必要があります。 ガードは壁を乗り越えていくのか、破壊していくのか、 水辺を泳いでいくのか、迂回していくのかなどを決定します。 NPC は、こうした意思決定をワールドのナビゲーション メッシュに基づいて行います。 NPC は、このナビゲーション メッシュを使用してパスファインドの意思決定を行い、周囲のワールドの更新に応じて選択肢を更新します。 ナビゲーション メッシュの使用および視覚化の詳細については、「ナビゲーション メッシュ」のページを参照してください。