Blueprint Map は ブループリントの配列 の次によく使用される要素です。これには納得のいく理由があります。Blueprint Mapsは、関連付けられているキーを使用して、効率的に値を検索して取得できるためです。このガイドを修了すると、ブループリント スクリプティング環境でのマップの作成および編集、アイテムのクエリおよび表示、Unreal Engine 4 (UE4) での Blueprint Map の基本的な操作を実行できるようになります。
1.必要な設定を行う
Blueprint Map を使用する前に、コンテナのコンテンツが表示されるようにプロジェクトを設定する必要があります。
-
[Games] > 「First Person (ファーストパーソン)」テンプレートを使って、以下の設定で新規プロジェクトを作成します。
- [Blueprint (ブループリント)] を有効にする。
- [Maximum Quality] を有効にする。
- [Desktop/Console (デスクトップ/コンソール)] を有効にする。
- [With Starter Content (スターターコンテンツ有り)] を有効にする。
- プロジェクトに「ExampleMapProject」と名前を付けます。
-
プロジェクトの コンテンツ ブラウザ から「Blueprint」フォルダをダブルクリックします。
-
コンテンツ ブラウザ で[Add New (新規追加)] ボタンをクリックして [Create Basic Asset (基本アセットを作成)] ポップアップ メニュー配下の [Blueprint Class] を選択します。
-
[Pick Parent Class (親クラスを選択)] メニューが開いたら、TextRender Actor ブループリント クラスを検索するために [All Classes] の矢印をクリックします。
-
検索バー に 「TexRenderActor」 と入力して、TextRenderActor ブループリント クラスを選択して [Select (選択)] ボタンをクリックします。
-
この時点で、プロジェクトの コンテンツ ブラウザ には新規作成した TextRender Actor が配置されていることを確認します。この新規アクタに「DisplayMap」と名前を付けます。
-
DisplayMap TextRender アクタを Unreal Editor の Perspective (3D) Viewport にドラッグします。
-
DisplayMap の TextRender アクタが選択された状態で、[+ Add Component (コンポーネントを追加)] ボタン ([Details (詳細)] パネルにある) をクリックして 検索バー に「Box Collision」と入力します。
-
Box Collision Component を TextRender アクタに追加したら、新規コンポーネントに Trigger Box と名前を付けます。
-
次に、[Details (詳細)] パネルでアクタの [Transform (トランスフォーム)] 設定を表示するために TextRender コンポーネントを選択します。
-
Display Set アクタの [Transform] を更新して、以下の値に反映させます。
-
次に、Display Map アクタの [Horizontal Alignment (水平アラインメント)] を、Horizonal Alignment のデフォルト値の [Left (左)] 揃えから [Center (中央)] 揃えに変更します。
-
現在 Trigger Box コンポーネントは [Hidden in Game (インゲームで非表示にする)] がオンになっています。[Details (詳細)] パネルの [Rendering (レンダリング)] メニューにある [Hidden in Game (インゲームで非表示にする)] チェックボックスのチェックを外せば Box Collision コンポーネントをインゲームで表示できます。
Box Collision コンポーネントをインゲームで表示すると、トリガーされたイベントを操作する基本ロジックが原因の可能性のある問題のデバッグに便利です。
-
PIE (Play in Editor) モードに入ると、発射物に DisplayMap コリジョン ボックスに対するコリジョン反応があることがわかります。この時点で必要なのは、Display Map のコリジョン反応に Map コンテナのコンテンツを表示できるイベントをトリガーさせることのみです。 これを実行するため、[Details (詳細)] パネルにある [Collision] メニューの [Collision Presets (コリジョン プリセット)] ドロップダウン リスト ボックスをクリックして、[Custom...] オプションを選択します。
-
最後に、以下の値を設定して、[Collision Presets (コリジョン プリセット)] を更新します。
このセクションの結果
このステップでは、新規プロジェクトを作成し、新規 TextRender アクタも設定しました。これにより、次のステップで作成、編集、表示する Blueprint Map コンテナのコンテンツが表示されます。
2.Blueprint Map を作成して表示する
新規作成したプロジェクトに TextRender アクタを設定できたので、次は Blueprint Map コンテナを作成し、それをインゲームで表示します。
-
プロジェクトの コンテンツ ブラウザ から Display Map TextRender アクタをダブルクリックして、ブループリント イベントグラフ を開きます。
- 以下の画面が表示されたら、[Open Full Blueprint Editor (フル ブループリント エディタを開く)] リンクをクリックして開始します。
-
DisplayMap TextRender アクタ ブループリントの イベントグラフ が表示されていることを確認します。このイベント グラフで Blueprint Map とその表示ロジックを追加することができます。
上記画面が表示されない場合は、[Event Graph (イベント グラフ)] タブをクリックしてアクタのブループリント イベントグラフ エディタを開きます。
-
次に、後で表示するキー / 値のペアを格納する Blueprint Map コンテナを作成します。新規の Blueprint Map を作成するには、[My Blueprint] パネルにある [+ Add New] ボタンをクリックしてドロップダウン リストから [Variable (変数)] を選択します。
-
新しい変数に「
Instruction Map
」と名前を付けます。
-
その変数の横にある ピン タイプ のボタンをクリックします。
-
次にドロップダウン リストから変数タイプの [Integer (整数)] を選択します。
-
[Details (詳細)] パネルの [Variable Type] ドロップダウン リストの横にある、その変数の コンテナ タイプ ボタンをクリックします。
-
次にドロップダウン リストから Map コンテナ タイプを選択します。
-
次に、Map のキー値のプロパティ タイプを定義します。今、キーは選択した通りの Integer 型になっています。しかし、値は String 変数型ではありません。値を Integer から String へ変更するには、値のプロパティ タイプのドロップダウン リストをクリックします。
-
ドロップダウン リストから [String] を選択します。
- この時点で、それぞれ Integer 型のキーと String 型で構成されるキー/値のペアを作成しました。また、コンテナ内に格納するアイテムを定義する前にブループリントのコンパイルをする必要があることをブループリント グラフから通知されます。そのまま [Compile] ボタンをクリックします。
ブループリントをコンパイルすると、コンテナの [Default Value] メッセージがインターフェースに置き換えられ、Map のキーが Interger 型で値が String 型のキー / 値のペアをコンテナに追加できます。
- これまでの作業を保存していない場合は、[Save] ボタンをクリックしてすべての作業を保存してください。
-
[Details (詳細)] パネルの[Default Value] メニューにある [+] (要素を追加) ボタンをクリックして、キー / 値のペアを新たに定義した Instruction Map コンテナに追加します。
-
コンテナの新しいキー/値のペアのキーを「
1
」、値を「WASD to run」と定義します。 -
この 2 ステップを繰り返して、Instruction Map コンテナを以下のキー / 値のペアで作成します。
ロジックのスクリプトを作成する
新規に作成した Blueprint Map のコンテンツを表示する前に、必要なロジックを書き込む必要があります。
-
これでコンテナを定義できたので、Instruction Map 変数をブループリント イベントグラフにドラッグします。
-
Instruction Map ドロップダウン リストから [Get (ゲット)] を選択します。
-
Instruction Map ノードを引き出して Map Utilities インターフェースから Find ノードを追加します。
Map から値を取得する方法はいくつかあります。このチュートリアルのこの部分では、Instruction Map に格納されている関連付けられた値を表示するために integer 型のキーをインクリメントします。
-
この注意事項を考慮して、[+ Add New (新規追加)] ボタンをクリックし、ドロップダウン リストから [Variable (変数)] を選択します。
-
その変数の型を Integer に設定し、「
Key
」と名前を付けます。必要に応じで、ピン タイプを右クリックして、マップの代わりに単一の値に変更します。 -
Integer 変数の宣言と定義が完了したら、Key をブループリント イベントグラフにドラッグして、ドロップダウン リストから [Get (ゲット)] を選択します。
-
Key ノードを引き出して IncrementInt ノードを検索して追加します。
-
次に IncrementInt ノードを Find ノードに接続します。
このチュートリアルの目的上、時間関数を使用して Key 変数をインクリメントします。
-
Event Tick ノードを引き出して、Delay ノードを検索して追加します。
-
遅延時間を 2 秒に設定し、Delay ノードを IncrementInt ノードに接続します。
-
Event BeginPlay ノードを引き出して Branch ノードを検索してこのノードに接続します。
-
次に IncrementInt ノードを Branch ノードに接続します。
-
次に Find ノードに属する Boolean 型の戻り値を Branch ノードの Condition ピンに接続します。
Map 内でアイテムを見つけると Find ノードは true を返します。Map 内に指定されたキーを使っているアイテムが存在しない場合、Find ノードは false を返します。
-
Branch ノードの True ピンを引き出して、Set Text(TextRender) ノードを検索してこのノードに接続します。
この部分は、コンテナに有効なキー / 値のペアがあれば、コンテナに関連づいた値を表示するというロジックです。
-
コンテナの値をインゲームで表示するには、Find ノードの 戻り値 のピンを Set Text ノードの Value ピンに接続します。
-
次に、Branch ノードの False ピンを引き出して、Set Text(TextRender) ノードを検索し接続します。
ロジックのこのブランチは、コンテナに有効なキー/値のペアがない場合は、他の要素を表示することを意味します。
-
Branch ノードの Value ピンを引き出して、ToText(string) ノードを検索してこのノードに接続します。
-
次に、「Now, shoot the blocks!」という表示する文字列を定義します。
-
完成したスクリプトを確認したら、エディタの Viewport インターフェースに戻る前に [Compile (コンパイル)] ボタンをクリックします。
-
エディタの Viewport インターフェースで、[Play (プレイ)] ボタンをクリックして新しく実装したスクリプトの動きを確認します。
このセクションの結果
このガイドのこのステップでは、新規に作成した Blueprint Map を定義し、コンテナにキー/値のペアを設定し、TextRender アクタのブループリント イベント グラフで作成した基本ロジックのいくつかを使用してそれらの値を表示しました。もう少し高度な操作を学習したい場合は次のステップへ進んでください。キー/値のペアをマップに 追加 して、その後その マップの値を表示する方法を説明します。
3.キーと値を Map に追加する
これまでのステップで、TextRender アクタが Blueprint Map の関連付けられた値を表示するように定義をしました。このステップでは、キー/値のペアを Map に 追加 して、Map のキーと関連付けられた値を結果として表示する方法を説明します。
-
プロジェクトの コンテンツ ブラウザ から Display Map TextRender アクタをダブルクリックして、ブループリント イベントグラフ を開きます。
-
Display Map TextRender アクタのブループリント イベントグラフ が表示されます。ここで、新しくキー / 値のペアを 追加 して、最終的に Map のキーと関連付けられた値を ビューポート に表示します。
-
ここで、これから使う Add 演算用に Blueprint Map コンテナを新規作成する必要があります。Instruction Map 変数を右クリックしてドロップダウン リストから [Duplicate] を選択し、新規の Blueprint Map 変数を作成し、「
Weapon Inventory Map
」と名前を付けます。 -
新規作成した Map コンテナが以下のプロパティと一致するようにしてください。キーは String 型、値は Integer 型です
わかりやすくするため、武器名をキー、その武器が使用できる銃弾数を値にして、Weapon Inventory Blueprint Map コンテナを作成します。
-
その新しい Blueprint Map を選択すると「
Please compile the blueprint
(ブループリントをコンパイルしてください)」という [Default Value] メッセージが表示されます。 -
[Compile] ボタンをクリックします。
-
ブループリントのコンパイルが完了するとデフォルトのマップに要素がなくなり Default Value が表示されなくなります。+ (要素を追加) ボタンをクリックして、単一のキー値ペアを追加します。
-
この時点で、エディタのコンパイラ結果ウィンドウに次の警告も表示されます。
キーと値のプロパティがそれぞれ Integer-String 型の Blueprint マップである Weapon Inventory Map を作成するために、キーと値のプロパティがそれぞれ Integer-String 型の Blueprint マップを複製したため、UE4 がこの警告を出しました。複製中、エンジンが Weapon Inventory Map のキー / 値のペアへそれらをコピーしようとして、Instruction Map に属するキー / 値のペアを解析して、Weapon Inventory Map のキー/値のペアにこのキー/値のペアのコピーを試行しました。これが好ましくないビヘイビアでした。
-
次のキー / 値のペアを Weapon Inventory Map コンテナに入力します。
-
次に [Compile] ボタンをクリックします。
-
Weapon Inventory Map コンテナにキー / 値のペアを正しく入力して、新しい Blueprint Map のキー / 値のプロパティ要件を満たすと、警告が表示されなくなります。
-
新規ロジックを既存のブループリント イベントグラフに追加する前に、Weapon Inventory Map 変数をブループリントにドラッグして、ドロップダウン メニューから Get を選択します。
ロジックのスクリプトを作成する
-
新規ロジックをビルドするには、Weapon Inventory Map ノードを引き出して Map Utilities インターフェースから Keys ノードを追加します。
Keys ノードは、Weapon Inventory Map に存在するすべてのキーの Array を出力します。
-
Keys ノードに属する To Array 出力を引き出して ForEachLoop ノードを検索して追加します。
-
次に、ForEachLoop ノードに属する Array Element ピンを引き出して Print String ノードを検索して追加します。
-
ブループリント グラフ内を右クリックして コンテキスト メニュー を開き、Event ActorBeginOverlap を検索して追加します。
-
Event ActorBeginOverlap ノードから Other Actor ピンを引き出して、Cast To FirstPersonProjectile ノードを検索して追加します。
-
Cast To FirstPersonProjectile ノードを Keys ノードに接続します。
マップのキーを表示する
この時点で Play in Editor (PIE) モードになっていると、Display Map Text Render アクタのコリジョン ボックスで発射物を発砲し、Weapon Inventory Map に含まれるキーの配列を表示することができます。
スクリプト処理を終了する
-
今度は、キー/値のペアをコンテナに追加します。Weapon Inventory Map 変数をブループリントにドラッグします。
-
Weapon Inventory Map 変数を引き出して、Map Utilities インターフェースから Add ノードを追加します。
-
次に、追加したいキー / 値のペアを定義します。キーを「
Weapon 6
」、値を「60
」に定義します。 -
Add ノードの出力ピンを引き出して、Branch ノードを検索して追加します。
-
追加したキーを表示する追加の表示ロジックを設定する前に、Weapon Inventory Map 変数をブループリントにドラッグします。
-
Weapon Inventory Map 変数を引き出して、Map Utilities インターフェースから Keys ノードを追加します。
-
Keys ノードに属する To Array 出力を引き出して ForEachLoop ノードを検索して追加します。
-
次に、ForEachLoop ノードに属する Array Element ピンを引き出して Print String ノードを検索して追加します。
-
[Text Color (テキスト カラー)] ボックスをクリックして [Color Picker (カラー ピッカー)] メニューを開きます。
-
色を以下の値に設定します。
-
追加した値を表示する表示ロジックも設定しますが、やはりその前に Weapon Inventory Map 変数をブループリントにドラッグします。
-
Weapon Inventory Map 変数を引き出して、Map Utilities インターフェースから Values ノードを追加します。
-
Values ノードに属する To Array 出力を引き出して ForEachLoop ノードを検索して追加します。
-
ForEachLoop ノードに属する Execute Output ピンを引き出して Print String ノードを検索して追加します。
-
ForEachLoop ノードに属する Array Element ピンを引き出して Print String ノードに属する In String に接続します。
-
[Text Color (テキスト カラー)] ボックスをクリックして [Color Picker (カラー ピッカー)] メニューを開きます。
-
色を以下の値に設定します。
-
Branch ノードの True ピンを Keys に接続します。
-
次に Branch ノードの False ピンを Values に接続します。
-
Cast To FirstPersonProjectile ノードの Cast Failed ピンを Add ノードに接続すれば、スクリプトのロジックが完成します。
-
完成したスクリプトを確認したら、[Compile] ボタンをクリックします。
-
最後に、完成したスクリプト全体を確認したら、エディタの Viewport インターフェースに戻る前に [Save] ボタンをクリックします。
-
エディタの Viewport インターフェースで、[Play] ボタンをクリックして更新されたスクリプトの動きを確認します。
最終結果
動画を見ると分かりますが、First Person Projectile が Display Set TextRender Actor のコリジョン ボックスに発射されると、元の 5 つのキーが ビューポート に出力されます。コリジョン ボックスを通り抜ける時に、キーが追加され、その後で出力されます。コリジョン ボックスを後ろに動かす前に、もう 1 回 First Person Projectile を発射して、2 回目にコリジョン ボックスを通り抜ける時、すべての値の出力が確認できます。