これで、プレイヤーがゲーム内でキー型を入手できるようになったので、プレイヤーが必要なキーを入手した場合に、ドアをアンロックして開く機能を追加します。 このチュートリアルのパートでは、BP_DoorFrame ブループリントを変更し、ブループリントの関数について説明します。
アンロック可能なドアは、ゲームの流れを制御する方法を提供し、プレイヤーに進捗の感覚を提供します。 現在作業しているプロジェクトは部屋に分けられます。 そのため、キーを入手してドアを解錠することで、プレイヤーには論理的な進行パスが提供されます。
開始する前に
「パズル アドベンチャーの設計」チュートリアル シリーズの前のセクションで取り上げられた、次のトピックはすでに理解できているはずです。
マップ変数を使用したオブジェクトのバリアントの作成。
前のチュートリアルのキーを作成するで作成した次のアセットが必要です。
BP_KeyBPL_FPGameブループリント関数ライブラリBPI_PlayerKeysブループリント インターフェース3 つの
BP_DoorFrameインスタンスをレベル内の部屋または廊下の間に配置します。
ドアにカラー オプションを追加
一人称視点テンプレートにはすでにドアのブループリントが含まれているため、既存のブループリントを変更して、キーでドアのロックを解除する機能を追加することができます。
ドアは、このチュートリアルの前のパートで定義したキー システムと連動するため、いくつかの要素が必要です。 キー型と同様に、ドアにも、インタラクトしているアクタが BPI_PlayerKeys インターフェースを実装していることを認識させる必要があります。
ドアの色は、受け付けるキーに一致して変更する必要があります。つまり、アンロック可能なキー型を把握する必要があります。 最後に、赤、黄、青の色の組み合わせを含む、同じ KeyMap 変数が必要です。
プレイヤーおよびキーとインタラクトするための変数を作成する
BP_DoorFrame ブループリントに新しい変数を追加するには、次の手順に従います。
コンテンツ ブラウザで、[LevelPrototyping] > [Interactable (インタラクト可能)] > [Door (ドア)] フォルダに移動し、
BP_DoorFrameブループリントを開きます。[My Blueprint (マイ ブループリント)] パネルの [Variables (変数)] セクションで、「UseKey」という名前の新しい変数を追加します。また、型はブーリアンです。 開くのにキーが必要かどうかを決定します。
「RequiredKey」という名前の Enum Key Type (列挙型キー型) の変数をもう 1 つ作成します。 ドアを開くために必要なキーを決定します。
両方の変数の隣にある目のアイコンをクリックして、目が開いている状態にし、編集可能にします。
UseKey 変数を選択します。 詳細 パネルで
カテゴリとして「Setup」と入力します。[RequiredKey] を選択し、そのカテゴリを [Setup (設定)] に変更します。
「Other Actor」という名前の新しい変数を作成し、型は Actor > Object Reference です。 これはドアとインタラクトしているアクタを格納します。これを使用してプレイヤーとドア ボリュームが重なっているかどうかを確認します。
キー マップ変数をビルドする
BP_Key で行ったように、キー型とマテリアルの色をマップするマップ変数を追加します。 ただし、ドアについてはドア メッシュの形状を変更したくないため、マップに新しいメッシュ形状を追加しません。
ドアの KeyMap 変数をビルドするには、次の手順を実行します。
変数を作成し「KeyMap」と名付けます 型は列挙型キー型です。
この変数をクリックし、[Details (詳細)] パネルで [Container (コンテナ)] ドロップダウンをクリックして [Map (マップ)] を選択します。
マップの値の種類を Struct Key Data (構造体キー データ) に変更します。
ブループリントをコンパイルし、KeyMap 値を追加します。
マップの Default Value (デフォルト値) セクションで、キー マップに 3 つの新しい要素を追加 (+) します。
最初のエントリを追加するときに、新しいエントリを追加し続けることができるように、型を別の色に変更します。同じエントリを複数回追加することはできません
各マップ要素について、対応するキー マテリアルを追加します。
M_BasicColor_YellowM_BasicColor_RedM_BasicColor_Blue
各要素で、キー メッシュがなしであることを確認します。 メッシュを削除するには、ドロップダウンをクリックして、リスト上部の [Clear (クリア)] を選択します。
ドアのブループリントを保存してコンパイルします。
色変更ブループリント ロジックを追加する
変数を設定したら、ブループリント グラフを変更して色を変更する機能を追加することができます。
まずドアを変更し、追加した新しい RequiredKey 変数で制御される、赤、青、黄色の色オプションを設定します。 ドアの色は、ゲームプレイの開始時ではなく、レベル内で設定すると色を変える必要があります。 したがって、この機能を作成するために [Construction Script (コンストラクション スクリプト)] タブを使用します。
ドアのカラー オプションを追加するには、次の手順を実行します。
ドアの [Construction Script (コンストラクション スクリプト)] タブに移動します。ここで、ドアが作成されるための機能を作成できます。 グラフで、この関数のロジックを開始する紫色の Construction Script ノードを見つけます。
コンストラクション スクリプトに接続した Sequence ノードで、[Add pin (ピンを追加)] (+) を使用して、「Then 2」という名前のピンをさらに 1 つ作成し、チェーンのビルドに使用します。
Sequence ノードはアクションのシーケンスをビルドするために使用され、追加するピンの数に応じて、Then 0 が最初に実行され、Then 1 はその後に実行されます。 これらのグラフを使用すると、グラフを整理したり、ロジックのチェーンが長くなるのを防ぐことができます。
[Then 2] ピンをグラフの空白部分にドラッグし、Branch ノードを作成します。
Branch ノードの Condition ピンをドラッグして、Get Use Key ノードを作成します。 Branch がテストするのは ドアでキーを使用するかどうかです。
Branch ノードの True ピンをドラッグし、Fn BPLSet Key ノードを作成します。 これは、新しいマテリアル カラー (メッシュがある場合はメッシュ) をスタティック メッシュの配列に適用するライブラリ関数です。
Fn BPLSet Key ノードの Static Mesh Array (スタティック メッシュ配列) ピンをドラッグして、Make Array ノードを作成します。
Make Array ノードの 追加ピン (+) ボタンをクリックします。
Make Array ノードから最初のピン、[0] をドラッグし、Get Door ノードを作成します。
[My Blueprint (マイ ブループリント)] パネルの [Variables (変数)] > [Components (コンポーネント)] リストを見ると、ドアに Door と Door2 スタティック メッシュ コンポーネントがあることがわかります。 これらは色を変更する対象です
2番目のピン [1] からドラッグして Get Door 2 ノードを作成します。 これにより、Door と Door 2 の 2 つのスタティック メッシュ コンポーネントに基づく配列が作成されます。
Fn BPLSet Key ノードから Key Map ピンをドラッグし、Get Key Map ノードを作成します。 これはドアの KeyMap 変数への参照です。
Key ピンをドラッグし、前に追加した RequiredKey 変数への参照である Get Required Key ノードを作成します。
コンパイルしてブループリントを保存します。
これで、ドアのコンストラクション スクリプトで Sequence ノードの Then 3 ピンの後に以下が追加されるはずです。
これは、このロジックのコピー可能なバージョンです。
このスニペットをコピーして BP_DoorFrame のコンストラクション スクリプトに貼り付ける場合、既存の Sequence ノードに 3 つ目のピンを追加してから、そのピンを Branch ノードの実行ピンに接続する必要があります。
ドアの色のテスト
ドア ゲーム オブジェクトを色分けしたら、プレイヤーが正しいキーを持っていない場合はドアが開かないように設定できます。
レベルで、BP_DoorFrame インスタンスの 1 つを選択します。
[Details (詳細)] パネルで、上部の検索フィールドに「Key」と入力します。 これにより、[Use Key (キーを使用する)] と [Required Key (必須キーが必要)] という 2 つのオプションが表示されます。 必要なキーを別のキー型に変更します。 ドアの色は、キー型に合わせて変更する必要があります。
[Use Key (キーを使用する)] を false に切り替えても、ブループリントで条件として設定したため、ドアの色は更新されません。
なお、これはブループリント エディタの [Construction Script (コンストラクション スクリプト)] グラフ タブを使用する利点となります。 ゲーム モードに入るのを待つことなく、レベル エディタで変更が発生したことを確認できます。
キーベースのドア ロジックのビルド
次に、プレイヤーがどのキーを持っているかをチェックする機能をビルドできます。 このために、プレイヤーに必要なキーがあるかどうかをチェックする BP_DoorFrame ブループリントの fnHasKey という名前のカスタム機能を定義します。
関数は、特定のタスクを実行する再利用可能なブループリント ノードのセットです。
キーをチェックする関数の作成
この関数は、ドアの必須キーをプレイヤー キャラクターのキーの配列と比較し、true または false (ブール) 値を返します。 そのブール戻り値にはローカル変数を使用します。
ローカル変数で関数を作成するには、以下の手順に従います。
BP_DoorFrameブループリントで、[My Blueprint (マイ ブループリント)] パネルの [Functions (関数)] セクションの横にある [Add (追加) (+)] ボタンを使用します。 これは変数の追加に似ていますが、関数を追加するものです。新しい関数を「fnHasKey」という名前にします。
関数は独自のノードのセットを持つことができるため、独自のノード グラフを持つ独自の [fnHasKey] タブで開きます。 このタブを閉じた後に再度開く必要がある場合は、[Functions (関数)] リスト内の関数をダブルクリックします。
[My Blueprint (マイ ブループリント)] パネルの一番下に [Local Variables (ローカル変数) (FnHasKey)] という新しいセクションが追加されています。 そのセクションの横にある [Add (+ 追加)] でローカル変数を新規作成します。
変数に「HasRequiredKey」という名前を付けて型をブーリアンに設定します。
ローカル変数は通常の変数と似ていますが、特定の関数にローカルです。 関数の実行中に一時的な値を格納するために役立ちます。 次に、Return ノードを使用してこの値をブループリントの他の部分に渡すことができます。
関数を設定したら、プレイヤーが正しいキーを持っているかどうかを確認するロジックを追加できます。
ドアのボリューム内のアクタが必要なキーを保持しているかどうかをチェックするには、以下の手順に従います。
fnHasKey 関数のエントリ ノードのピンをドラッグし、Sequence ノードを作成します。 これにより、順序どおりに実行される一連のアクションに対する関数のロジックが整理されます。
Sequence ノードの Then 0 ピンをドラッグして、Fn BPIGet Keys (Message) ノードを作成します。 これは、プレイヤーがすでに見つけたキー型の配列を返すインターフェース機能です。
Fn BPIGet Keys ノードのターゲット ピンをドラッグし、Get Other Actor ノードを作成します。 ドアのイベント グラフを設定すると、ドアのボリュームにオーバーラップするアクタがこの変数に格納されます。
HasRequiredKey ローカル変数を Fn BPIGet Keys ノードの近くにドラッグし、[Set (設定)] を選択します。
FN BPIGet Keys ノードの Exec ピンをドラッグし、Set HasRequiredKey ノードに接続します。
Set HasRequiredKey ノードから HasRequiredKey ピンをドラッグし、Contains Item ノードを作成します。これは、検索の [Array (配列)] セクションにリストされます。 このノードは、特定のアイテムが配列内にあるかどうかをチェックし、true または false を返します。
検索範囲を特定のオプションに絞り込むために、「Array Contains Item」を検索することもできます。
Contains Item ノードから Target Array ピン (角型のピン) をドラッグし、Fn BPIGet Keys ノードの Held Keys ピンに接続します。
Contains Item ノードの Item to Find ピン (円形) をドラッグし、Get Required Key ノードを作成します。
この時点で関数のグラフは次のようになります。
この一連のアクションでは、OtherActor (変数) によって保持されているキーに RequiredKey (変数) が含まれているかどうかをチェックします。 必要な場合、HasRequiredKey を true に設定します。
次に、HasRequiredKey の結果をブループリントの他の部分に渡します。 これを行うには、関数の実行を停止し、関数を呼び出したブループリントに値を返す Return ノードを使用します。
Return ノードで関数を終了するには、次の手順に従います。
Sequence ノードから Then 1 ピンをドラッグし、ノード アクション リストで「Return」を検索して、Add Return Node を選択します。
機能が値を返すようにするには出力が必要です。 Return ノードをクリックして強調表示します。
[Details (詳細)] パネルで、一番下の [Outputs (出力)] セクションの横にある [Add (追加)(+)] をクリックします。 新しい出力を追加すると、この関数から渡される値になります。
これに「KeyFound」という名前を付けて 型をブーリアンに変更します。
グラフに戻り、Return ノードの Key Found ピンをドラッグし、Get HasRequiredKey ノードを作成します。
完全な FnHasKey 機能グラフは、次のようになります。
このスニペットをプロジェクトにコピーする場合は、FnHasKey 関数エントリ ノードを Sequence ノードに接続する必要があります。
キーでドアをロック/ロック解除
これで、必要な条件が全て true の場合に開くようにドアを変更できます。
キー型と同様に、キー型を使用したドアの解錠を試みる前に、キャラクターが BPI_PlayerKeys インターフェース (プレイヤーの「許可スリップ」) を実装しているかどうかを確認する必要があります。
そのため、開く前にドアは次の条件をチェックする必要があります。
キー型を使用するようにドアを設定します (UseKey = True)。
オーバーラップしているアクタはプレイヤーです (BPI_PlayerKeys を実装)。
プレイヤーは必要なキー型を持っています。
ドアとインタラクトしているアクタがプレイヤーかどうかをテストするには、次の手順を実行します。
BP_DoorFrameのイベント グラフで、Event ActorBeginOverlap ノードを見つけます。 このノードのコレクションは、キャラクターがドアのコリジョン ボリュームに足を踏み入れたときにどうなるかを制御するものです。 ブループリント インターフェースとキーの要件をこのロジックに追加し、アクタがプレイヤーであり、正しいキーを持たない限りドアが開かないようにします。Ctrl + F ノードを使用するとノード名を検索できます。 検索結果をクリックすると、その検索結果に直接移動できます。
Alt キーを押しながら 2 つのノードの間のワイヤーをクリックすることで、Event ActorBeginOverlap ノードを Door Control ノードから切断します。 Event ノードを後ろに移動し、ドア コントロールの前にノードの操作を行うスペースを確保します。
ブループリント ノードの接続解除Event ActorBeginOverlap ノードからピンをドラッグし、Set Other Actor ノードを追加します。 Event ノードの Other Actor ピンを Set ノードの Other Actor ピンに接続します。
これにより、ドア領域にオーバーラップしたアクタが格納されます。
Set Other Actor ノードから青色の Value ピンをドラッグし、Does Object Implement Interface ノードを作成します。 インターフェース値を
BPI_PlayerKeysに設定します、Set Other Actor ノードの Exec ピンをドラッグして、新しい Branch ノードを作成します。
ドアがキーを使用するかを確認するには、次の手順を実行します。
Branch ノードの True ピンをドラッグし、Fn Has Key ノードを作成します。これは、このチュートリアルですでに作成した関数です。 ドアを開くために必要なキー型を取得し、プレイヤーが保持しているキーの配列でそのキー型を確認します。 この関数をここで呼び出すと その中のノードが実行されます
Fn Has Key ノードの Exec ピンからドラッグして、新しい Branch ノードを作成します。
Fn Has Key ノードの Key Found ピンを Branch ノードの Condition ピンに接続します。
新しい Branch ノードの True ピンを Door Control ノードの Play ピンに接続します。
ここまでのロジックでは、プレイヤーが正しいキーを持っている場合にのみドアが開くように設定しています。 ドアは次の場合も開く必要があります。
ドアにキー型が必要ないか、
非プレイヤー キャラクターがドアから通過を試みた場合。
最初の Branch ノードと And ノードは、これら両方の条件をテストします。 どちらかが False の場合、BranchもFalse となります。
NPC が確実にドアを開くことができるように、およびキー型が必要ない場合は、次の手順に従います。
最初の Branch ノードの False ピンを Door Control ノードの Play ピンに直接接続します。 2 つのノードの間にあるワイヤーをダブルクリックすると、コネクタを使用してブループリントを整理することができます。
コンパイルしてブループリントを保存します。
アクタがキー インターフェースを実装していない場合、またはドアがキーを必要としない場合 (UseKeys = False)、ドアは引き続き開きます。
このチュートリアルでは、NPC が通過できるようにドアを設計しました。 ゲームを異なる動作にしたい場合は、先に進んで自分でグラフを変更してみてください。
新しい BP_DoorFrame のイベント グラフ ロジックは次のようになります。
ブループリントにコメントを追加
ブループリントにコメント ブロックを追加して、ノードをグループ化し、ブループリントの各部分の機能を説明する視覚的なメモを作成することができます。 コメントを記述すると、作成したノードやチーム メンバーが一目で実行している機能を把握し、ブループリントを整理することができます。
ブループリント ロジックを構築する際は、まず機能の作成に注力してから、追加したノードをハイライトし、それらのノードに含まれる説明するコメントを追加します。
ブループリントにコメントを追加するには、次の手順に従います。
グラフをクリックして、有効なパネルであることを確認します。
キーボードの C を押します。 これによりコメント ボックスが追加されます。
コメントを入力するには、ボックス上部のテキスト フィールドをダブルクリックします。
コメントのサイズを変更するには、コメントを選択 (黄色い輪郭でハイライト) した状態で、エッジまたはコーナーをドラッグします。
コメント内でメモをグループ化するには、それらのノードをコメントのバウンド内にドラッグします。
1 つまたは複数のノードを選択して C キーを押すと、選択したノードを含むコメントを追加することもできます。
ドアのテスト
レベル エディタでレベルに戻ります。 ドアの [Required Key] プロパティを使用して、さまざまな色でドアを設定し、各色用に BP_Key を追加します。
では、ゲームをプレイしてみましょう。 キーを入手せずに扉に向かって歩いても、扉は開きません。
キー型を入手した場合 近づくとドアが開くためです 十分に離れると自動的に閉じます
キー カラーを 1 つ選択した後、別の色であるドアを開こうとします。 ドアは閉じたままにする必要があります。
このチュートリアルのサンプル レベルを使用する場合、Hallway 2 につながるドアを選択し、必要なキーを青色のキーに変更します。 次に、ホール 3 につながるドアを選択し、必要なキーを赤のキーに変更します。 Hallway 1 への扉を黄色にします。
デバッグ メッセージでフィードバックを追加
ゲームプレイ中にブループリントで起きていることを確認したい場合は、Print String ノードを使用して画面にメッセージを表示することができます。 Unreal Engine は最終的なゲームではこれらのメッセージを表示しません。
プレイヤーが手に入れたキー型を確認するために、Print String ノードを追加してみましょう。
Print String ノードを使用してデバッグ メッセージを表示するには、次の手順を実行します。
BP_AdventureCharacterイベント グラフで、Event fnBPIAddKey で始まる一連のノードに移動し、キーを HeldKeys 配列に追加します。Add ノードの Exec ピンからドラッグして、Print String ノードを追加します。
In String は画面上に表示されるテキストです カスタム テキストを入力するか、Event ノードの Key Type ピンを In String に接続します。 プレイヤーが手に入れたキーを表示します。
ブループリントをコンパイルします。
もう一度ゲームをプレイして、キーを取得します。 ピックアップすると、各キー カラーを確認するデバッグ テキストが表示されます。
完了したら、ノード グラフに戻り、Print String ノードと Enum to String ノードを削除します。 コンパイルしてブループリントを保存します。
ブループリントで予期したとおりに動作しない場合は、計算、イベント呼び出し、関数呼び出しの後に Print String ノードを追加することで、値やフローで起きていることを追跡しやすくすることができます。
ゲームのプレイ中にブループリントを開くと、ワイヤーが照らされて、ロジックがリアルタイムで実行されていることがわかります。 この実行トレースを使用すると、Print String メッセージとともに発生している処理を簡単に確認できます。
ピックアップ アイテムの配置
ここまで、フロアにキーを配置しました。 プレイヤーにとって魅力的で魅力的なものにするよう、プラットフォーム要素を導入してみましょう。
このチュートリアルのサンプル レベルでは、キーを高い場所に配置することで立体感を高め、プレイヤーがキーまでジャンプする必要があります。 ここでは 落下して最初からやり直さなければならないリスクが多少あります。
プレイヤーは 1 つ目と 2 つ目のプラットフォームでジャンプを練習してから、柱へのより難しい最終ジャンプのテストに進みます。
サンプル レベルを試す
独自に作成するのではなく、チュートリアル シリーズのこの部分でデザインされた部屋の新しいピースを追加したい場合は、以下のスニペットをコピーしてください。
部屋のブロックアウトを開始
このテキスト スニペットには、傾斜、埋め込まれた床、円柱、および黄色のキーへのパスを作成するために追加された 2 つのプラットフォーム メッシュが含まれています。
Begin Map
Begin Level
Begin Actor Class=/Script/Engine.StaticMeshActor Name=Floor_168 Archetype="/Script/Engine.StaticMeshActor'/Script/Engine.Default__StaticMeshActor'" ExportPath="/Script/Engine.StaticMeshActor'/Game/AdventureGame/Designer/Lvl_Adventure.Lvl_Adventure:PersistentLevel.Floor_168'"
Begin Object Class=/Script/Engine.StaticMeshComponent Name="StaticMeshComponent0" Archetype="/Script/Engine.StaticMeshComponent'/Script/Engine.Default__StaticMeshActor:StaticMeshComponent0'" ExportPath="/Script/Engine.StaticMeshComponent'/Game/AdventureGame/Designer/Lvl_Adventure.Lvl_Adventure:PersistentLevel.Floor_168.StaticMeshComponent0'"
End Object
Begin Object Name="StaticMeshComponent0" ExportPath="/Script/Engine.StaticMeshComponent'/Game/AdventureGame/Designer/Lvl_Adventure.Lvl_Adventure:PersistentLevel.Floor_168.StaticMeshComponent0'"
StaticMesh="/Script/Engine.StaticMesh'/Engine/MapTemplates/SM_Template_Map_Floor.SM_Template_Map_Floor'"
bUseDefaultCollision=False
StaticMeshDerivedDataKey="STATICMESH_34081786561B425A9523C94540EA599D_359a029847e84730ba516769d0f19427Simplygon_5_5_2156_18f808c3cf724e5a994f57de5c83cc4b_680318F3495BDBDEBE4C11B39CD497CE000000000100000001000000000000000000803F0000803F00000000000000000000344203030300000000"
MaterialStreamingRelativeBoxes(0)=4294901760
Start Room の新しいブロックアウト形状に対し、次の手順を実行します。
Unreal Editor で、新しいジオメトリでこれらが失われないように、Start Room から全てのキーを削除します。
[Copy Full Snippet (フルスニペットをコピー)] をクリックします。
Unreal Editor で、ビューポートが有効なパネルであることを確認し (ビューポートまたはアウトライナー内の任意の場所をクリックしてから Esc キーを押す)、Ctrl + V を押します。
このチュートリアルの前の部分でブロックアウト部屋を移動した場合は、新しいメッシュが適切な場所に表示されない場合があります。 必要に応じて移動させます。
3 つのフロア ピースが新しいへこんだフロアを覆っています。 ビューポートで、それぞれをクリックしてから Delete キーを押します。
サンプル コピー ペーストのデモ
次の内容
プレイヤー キャラクターはキー型をピックアップできますが、これまでに回収したものが何かを示すフィードバックがありません。 次のセクションでは、プレイヤーのインベントリにあるキーを表示するヘッドアップ ディスプレイ (HUD) を作成します。