概要
スマート オブジェクト とは、レベル内に配置され、AI Agent とプレイヤーによるインタラクションが可能なオブジェクトです。これらのオブジェクトには、インタラクトに必要なすべての情報が含まれています。
大まかに言うと、スマート オブジェクトは、リザベーション システム全体で使用可能な一連のアクティビティをレベル内で表現します。このシステムではレベル内のすべてのスマート オブジェクトを継続的にトラックし、AI Agent によるスマート オブジェクトの「リザーブ (予約)」を可能にします。このため、リザーブされたスマート オブジェクトは再び使用可能になるまで、他の Agent では使用できなくなります。
目標
このクイック スタート ガイドでは、AI Agent を使ってスマート オブジェクトを作成して使用する方法について学習します。
目的
AI Agent がスマート オブジェクトに到達した際に使用可能な AI ゲームプレイ動作と動作定義を作成する。
アニメーション モンタージュの再生に動作定義を使用するスマート オブジェクトを作成する。
Behavior Tree と Behavior Tree タスクを使ってシンプルな AI 動作を作成する。
レベル内でスマート オブジェクトを見つけて使用できる AI Agent を作成する。
1 - 必要な設定
サード パーソン テンプレートを使って新しい ブループリント プロジェクトを作成します。
メインメニューから [Settings (設定)] > [Plugins (プラグイン)] をクリックし、[Plugins] ウィンドウを開きます。
[Gameplay (ゲームプレイ)] セクションに行き、Smart Objects プラグインと AI Behaviors プラグインを有効にします。要求された場合は、エディタを再起動します。
このセクションの結果
このセクションでは新しいプロジェクトを作成し、Smart Objects プラグインと AI Behaviors プラグインを有効にしました。これで、AI Agent の AI ゲームプレイ動作を作成する準備が整いました。
2 - AI ゲームプレイ動作を作成する
このセクションでは、Agent がスマート オブジェクトのスロットに到達した際に行う動作を定義するゲームプレイ動作とゲームプレイ設定ブループリントを作成します。
コンテンツ ブラウザ 内で右クリックし、[Create Basic Asset (基本アセットの作成)] セクションの [Blueprint Class (ブループリント クラス)] を選択します。
[Pick Parent Class (親クラスを選択)] ウィンドウで [All Classes (すべてのクラス)] セクションを展開し、「Gameplay Behavior」と検索して選択します。[Select (選択)] をクリックして、新しいアセットに「BP_SO_Behavior_PlayMontage」と名前を付けます。
新しいブループリント クラスを作成し、「Gameplay Behavior Config 」と検索して選択します。[Select (選択)] をクリックして、新しいアセットに「BP_SO_BehaviorConfig」と名前を付けます。
コンテンツブラウザ 内で BP_SO_BehaviorConfig をダブルクリックして開きます。[Details (詳細)] パネルに行き、[Behavior Class (動作クラス)] ドロップダウンをクリックします。[BP_SO_Behavior_PlayMontage] を選択します。ブループリントをコンパイルして保存します。
コンテンツ ブラウザ 内で BP_SO_Behavior_PlayMontage をダブルクリックして開きます。[Functions (関数)] の隣にある [Override (オーバーライド)] ドロップダウンをクリックして OnTriggeredCharacter を選択します。
Event OnTriggeredCharacter ノードの Avatar ピンを右クリックして、[Promote to Variable (変数へ昇格)] を選択します。
Avatar 変数を イベント グラフ にドラッグし、Get Avatar を選択します。Avatar ノードからドラッグして、「Get Component by Class」と検索して選択します。
Component Class ドロップダウンをクリックし、「Skeletal Mesh Component」と検索して選択します。
イベント グラフ 内を右クリックし、「Play Montage」と検索して選択します。
Get Component by Class ノードの Return Value ピンを、Play Montage ノードの In Skeletal Mesh Component ピンに接続します。
Set Avatar ノードを Play Montage ノードに接続します。
Play Montage ノードの Montage to Play ドロップダウンをクリックします。アニメーション モンタージュをリストから選択します。
使用可能なアニメーションがない場合は、Unreal Engine マーケットプレイスから「Animation Starter Pack」などの無料のアニメーション アセット パックを入手できます
Avatar 変数を イベント グラフ にドラッグし、Get Avatar を選択します。Avatar ノードからドラッグし、「End Behavior」と検索して選択します。
Play Montage ノードの On Completed ピンと On Interrupted ピンを EndBehavior ノードに接続します。
ブループリントをコンパイルして保存します。
この例では、動作を終了させるために、Play Anim Montage ノードではなく Play Montage ノードの On Completed ピンと On Interrupted ピンを使用しています。こうすることで、アニメーションの再生が終了するまでスマート オブジェクトが占有されたままとなります。
このセクションの結果
このセクションでは、Agent がスマート オブジェクトのスロットに到達した際にアニメーション モンタージュの再生に使用する Gameplay Behavior ブループリントと Gameplay Config ブループリントを作成しました。これで、スマート オブジェクトで使用する動作定義を作成する準備ができました。
3 - Smart Object Definition データ アセットを作成する
このセクションでは、スマート オブジェクトの各スロットの動作を定義する SmartObject Definition データ アセットを作成します。
コンテンツ ブラウザ 内を右クリックし、[Miscellaneous (その他)] > [Data Asset (データ アセット)] を選択します。
[Pick Class for Data Asset Instance (データ アセットインスタンスのクラスを選択)] ウィンドウで、「Smart Object Definition」と検索して選択します。
[Select] をクリックし、アセットを作成して「SO_Definition_PlayMontage」と名前を付けます。
コンテンツ ブラウザ 内で SO_Definition_PlayMontage をダブルクリックして開きます。[Smart Object (スマート オブジェクト)] セクションまでスクロールして、[Slots (スロット)] の隣にある [+ (追加)] アイコンをクリックして新しいスロットを追加します。これが、AI Agent が動作の実行時に使用するスロットです。
[Default Behavior Definitions (デフォルトの動作定義)] の隣にある [+ (追加)] アイコンをクリックし、[Index 0] に Smart Object Gameplay Behavior Definition を選択します。[Gameplay Behavior Config (ゲームプレイ動作設定)] ドロップダウンをクリックして BP_SO_BehaviorConfig を選択します。
ブループリントを保存して閉じます。
このセクションの結果
このセクションでは、スマート オブジェクトの各スロットと、そのデフォルトの動作を定義する SmartObject Definition データ アセットを作成しました。
4 - スマート オブジェクトを作成する
このセクションでは、レベル内で Agent によって検索および使用可能なスマート オブジェクトを作成します。
コンテンツ ブラウザ 内で右クリックし、[Create Basic Asset (基本アセットの作成)] セクションの [Blueprint Class (ブループリント クラス)] を選択します。
[Pick Parent Class] ウィンドウで、[Actor (アクタ)] クラス ボタンをクリックしてアセットを作成します。新しいアセットに「BP_SO_RunBT」と名前を付けます。
コンテンツ ブラウザ 内で BP_SO_RunBT をダブルクリックして開きます。[Components (コンポーネント)] ウィンドウに行き、[+ Add (追加)] ボタンをクリックします。「Smart Object」と検索して選択します。
SmartObject コンポーネントを選択した状態で [Details] パネルに移動し、[Smart Object] セクションまでスクロールします。[Definition Asset (定義アセット)] ドロップダウンをクリックして SO_Definition_PlayMontage を選択します。
ブループリントをコンパイルして保存します。
このセクションの結果
このセクションでは、スマート オブジェクトを作成して、そのスロットのデフォルトの動作を定義する動作定義を追加しました。
5 - AI Agent の Behavior Tree を作成する
このセクションでは、AI Agent がレベル内でスマート オブジェクトを見つけて使用するために必要な動作を作成します。このために、1 つのシンプルな Behavior Tree と 2 つのカスタム Behavior Tree タスクを使用します。
Behavior Tree とブラックボードを作成する
コンテンツ ブラウザ 内を右クリックし、[AI] > [Blackboard (ブラックボード)] を選択します。ブラックボードに「BB_SO_Agent」と名前を付けます。
BB_SO_Agent をダブルクリックして開きます。[New Key (新しいキー)] ドロップダウンをクリックして [SmartObject Claim Handle (スマート オブジェクト クレーム処理)] を選択します。キーに「ClaimHandle」と名前を付けます。ブラックボードを保存して閉じます。
コンテンツ ブラウザ 内を右クリックし、[AI] > [Behavior Tree] を選択します。Behavior Tree に「BT_SO_Agent」と名前を付けます。
Behavior Tree タスクを作成する
スマート オブジェクトを見つける
コンテンツ ブラウザ 内で右クリックし、[Create Basic Asset (基本アセットの作成)] セクションの [Blueprint Class (ブループリント クラス)] を選択します。
[All Classes] セクションで「BT Task Blueprint Base」と検索して選択し、[Select] をクリックします。ブループリントに「BTT_FindSmartObject」と名前を付けます。
コンテンツ ブラウザ 内で BTT_FindSmartObject を右クリックし、[Duplicate (複製)] を選択します。新しいブループリントに「BTT_UseSmartObject」と名前を付けます。
コンテンツ ブラウザ 内で BTT_FindSmartObject をダブルクリックして開きます。イベント グラフ 内を右クリックし、「Event Receive Execute AI」と検索して選択します。
Event Receive Execute AI ノードの Owner Controller ピンからドラッグし、「Get Blackboard」と検索して選択します。
Get Blackboard ノードの Return Value ピンを右クリックし、[Promote to Variable] を選択します。変数に「Blackboard」と名前を付けます。
Event Receive Execute AI ノードを Set Blackboard ノードに接続します。
Event Receive Execute AI ノードの Controlled Pawn ピンからドラッグし、「Get Actor Location」と検索して選択します。
Get Actor Location ノードの Return Value からドラッグし、「Subtract」と検索して選択します。
Get Actor Location ノードの Return Value からドラッグし、「Add」と検索して選択します。
両方のノードの X、Y、Z の値をそれぞれ「2000」に設定します。これにより、Agent の周辺に 4000 x 4000 単位、もしくは 40 x 40 メートルの検索ボックスが作成されます。
イベント グラフ 内で右クリックし、「Make Box」と検索して選択します。
Subtract ノードを Make Box ノードの Min ピンに接続します。
Add ノードを Make Box ノードの Max ピンを接続します。
イベント グラフ 内で右クリックし、「Get Smart Object Subsystem」と検索して選択します。
Smart Object Subsystem からドラッグして、「Find Smart Objects」と検索して選択します。
Find Smart Objects ノードの Request ピンからドラッグし、Make SmartObjectRequest を選択します。
Make Box ノードの Return Value ピンを Make SmartObjectRequest ノードの Query Box ピンに接続します。
Make SmartObjectRequest ノードの Filter ピンからドラッグし、Make SmartObjectRequestFilter を選択します。
Make SmartObjectRequestFilter ノードの [Behavior Definition Class (動作定義クラス)] ドロップダウンをクリックし、SmartObjectGameplayBehaviorDefinition を選択します。
Set Blackboard ノードを Find Smart Objects ノードに接続します。
この時点でブループリントは次のようになります。
Find Smart Objects ノードの Out Results ピンを右クリックして [Promote to Variable] を選択します。
Out Results ノードのピンからドラッグし、「Is Valid Index」と検索して選択します。
Is Valid Index ノードからドラッグし、「Branch」と検索して選択します。Out Results ノードを Branch ノードに接続します。
Branch ノードの False ピンからドラッグし、「Finish Execute」と検索して選択します。近接したスマート オブジェクトが検索基準に一致しない場合は、Out Results が無効になります。
イベント グラフ 内に Smart Object Subsystem ノードを作成します。このノードからドラッグし、「Claim」と検索して選択します。
Branch ノードの True ピンを Claim ノードに接続します。
Out Results 変数を イベント グラフ にドラッグし、Get Out Results を選択します。このノードからドラッグし、「Random Array Item」と検索して選択します。
Random ノードからドラッグし、Claim ノードの Request Results ピンに接続します。
Claim ノードの Return Value ピンを右クリックし、[Promote to Variable] を選択します。変数に「ClaimHandle」と名前を付けます。
Claim Handle ノード ピンからドラッグし、「Is Valid Smart Object Claim Handle」と検索して選択します。
Is Valid Smart Object Claim Handle ノードの Return Value からドラッグし、「Branch」と検索して選択します。
Branch ノードの False ピンからドラッグし、「Finish Execute」と検索して選択します。
Blackboard 変数を イベント グラフ にドラッグし、Get Blackboard を選択します。
Blackboard ノードからドラッグし、「Set Value as SOClaim Handle」と検索して選択します。
Branch ノードの True ピンを Set Value as SOClaim Handle ノードに接続します。
Set Value as SOClaim Handle ノードの Key Name ピンを右クリックし、[Promote to Variable] を選択します。
Key Name 変数を選択した状態で [Details] パネルに移動し、[Instance Editable (インスタンス編集可能)] チェックボックスをオンにします。[Default Value (デフォルト値)] を「ClaimHandle」に設定します。
ClaimHandle 変数をドラッグして Set Value as SOClaim Handle ノードの Value ピンに接続します。
Set Value as SOClaim Handle ノードからドラッグし、「Finish Execute」と検索して選択します。ノードの Success チェックボックスをオンにします。
ブループリントをコンパイルして保存します。
スマート オブジェクトを使用する
コンテンツ ブラウザ 内で BTT_UseSmartObject をダブルクリックして開きます。イベント グラフ 内を右クリックし、「Event Receive Execute AI」と検索して選択します。
Event Receive Execute AI ノードの Owner Controller ピンからドラッグし、「Get Blackboard」と検索して選択します。
Get Blackboard ノードの Return Value ピンからドラッグし、「Get Value as SOClaim Handle」と検索して選択します。
Get Value as SOClaim Handle ノードの Key Name ピンを右クリックし、[Promote to Variable] を選択します。
Key Name 変数を選択した状態で [Details] パネルに移動し、[Instance Editable (インスタンス編集可能)] チェックボックスをオンにします。[Default Value (デフォルト値)] を「ClaimHandle」に設定します。
Get Value as SOClaim Handle ノードの Return Value ピンからドラッグし、「Use Claimed Smart Object」と検索して選択します。
Get Value as SOClaim Handle ノードを Use Claimed Smart Object ノードに接続します。
Event Receive Execute AI ノードの Owner Controller ピンからドラッグし、Use Claimed Smart Object ノードの Controller ピンに接続します。
Use Claimed Smart Object ノードの On Finished ピンからドラッグし、「Finish Execute」と検索して選択します。ノードの Success チェックボックスをオンにします。
ブループリントをコンパイルして保存します。
Behavior Tree を作成する
コンテンツ ブラウザ 内で BT_SO_Agent をダブルクリックして開きます。Root ノードからドラッグして Selector を選択します。
Selector ノードからドラッグして Sequence を選択します。
Selector ノードからドラッグして Wait を選択します。最初の検索が成功しなかった場合は、このノードにより、スマート オブジェクトを新しく検索する前に Agent が 5 秒間待機します。
Sequence ノードが Wait ノードの左側にあることを確認してください。こうすることで、Behavior Tree 内で Sequence が最初に実行されることを確実にできます。
Sequence ノードからドラッグして BTT_FindSmartObjects を選択します。
Sequence ノードからドラッグして BTT_UseSmartObjects を選択します。
Sequence ノードからドラッグして Wait を選択します。このノードを選択した状態で、Wait Time を「2.0」に、Random Deviation を「0.5」に設定します。このノードにより、スマート オブジェクトを新しく検索する前に Agent が 1.5 ~ 2.5 秒間待機します。
Behavior Tree を保存して閉じます。
このセクションの結果
このセクションでは、レベル内で Agent がスマート オブジェクトを見つけて使用できるようにするための Behavior Tree と Behavior Tree タスクを作成しました。
6 - AI Agent を作成する
このセクションでは、レベル内でスマート オブジェクトを検索する AI Agent を作成します。
コンテンツ ブラウザ 内で ThirdPersonCharacter ブループリントをダブルクリックして開きます。
イベント グラフ 内のすべてのノードを選択して削除します。イベント グラフ 内を右クリックし、「Event Possessed」と検索して選択します。
Event Possessed ノードの New Controller ピンからドラッグし、「Cast to AI Controller」と検索して選択します。Event Possessed ノードを Cast to AIController ノードに接続します。
Cast to AIController ノードの As AIController ピンからドラッグし、「Run Behavior Tree」と検索して選択します。BTAsset ドロップダウンをクリックして BT_SO_Agent を選択します。
ブループリントをコンパイルして保存します。
コンテンツ ブラウザ 内で ThirdPerson_AnimBP ブループリントをダブルクリックして開きます。AnimGraph 内で右クリックし、「Default Slot」と検索して選択します。
デフォルト のステート マシンを Slot ‘デフォルト スロット名' ノードの Source ピンに接続します。Slot ‘デフォルトのスロット名' ノードの出力を Output Pose ノードの Results ピンに接続します。
このセクションの結果
このセクションでは、レベル内でスマート オブジェクトを検索する AI Agent ブループリントを作成しました。また、アニメーション モンタージュが正しく再生されるように、アニメーション ブループリントを変更しました。
7 - スマート オブジェクトをテストする
作成した AI Agent をテストして、レベル内でスマート オブジェクトを見つけて使用できることを確認します。
メイン ツールバーから [+ (コンテンツを追加)] > [Volumes (ボリューム)] > [NavMeshBoundsVolume] をクリックして、新しい ナビゲーション メッシュ アクタをレベルに追加します。レベルを覆うようにメッシュをスケーリングし、Agent が目的地まで移動できるようにします。
いくつかの BP_SO_RunBT ブループリントをレベルにドラッグします。
ThirdPersonCharacter ブループリントをレベルにドラッグします。
[Simulate (シミュレート)] をクリックして、レベル内で Agent がスマート オブジェクトを見つけて使用できることを確認します。
このセクションの結果
このセクションでは、レベル内で AI Agent がスマート オブジェクトを見つけて使用できることを確認しました。