Choose your operating system:
Windows
macOS
Linux
ビヘイビア ツリーのクイックスタート ガイド では、プレーヤーを見て反応し、追跡する敵の AI の作成方法について学習します。プレーヤーを見失うと、数秒後 (自由に調整可能) に AI は追跡をあきらめて、以下のビデオの例のようにプレーヤーを再び発見するまでランダムに周囲を移動します。
このガイドの終了までには、以下のシステムについて理解できるようになります。
-
ブループリント ビジュアル スクリプティング
-
AI コントローラー
-
ブラックボード
-
ビヘイビアツリー
-
ビヘイビアツリーのサービス
-
ビヘイビアツリーのデコレーター
-
ビヘイビアツリーのタスク
1 - 必要なプロジェクト設定
最初のステップでは、AI キャラクターが環境を動き回るために必要なアセットを使用してプロジェクトを設定します。
このガイドでは、新しい Blueprint Third Person テンプレート プロジェクトを使用します。
-
[Sources] パネルを展開して、「 ThirdPersonBP 」フォルダを右クリックし、「 AI 」という名前で 新しいフォルダ を作成します。
-
「ThirdPersonBP」 > 「Blueprints」 フォルダで、 ThirdPersonCharacter を「AI」フォルダにドラッグし、 [Copy Here] を選択します。
-
「AI」 フォルダには、 AIController クラスを基底クラスとする新しい Blueprint クラスを作成します。
-
AIController ブループリントには、 「Enemy_Controller」 、そして ThirPersonCharacter ブループリントには、 「Enemy_Character」 と名前を付けます。
-
Enemy_Character を開き、グラフからすべてのスクリプトを削除します。
-
Character Movement コンポーネントを選択し、 [Details (詳細)] パネルの [Max Walk Speed] を 「120.0」 に設定します。
画像をクリックしてフルサイズで表示
この設定で、プレイヤーを追跡中およびそうでないときの環境中の AI キャラクターの動きを減速します。
-
ツールバーから [Class Defaults] を選択し、 [Details] パネルで 「Enemy_Controller」 を AI Controller クラス として割り当てます。
画像をクリックしてフルサイズで表示
AI をワールドに配置するときに、ワールドがロードされた後に AI を生成する場合は、 [Auto Possess AI] 設定を [Spawned] に変更することを推奨します。
-
[コンテンツ ブラウザ] から 「Enemy_Character」 をレベルにドラッグします。
-
[Modes (モード)] パネルから 「Nav Mesh Bounds Volume」 をレベルにドラッグします。
-
「Nav Mesh Bounds Volume」 を選択した状態で R を押し、ボリュームをスケールしてレベル全体をカプセル化します。
これにより、Navigation メッシュが生成され、AI キャラクターが環境内を移動できるようになります。ビューポート内の Nav メッシュ (緑色の領域は、ナビゲーション可能な位置を示します) の表示を切り替えるには、 P キーを押します。
ゲームプレイ中は、コンソール コマンドの show Navigation を使用して Nav メッシュの表示 / 非表示を切り替えることができます。
プロジェクトの設定が完了したので、以下のステップで Blackboard アセットを設定します。
2 - ブラックボードの設定
このステップでは、AI の頭脳である Blackboard アセットを作成します。AI に知らせたいすべての情報には、参照可能な Blackboard Key が含まれています。AI がプレーヤーに対する視線やプレーヤーを追跡していないときに移動できる位置の情報を持っているかどうか、プレーヤーを追跡し続けるためのキーが作成されます。
-
[コンテンツ ブラウザ] で [Add New] をクリックし、 [Artificial Intelligence] の下の [Blackboard] を選択して 「BB_Enemy」 と名付けます。
-
BB_Enemy ブラックボード内で、 [New Key] ボタンをクリックして Object を選択します。
Blackboard アセットは、 Blackboard Keys (監視する変数) を追加して追跡できる [Blackboard] と、キーの種類を名前付けして指定できる [Blackboard Details] の 2 つのパネルで構成されています。
-
Object キーの場合、 [Entry Name] には 「ElemyActor」 と入力し、 [Base Class] には 「Actor」 と入力します。
-
[Key Type] を 「HasLineOfSight」 と名付けて Bool に設定し、別の Key を追加します。
AI がプレイヤーに対する視線を持っているかどうかを追跡するために使用されます。
-
[Key Type] を 「PatrolLocation」 と名付けて Vector に設定し、別の Key を追加します。
これは、AI がプレーヤーを追跡していないときに移動できるレベル内の場所を追跡するために使用されます。
ブラックボード には、追跡する必要のあるものを設定しています。以下のステップでは、 ビヘイビアツリー をレイアウトします。
3 - ビヘイビアツリーのレイアウト
このステップでは、 ビヘイビアツリー の流れと AI に入力させたい状態についてレイアウトします。ビジュアルフローとして AI があることを想定する状態で ビヘイビアツリー をレイアウトすると、その状態に入るためにはどのようなタイプのロジックとルールを作成する必要があるかを知ることができます。
-
[コンテンツ ブラウザ] で [Add New] をクリックし、 [Artificial Intelligence] の下の [Behavior Tree] を選択して 「BT_Enemy」 と名付けます。
命名規則は異なる場合がありますが、名前にアセット タイプの頭字語を追加することをお勧めします。
-
「BT_Enemy」 を開き、 「BB_Enemy」 を Blackboard アセット として割り当てます。
作成した Blackboard Key が表示されない場合は、黄色い矢印をクリックして Blackboard アセット をクリアしてから、 Enemy_BB を再度割り当ててキーを更新します。
ビヘイビアツリー は、ビヘイビアを定義するブランチとノードを視覚的にレイアウトする [Behavior Tree] グラフ、ノードのプロパティを定義できる [Details] パネル、そしてゲームの実行中に Blackboard Key とその現在値を表示しデバッグに有用な [Blackboard] の 3 つのパネルで構成されています。
-
グラフで、 Root を左クリックしてドラッグし、 Selector ノードを追加します。
コンポジット は、フロー制御の一形態であり、接続された子ブランチの実行方法を決定します。
コンポジット
説明
Selector
左から右にブランチを実行し、通常はサブツリー間の選択に使用されます。Selector は、正常に実行されたサブツリーが見つかると、サブツリー間の移動を停止します。たとえば、AI がプレーヤーの追跡に成功した場合、AI は実行が終了するまでそのブランチにとどまり、Selector の親コンポジットに移動して決定フローを続行します。
Sequence
左から右にブランチを実行し、通常は一連の子を順番に実行します。Selector とは異なり、Sequence は失敗したノードに到達するまでその子を実行し続けます。たとえば、プレーヤーに移動する Sequence がある場合は、範囲内にあるかどうかを確認してから、回転してアタックします。範囲内にあるかどうかのチェックに失敗した場合、回転アクションおよびアタック アクションは実行されません。
Simple Parallel
Simple Parallel には 2 つの「接続」があります。 最初の 1 つは、メインタスクで、Task ノードにのみ割り当てることができます (コンポジットがないことを意味します)。2 つ目の接続 (バックグラウンド ブランチ) は、メインタスクの実行中に実行されるアクティビティです。プロパティによっては、Simple Parallel はメインタスクが終了するとすぐに終了するか、Background Branch が終了するのを待ちます。
-
Selector ノードの場合、 [Details] パネルで Node Name から AI Root に変更します。
グラフ内のノードの名前を変更すると、ノードの実行内容を上位レベルから簡単に識別できます。この例では、子ブランチを切り替えるビヘイビアツリーの実際の「Root」であるため「 AI Root 」と名前を付けます。ビヘイビアツリーの作成時に自動的に追加されるデフォルトの Root ノードは、ビヘイビアツリーのプロパティの設定や、Blackboard アセットの割り当てに使用します。
-
「AI Root」 を左クリックしてドラッグし、 「Chase Player」 という名前の Sequence ノードを追加します。
ここでは、AI に一連のアクションを実行するように指示するために、Sequence ノードを使用します。つまり、プレーヤーに向かって回転し、動く速度を変更してから、プレーヤーに向かって移動して追跡します。
-
AI Root ノードを左クリックしてドラッグし、 「Patrol」 という名前の Sequence ノードを追加します。
AI の場合、 Sequence ノードを使用してマップ内のランダムな位置を見つけ、その位置に移動し、移動先の新しい位置を見つけるプロセスを繰り返す前に一定時間その位置で待機します。
ノードの右上隅の数字にも留意してください。
操作の順序を示します。 ビヘイビアツリー は左から右、上から下に実行されるため、ノードの配置は重要です。AI にとって最も重要なアクションは左に配置し、重要でない (後退させるなど) アクションは右に配置します。子ブランチも同じように実行され、いずれかの子ブランチが失敗すると、ブランチ全体の実行が停止し、ツリーのバックアップが失敗します。たとえば、 Chase Player が失敗した場合、 Patrol に移る前に AI Root に戻ることになります。
-
AI Root をドラッグして、 [Wait Time] を 「1. 0」 に設定した Patrol の右側に Wait タスクを追加します。
ノードが紫色であれば、 Task ノードであることを示しています。Task ノードは、 ビヘイビアツリー で実行できるアクション可能な「ノード」です。 Wait タスクは何らかの理由で ビヘイビアツリー が Chase Player または Patrol の両方に失敗するイベントのキャッチオールとして機能します。
-
Chase Player をドラッグして、 Rotate to Face BBEntry ノードに追加します。
この特定の タスク を使用すると、この例の Enemy アクタ (Player) のように回転させて向かい合わせにする Blackboard Entry を指定することができます。ノードを追加してから、 [Details] パネルを見ると、 Blackboard Key は自動的に EnemyActor に設定されます。これは、アクタ blackboard 変数がフィルタリングされてリストの最初の変数になるためです。成功条件の範囲を調整したり Node Name を変更したい場合は、 [Precision] オプションを調整できます。
-
ツールバー から、 [New Task] ボタンをクリックします。
ビルトイン タスクを使用するだけでなく、カスタマイズおよび定義可能な追加ロジックを持つ独自のカスタム タスクを作成して割り当てることができます。このタスクは、AI の移動速度を変更して、プレーヤーの後を追うようにするために使用されます。新しいタスクを作成すると、新しい ブループリント が自動的に作成されて開きます。
-
[コンテンツ ブラウザ] で、新しいアセットの名前を 「BTT_ChasePlayer」 に変更します。
新しく作成した タスク 、 デコレーター 、または サービス は、作成時にすぐに名前を変更することをお勧めします。適切な命名規則に従い、アセットの名前に作成するアセットの種類を表す接頭辞を付けます。たとえば、Behavior Tree タスクの場合は BTT 、Behavior Tree デコレーターの場合は BTD 、そして Behavior Tree サービスの場合は BTS です。
-
BT_Enemy の内部には、 BTT_ChasePlayer タスクを追加し、続いて Move To を追加します。
新しいタスクにはまだロジックが含まれていないので、前に戻って AI キャラクタの移動速度を変更するロジックを追加します。その後、AI を EnemyActor に移動します (プレイヤー)。
-
新しい タスク を作成し、名前 を 「BTT_FindRandomPatrol」 に変更して、 Patrol に接続します。
-
タスクに Move To タスクを追加し、 Blackboard Key を PatrolLocation に設定します。
これにより、AI は BTT_FindRandomPatrol タスク内に設定されている PatrolLocation に移動するように指示されます。
-
Move To タスクの次は、 Wait Time を 「4.0」 、 Random Deviation を 「1. 0」 にして、 Wait タスク を追加します。
これにより、AI は PatrolLocation で 3 - 5 秒待つように指示されます (Random Deviation により Wait Time に「+」または「-」秒が追加されます)。
これで、 ビヘイビアツリー のフレームワークは完成しました。以下のステップでは、AI の移動速度を変更するロジック、AI がパトロールしているときにナビゲートするランダムな位置を見つけるロジック、AI がプレーヤーの追跡やパトロールをするタイミングを決定するロジックを追加します。
4 - タスクの設定 - Chase Player
このステップでは、 Chase Player タスク を設定して、プレーヤーを追跡する際の移動速度を変更します。
-
BTT_ChasePlayer 内で右クリックし、 Event Receive Execute AI ノードを追加します。
このタスクが ビヘイビアツリー 内でアクティベートされると Event Receive Execute AI ノードが起動します。
エージェントが AI コントローラーである場合は、常に AI バージョンの Event Receive Execute 、 Event Receive Abort 、そして Event Receive Tick を選択する必要があります。汎用イベントと AI イベントの両方のバージョンが実装されている場合は、適切なバージョンのみが呼び出されます。つまり、AI が呼び出された場合は AI バージョンが呼び出され、それ以外の場合は汎用イベント バージョンが呼び出されます。
-
Controlled Pawn ピンをオフにして、 Cast to Enemy_Character ノードを使用します。
ここでは、 Cast ノードを使用して、 Enemy_Character と呼ばれる AI の キャラクター ブループリント にアクセスします。
-
[コンテンツ ブラウザ] の中にある Enemy_Character ブループリントを開き、 「Update Walk Speed」 という名前の 関数 を追加します。
この関数は、ビヘイビアツリーから呼び出され、AI の移動速度を変更するために使用されます。
技術的には、Chase Player タスクで Cast ノードから Character Movement コンポーネントにアクセスし、タスク内から移動速度を調整できますが、ビヘイビアツリーでサブオブジェクトのプロパティを直接変更することはお勧めしません。代わりに、ビヘイビアツリーでキャラクタ内の関数を呼び出し、必要な修正を行います。
-
Update Walk Speed 関数の [Details] パネルで、 「NewWalkSpeed」 と名付けた Float 入力を追加します。
-
CharacterMovement コンポーネントを コンポーネント タブからドラッグし、以下の図のように Set Max Walk Speed を使用して接続します。
この関数をビヘイビアツリーから呼び出すと、新しい速度として使用される値を渡すことができます。
-
BTT_ChasePlayer タスクの内部に戻り、 As Enemy Character ノードから Update Walk Speed を呼び出して 「500.0」 に設定し、以下のように接続します。
作成した Update Walk Speed 関数が表示されない時は、 Chase Player タスク に追加する前に、この Enemy_Character ブループリントの コンパイル が必要な場合があります。
-
Update Walk Speed の次は、 Finish Execute ノードを 2 つ追加し、以下のように接続します。
ここでは、「Enemy_Character」にキャストしたときに、タスクが正常に終了したとマークしています。制御された Pawn が「Enemy_Character」ではない場合は、タスクを失敗としてマークして、タスクを中止するようにこのケースを処理する必要があります。
-
新しい New Walk Speed ピンを右クリックし、変数に昇格して 「ChaseSpeed」 と名付けます。
-
ChaseSpeed では、必ず [Instance Editable] を有効にしてください。
これを Instance Editable 変数に昇格させることで、このブループリントの外部から Max Walk Speed の値を設定して、 ビヘイビアツリー 内部のプロパティとして使用することが可能となります。
これで Enemy_Character ブループリントに送られる Chase Speed の値の変更が簡単になり、AI がプレーヤーを追跡する速度を調整することができます。
これで Chase Player Task は完成したので、以下のステップでは AI が移動するランダムな位置を得るための Find Random Patrol Task ロジックを設定します。
5 - タスク設定- Find Random Patrol
このステップでは、AI がプレーヤーを追跡していないときはランダムな位置に移動するように、 Find Random Patrol Task を設定します。
Blueprint Behavior Tree タスクの実装は、迅速に繰り返し処理を行うための良い方法ですが、パフォーマンスが問題となる場合は、そのロジックをネイティブの Behavior Tree タスクに変えることもできます。
-
BTT_FindRandomPatrol の内部では、 Event Receive Execute AI を使用し、 Enemy_Character にキャストします。
-
As Enemy Character をオフにして Update Walk Speed を呼び出したら、 New Walk Speed を変数に昇格し、以下のように設定をして 「Patrol Speed」 と名付けます。
- Variable Name を 「PatrolSpeed」 に設定 - Instance Editable を 「Enabled」 に設定 - Patrol Speed (Default Value) を 「125.0」 に設定
ここでは、パトロール中に敵の移動速度を下げてみます。
-
Controlled Pawn と Get Actor Location をオフにし、 Branch に接続された Return Value とともに GetRandomReachablePointInRadius をオフにします。
-
以下の設定で、 GetRandomReachablePointInRadius の Radius を変数に昇格します。
- Variable Name を 「PatrolRadius」 に設定 - Instance Editable を 「Enabled」 に設定 - Patrol Radius (Default Value) を 「1000.0」 に設定
ここでは、敵キャラクターの現在位置から 1000 単位以内のランダムな位置を見つけます。また、Branch ノードを使用して、移動先のランダムなポイントが見つからないエッジケースを処理します。
-
Random Location ピンをオフにして、 「PatrolLocation」 と名付けた変数に昇格された Key とともに Set Blackboard Value as Vector を使用します。
-
Get Actor Location から取得した Value を持つ別の Set Blackboard Value to Vector ノードを使用します。
-
前のステップに続き、以下の図ように両方のノードに接続すると、 Finish Execute と表示され、 Success にマークされます。
敵がランダムな位置を見つけて移動する場合、その移動先が Blackboard に保存されます。位置が見つからない場合は、現在位置が使用され、新しい位置を試す前にその位置に留まります。Controlled Pawn が Enemy_Character ではないエッジケースを処理する必要があります。
-
Cast ノードの Cast Failed ピンをオフにし、 Success を無効にした状態で Finish Execute を使用します。
Controlled Pawn が Enemey_Character でない場合、このタスクは失敗としてマークされ、中止されます。
これで Find Random Patrol Task の設定は完了です。以下のステップでは、 デコレーター の詳細や、それらを条件式として使用する方法や AI コントローラーの設定ついても学習します。
6 - AI コントローラーの設定
このステップでは、最後のステップに備えて AI コントローラーの内部で少し作業を行ってから
デコレーター
を設定し、
ビヘイビアツリー
のどのブランチに入力するかを決定します。
-
[コンテンツ ブラウザ] で、 Enemy_Controller ブループリントを開き、 Event On Possess ノードを追加します。
-
Event On Possess をオフにし、 [BTAsset] を 「BT_Enemy」 に設定した Run Behavior Tree ノードを追加します。
Run Behavior Tree は、AI コントローラー クラス ブループリントを対象としたコンテキストの関数呼び出しで、割り当てられた Behavior Tree アセットを実行できるようにします。
-
[コンポーネント] ウィンドウで、 [+ Add Component] をクリックし、 「AIPerception Component」 を検索して追加します。
AI Perception コンポーネント は、 AI Perception System 内に刺激リスナーを作成するために使用され、応答可能な登録済みの刺激 (私たちの場合、視覚を使います) を収集します。これにより、AI が実際にプレーヤーを認識し、それに応じて反応できるタイミングを判断できるようになります。
-
AIPerception コンポーネント の [Details] パネルで、 [AI Sight config] を追加し、 [Detect Neutrals] を有効にします。
[Detection by Affiliation] プロパティを使うと、同じ所属のチームメートと対戦したり、対立する所属メンバーを攻撃したりするチームベースの AI を設定できます。デフォルトでは、 アクタ には所属が割り当てられず、中立と見なされます。
現時点では、ブループリントを使って所属を割り当てることはできません。そのため、プレーヤーを検出するために、 [Detect Neutral] フラグを有効にします。別の方法として、どのキャラクターがプレーヤーであるかを決定するために Actor Tagging を使用し、AI キャラクター (達) がプレーヤーとしてタグ付けされたアクタのみを強制的に追跡するようにします。
-
[AIPerception] の [Events] セクションで、 [On Target Perception Updated] の横にある [+] 記号をクリックします。
-
グラフの [On Target Perception Updated] をオフにし、 「Player」 として タグ を設定した Actor Has Tag ノードを追加します。
-
Stimulus ピンをオフにして、 Break AIStimulus ノードを追加します。
-
以下に示す Condition で Branch ノードを追加します。
ここでは、アクタが正常に感知されたかどうか、そしてアクタにプレーヤーのタグがあるかどうかを確認します。
Break AIStimulus ノードを選択すると、 [Details] パネルで [Hide Unconnected Pins] を使用して接続されていないすべてのピンを非表示にし、上の図のようにグラフを表示できます。
-
Branch の False をオフにし、そして [Time] を 「4.0」 にして [Set Timer by Event] を使用します。
-
右クリックして Time を変数に昇格し、 「Line Of Sight Timer」 と名付けます。
画像をクリックしてフルサイズで表示
この変数と割り当てられた値によって、AI がプレーヤーの追跡を中止するまでの時間が決定されます。この時間を過ぎると、アタッチされたイベントが実行されます。
-
Set Timer by Event の Return Value を右クリックし、「 EnemyTimer 」と名付けて変数に昇格します。
画像をクリックしてフルサイズで表示
これにより、 ハンドル を使用して Timer への参照が格納されます。このハンドルは、スクリプトから呼び出されてハンドル自体を無効にし、関連付けられたイベント (関連するイベントの実行を妨げます) をクリアします。これは後で、「Line of Sight Timer」が切れる前に AI がプレイヤーを再確認するイベントに使用できます。これにより、AI がプレイヤーを見失って追跡を放棄するのを防ぐことができます。
-
Custom Event を作成して、そのイベント名を「 StartEnemyTimer 」とし、 Set Timer by Event の Event ピンに接続します。
画像をクリックしてフルサイズで表示
-
右クリックして、 [Variables]>[AI] の下に Get Blackboard ノードを追加します。
-
ブラックボード をオフにし、 Set Value as Bool と Set Value as Object を使用して、以下のように接続します。
これにより、新しい値で定義された Blackboard Key を更新することができます。
-
両方の Key Name で右クリックして、それぞれ「 HasLineOfSight 」と「 EnemyActor 」と名付けて 変数 に昇格します。
-
ブループリントを コンパイル し、両方の Key Name の デフォルト値 をそれぞれ HasLineOfSight と EnemyActor に設定します。
画像をクリックしてフルサイズで表示
-
Branch の True をオフにして、 Get EnemyTimer を使用した後に Clear and Invalidate Timer by Handle を使用します。
画像をクリックしてフルサイズで表示
AI は プレーヤーを認識すると、再びプレーヤーを認識できなくなるまで Line Of Sight Timer をクリアします (新しい Line Of Sight Timer が開始されます)。
-
以下の図に示すように、 Blackboard ノード、 Set Value as 、そして Key Name ノードをコピーして貼り付けます。
画像をクリックしてフルサイズで表示
-
Set Value as Bool ノードで、 Bool Value を有効にし、図のように アクタ ピンを Object Value までドラッグします。
画像をクリックしてフルサイズで表示
これは、 Has Line Of Sight の Blackboard Key Values を 「True」 に、 EnemyActor を知覚する 「Actor」 に設定します (これがプレイヤーである場合のみ起動するように設定されています)。
-
[Compile] をクリックしてコンパイルし、ブループリントを閉じます。
画像をクリックしてフルサイズで表示
最終的なグラフは上の図のようになります。
7 - デコレーターと最終設定
この最後のセクションでは、Player Character と Enemy Character ブループリントの設定をいくつか調整します。また、
ビヘイビアツリー
には、指定された条件に基づいて入力可能なブランチを決定する
デコレーター
を設定します。
-
[コンテンツ ブラウザ] の [Content]>[ThirdPersonBP]>[Blueprints] の下にある ThirdPersonCharacter ブループリント を開きます。
-
[Details] パネルで、 タグ を検索して追加し、 「Player」 に設定します。
この「Player」のタグを追加すると、AI がプレーヤーを認識して反応できるようになります。
-
「AI」 フォルダの中にある Enemy_Character ブループリントを開きます。
-
[Details] パネルで [Rotation] を探して、 [Use Controller Rotation Yaw] を有効にします。
これにより、 ビヘイビアツリー から Rotate to Face BB Entry が呼び出されたときに AI が正しく回転するようになります。
Pawn オプションが表示されない場合は?最初にツールバーの [Class Defaults] ボタンをクリックする必要があります。
-
BT_Enemy を開いて [Chase Player] を右クリックし、 [Add Decorator...] の下の [Blackboard] をクリックします。
画像をクリックしてフルサイズで表示
ビヘイビアツリー でノードを右クリックすると、追加機能を提供するサブノードを追加できます。
サブノード
説明
デコレーター
条件式とも呼ばれます。別のノードにアタッチされ、ツリーのブランチあるいはノード 1 つでも実行可能かどうかの判断をするノードです。
サービス
これらは、 Task ノードと Composite ノードにアタッチされ、ブランチの実行中に定義された頻度で実行されるノードです。多くの場合、 ブラックボード の確認や更新に使用されます。これらは、他の Behavior Tree システムの従来の Parallel ノードに代わるものです。
Blackboard デコレーター を使用して Blackboard Key の値を決定します。これが有効な場合、このブランチの実行を許可します。
-
追加された Blackboard Based Condition を選択し、 [Details] パネルで以下の設定を行います。
画像をクリックしてフルサイズで表示
-
[Observer Aborts] を 「Both」 に設定
-
[Blackboard Key] を 「HasLineOfSIght」 に設定
-
[Node Name] を 「Has Line of Sight?」 に設定
ここでは、 [HasLineOfSight] の値が「 Is Set 」の場合 (または、true) には、この Chase Player ブランチを実行するように指定しています。 [Observer aborts] の設定が 「Both」 の場合は、 Blackboard Key に変更を割り当てると、自分自身 ( Chase Player ) とそれよりも優先度の低いタスクを中止することができます。つまり、 HasLineOfSight の値が変更されて設定されていない場合は、自身 ( Chase Player ) を中止し、その時点で次のブランチ ( Patrol ) が実行されます。 HasLineOfSight 値が再び「 Is Set 」になると、Observer は優先度の低いタスクを中止し、再度 Chase Player ブランチを実行することができます。
-
-
エディタで [Compile] をクリックして、 ビヘイビアツリー を閉じ、 [Play] します。
最終結果
これで AI をテストできるようになり、AI がユーザーを認識したときに追跡を始めます。
AI は、ユーザーを見失った場合でも、ユーザーを追跡して視線を取り戻そうとします。 Line Of Sight Timer の値に入力した時間が過ぎると、追跡を諦めてパトロールに戻ります。
再生中に動作中の ビヘイビアツリー を見て、ビヘイビアツリーがブランチ間でどのように切り替わるかを確認することができます。再生中に ビヘイビアツリー 内で変数を監視して、AI の現在値を知ることもできます。
8 - 応用編
これで、AI キャラクターがプレーヤーを追跡し、指定された時間内にプレーヤーを見失った後は再び巡回するようになったので、次の要素を ビヘイビアツリー に追加してみてください。
-
ビヘイビアツリー で、両方の Move To タスクに、それに先行する タスク からの機能を組み込んだ新しい サービス を追加します。
-
オリジナルの ビヘイビアツリー は、移動速度を調整し (プレイヤーを追いかける場合)、ランダムに移動する位置を探索したり移動速度を遅くするため (パトロールの場合) に、別々の タスク を使用します。これらを Move To タスク にアタッチされている サービス に変換します。
-
ヒント: 各 サービス のスクリプトは各 タスク のスクリプトに似たものになりますが、 Event Receive Execute AI の代わりに Event Receive Activation AI を使用することをお勧めします。なぜならこれらは サービス であるため、 Finish Execute ノードも必要ありません。
-
-
ランダムなパトロール地点を使用して移動する代わりに、AI が移動できるベクター値の 配列 変数を含む Patrol Path ブループリント を作成します。
-
ヒント: 巡回して配列内の次のエントリを取得し、その位置間で AI を移動させてから、配列内の現在のエントリに基づいて Blackboard Key の値の PatrolLocation を更新します。
-
-
プレーヤーの視線が失われた場合は、プレーヤーの現在の場所を取得するのではなく、AI をプレーヤーの最後の既知の位置に移動します。
-
ヒント: Turning and Chasing the Player の Move To コマンドでは、現在 (プレーヤーの現在の位置を取得する) EnemyActor の位置を取得するように設定されているため、 EnemyActor の代わりに位置を指定する必要があります。
-
-
プレイヤーに接触したら、AI にアタック機能を追加します。
-
ヒント: Turning and Chasing the Player の Background タスク として新しい Composite ノードを追加します。AI がプレーヤーに接触したら、アタック アニメーション用の Task ノードを追加します。
-