このセクションでは、最初のゲームプレイ オブジェクトであるキー ブループリントを作成します。
レベルでゲームプレイ オブジェクトの機能を作成するには、ブループリント ビジュアル スクリプティングを使用します。 Unreal Engine では、ブループリントは、物理的な表現と特別な機能 (プレイヤーがピックアップ可能) を備えたアセットです。
ブループリント ビジュアル スクリプティング システムは、ノードベースのインターフェースを使用してゲームプレイ オブジェクトの動作を作成するため、コードを記述することなく機能を作成することができます。
まず、キーのインゲーム アクタを定義し、キーが 3 つの異なるバリエーション (黄色の楕円形、青色の矩形、赤色のコーン) で表示されるように設定できるコンポーネントを追加します。 ブループリントでは、バリエーションごとに個別のアセットを作成するのではなく、全てのオプションを 1 つのアセットにビルドすることができます。
次に、キーの動作、つまりプレイヤー キャラクターがキーをピックアップする機能を追加します。 オブジェクトをピックアップすることは、最もよく使用されるゲームプレイのメカニクスの 1 つです。
以下は、3 つの異なるアピアランス オプションがあるキーを作成し、プレイヤー キャラクターがキーを取得できるようにするために作成する全てのアセットの概要です。
開始する前に
「パズル アドベンチャーの設計」の以前のセクションで取り上げた、次のトピックを理解できていることを確認します。
Unreal Editor の UI (コンテンツ ブラウザ やビューポートなど)。
ブループリントについて理解していること。 詳細については、「ブループリントの基礎」を確認してください。
プロジェクトの設定とレベル ブロックアウト に含まれる以下のアセットが必要です。
ブロックアウトされた部屋があるレベル。
キー型とキー属性の定義
キーのブループリントを作成する前に、ブループリントで赤、黄、青のバリエーションを作成するために使用するキー データを定義します。
ゲームで使用するさまざまな種類のキーを表現するには、列挙型と構造体を使用します。
| アセットタイプ | 説明 |
|---|---|
列挙型 | 列挙型とも呼ばれる用語には、プロジェクトで使用できる一連の値が格納されます。 キーには列挙型を使用して、選択できるさまざまなキー型 (黄色の楕円形、青色の矩形、赤色のコーン) を定義します。 |
構造体 | 構造体は、関連する情報をグループ化するために使用されます。 キーについては、メッシュ (3D モデル) およびそのメッシュに適用するマテリアル カラー (赤、黄、青) といった、キーの属性を全て保持する構造体を使用します。 |
各列挙子はコンテナ上のラベルのように機能し、構造体は各コンテナのコンテンツのように機能します。
列挙型でキー型を定義する
まず、キー バリアントの赤、黄、青を定義する列挙アセットを作成します。
列挙体アセットを作成するには、次の手順を実行します。
Unreal Engine の左下隅にある [Content Drawer (コンテンツ ドロワー)] ボタンを使用して、コンテンツ ブラウザまたはコンテンツ ドロワーを開きます。
このチュートリアルで作成するブループリントとサポート アセットを格納する場所を作成します。 [Content (コンテンツ)] > [AdventureGame] > [Designer (デザイナー)] フォルダに移動します。 このフォルダで右クリックして [New Folder (新しいフォルダ)] をクリックします
新しいフォルダを「
Blueprints」という名前にします。「Blueprints」フォルダで「
Core」という名前の別のフォルダを作成します。「Core」フォルダを右クリックし、[Blueprint (ブループリント)]に移動して、[Create Asset (アセットの作成)] メニューから [Enumeration (列挙型)] をクリックします。 新しいアセットを「
Enum_KeyType」と名付けます。このアセットをダブルクリックして新しいウィンドウで開きます。
[Enumeration (列挙型)] には、列挙子オプションのリストが含まれています。
列挙型にキー型を追加するには、次の手順を実行します。
[Add Enumerator (列挙子を追加)] ボタンを 3 回クリックして、3 つの新しい列挙型をリストに追加します。
最初の列挙子の表示名を「
Blue」に変更します。 2 つ目は「Yellow」に、 3 つ目は「Red」に変更します。ウィンドウの左上隅にある [Save (保存)] ボタンをクリックして、列挙型アセット ファイルを保存します。 代わりに、CTRL + S を使用します。
列挙子を追加すると、リストにオプションを追加することになります。 Blue、Yellow、Red は全て、異なるキー型を区別するために使用する値です。
ブループリントと比較すると、機能をコンパイルしないため、データ アセットをコンパイルする必要はありません。
構造体でキー属性を定義
次に、各キー型を区別する属性 (メッシュの形状と色) を定義する構造体を作成します。
構造体 (struct) アセットをビルドするには、次の手順を実行します。
コンテンツ ブラウザにもう一度移動し、まだ[Content (コンテンツ)] > [AdventureGame] > [Designer (デザイナー)] > [Core (コア)] フォルダにいることを確認します。
「Core」フォルダ内を右クリックして [Blueprint (ブループリント)] から [Structure (構造体)] をクリックします。 このアセットに「
Struct_KeyData」という名前を付けます。新しいアセットをダブルクリックして、新しいウィンドウで開き、構造体のプロパティを表示します。
この構造体には、デフォルトで「MemberVar_0」という名前の変数が含まれます。 [+Variable (+変数)] をクリックして 2 つ目の変数を追加します。
最初の変数の名前を「
Key Material」に変更し、2 つ目の変数を「Key Mesh」に変更します。各変数にはデータ型が割り当てられています。 デフォルトでは、これはブーリアン (true または false の値) に設定されています。 両方の変数の型を変更する必要があります。
Key Material 変数の Boolean というドロップダウンをクリックします。 検索フィールドに「
material instance」と入力し、[Material Instance (マテリアル インスタンス)] にカーソルを合わせて、[Object Reference (オブジェクト参照)] を選択します。これらの手順を繰り返し、キー メッシュ の変数の型を [Static Mesh (スタティック メッシュ)] > [Object Reference (オブジェクト参照)] に変更します。
構造体アセット ファイルを保存します。
これで、各キー型が使用する 2 つの属性を作成できました。一つは、キーの色を設定するキー マテリアルで、キーの形状を設定するキー メッシュです。
キーに含まれるデータの種類の定義が完了しました。 次に、キーの色を設定し、各キー型を実際にビルドします。
キー カラーの作成
青、黄色、赤のキー型のデータが揃ったので、次に各キー型の割り当てた色を含むマテリアルを作成します。
Unreal Engine では、マテリアルがサーフェスの外観を定義します。 色、テクスチャ、輝き、透過度などを制御します。 マテリアル インスタンスはマテリアルを基礎として使用するマテリアルのコピーですが、カラーやテクスチャなどの特定の設定をオーバーライドすることができ、まったく新しいマテリアルをゼロから作成する必要はありません。
この例では、ゲーム内の全てのキーの属性を定義するベース マテリアル を作成します。 次に、そのマテリアルの 2 つのマテリアル インスタンスを作成し、全ての属性をコピーして色をオーバーライドします。
このセクションでは、このチュートリアル シリーズ全体で使用できるように、マテリアルの作成方法を簡単に説明します。マテリアルについては詳しく説明されていません
色付きのマテリアル アセットを作成するには、以下の手順を実行します。
コンテンツ ブラウザに移動します。 移動先は [Content (コンテンツ)] > [AdventureGame] > [Designer (デザイナー)] フォルダです。
[Designer (デザイナー)] フォルダを右クリックして [New Folder (新しいフォルダ)] をクリックします このフォルダの名前を「
Materials」とします。[Materials (マテリアル)] フォルダに移動します。 フォルダ内で右クリックし、[Material (マテリアル)] を選択してマテリアル アセットを作成します。
マテリアル アセットの名前を「
M_BasicColor」に変更します。チュートリアルのサンプル レベルでは、命名規則として「
M_」プレフィックスを使用してマテリアルを識別しています。このマテリアルをダブルクリックして開きます。 マテリアル エディタが新しいウィンドウで開きます。
マテリアル エディタはノードベースのエディタです。つまり、ブループリント ビジュアル スクリプトと類似した機能を使用して構築されています。 「M_BasicColor」という名前のノードが表示されます。これは、このマテリアルのプロパティを変更するために使用できるメイン ノードです。
Base Color プロパティは、このマテリアルの色を設定します。 Base Color の横にあるグレーの色見本をクリックすると、色を手動で設定できます。
カラー ピッカーを使用する代わりに、各マテリアル インスタンスでオーバーライドできるカラー パラメータ ノードを作成します。そのため、1 つのマテリアルが多くの色になります。 パラメータの作成は変数の追加と同様で、マテリアル インスタンスの編集可能なパラメータにマテリアル カラーを変換します。
カラー パラメータ ノードを作成するには、次の手順を実行します。
[Base Color (ベース カラー)] の隣にピンがあります。 ピンをクリックして、グラフの空白の領域にドラッグします。
ドロップダウン リストで、検索フィールドに「
VectorParameter」と入力し、VectorParameter を選択します。これによりカラー ピッカーを持つ新しいノードが作成されます。 ベクター型の変数には 3 つの値があるため、それを使用して色の RGB 値を定義できます。
ノードを最初に作成すると、ノードのデフォルト名の「Param」が強調表示されます。 ノードの名前を「Color」に変更し、マテリアル インスタンスで識別しやすくします。
「Param」が強調表示されていない場合は、ノードをクリックしてから、ノード名をクリックして名前を変更します。
新しい Color ノードで、Default 値 の横にある格子模様の正方形をクリックしてカラー ピッカーを開きます。
[Hex sRGB] フィールドで値を
F7DE0000(黄色) に変更し、[OK] をクリックします。保存してマテリアル アセットを閉じます。
次に、マテリアル インスタンスを作成して、メイン マテリアルを再作成することなく色を追加します。
キー カラー用に 3 つのマテリアル インスタンスを作成するには、以下の手順に従います。
コンテンツ ブラウザで、作成した
M_BasicColorアセットを右クリックします。 コンテキスト メニューの上の方にある [Create Material Instance (マテリアル インスタンスの作成)] をクリックします。マテリアルインスタンスのアセットに「
M_BasicColor_Red」という名前を付けます。 このアセットをダブルクリックして開きます。このウィンドウはマテリアルエディタとは異なっていることがわかります。 これは、マテリアル インスタンスではマテリアルの完全な編集スイートが必要なく、代わりにベースマテリアルで定義したパラメータの変更に重点を置くためです。
[Details (詳細)] パネルで、一番上の [Parameter Groups (パラメータ グループ)] から [Global Vector Parameter Values (グローバル ベクター パラメータ値)] を展開します。
無効なカラーが表示されます。これはベース マテリアルに追加した VectorParameter ノードです。 [Color (カラー)] の横にあるチェックボックスをクリックして有効にし、オーバーライドしてください。
[Color (カラー)] の横にある色見本をクリックして、Hex sRGB の値を
F7005A00に設定します。 これにより、マテリアル インスタンスが美しい赤に変わります。今度は、あなたが先導する番です。 このプロセスを繰り返して、さらに 2 つのマテリアル インスタンスを作成します。
「
M_BasicColor_Blue」という名前のマテリアル インスタンスを作成します。 色をHex sRGB =00AFF700にオーバーライドし、アセットを保存します。「
M_BasicColor_Yellow」という名前のマテリアル インスタンスを作成します。 ベース マテリアルの色を維持してアセットを保存します。
マテリアル アセットから継承されたマテリアル インスタンスのパラメータは、オーバーライドしない限り、親マテリアルの値を常に使用します。 たとえば、M_BasicColor マテリアルを開いてその色を変更すると、M_BaseColor_Yellow マテリアル インスタンスの色も変更されます。ただし、青と赤のマテリアル インスタンスの色は維持されます。
キー ブループリントをビルド
必要な全ての構成要素が揃いました。次は、キー ブループリントを作成します。 キー ブループリントは、レベルに追加して、レベルのインスタンス化アクタを作成できるアセットで、プレイヤーがピックアップできる機能があります。
キー用の新しいブループリント クラスを作成するには、次の手順を実行します。
コンテンツ ブラウザに行き、[Content (コンテンツ)] > [AdventureGame] > [Designer (デザイナー)] > [Blueprints (ブループリント)] フォルダに移動します。
「
Key」という名前の新しいフォルダを作成します「Key」フォルダに移動します。 フォルダ内で右クリックし、[Blueprint Class (ブループリント クラス)]を選択します。
親クラスとして [Actor (アクタ)] を選択します
この新しいアクタに
「BP_Key」と名付け、ダブルクリックして開きます。チュートリアルのサンプル レベルでは、ブループリント クラスを識別するための命名規則として
BP_プレフィックスを使用しています。
アクタの親クラスは通常、レベルに配置できるオブジェクトに使用されます。キャラクターの親クラスのように移動などの追加機能は含まれませんが、インタラクションやロジックのビルドに使用できます。
ウィンドウをメイン エディタにドッキングするには、レベルのタブの隣にタブをドラッグします。
キー ブループリントが適切に機能するように、いくつか追加する必要があります。
プロジェクトでキーを視覚的に表現するためのスタティック メッシュです。
プレイヤーがキーをピックアップできるほど近づいたときに検出するコリジョン ボリュームです。
キー型を知る方法です。
プレイヤーがキーに衝突した際の動作を決定するゲーム ロジックです。
コリジョンとは、ランタイム時に 2 つのオブジェクトが接触することを検出することを指します。 ボックス、カプセル、および球コリジョンは、これらの検出を行うために使用される形状です。
キーのコンポーネントの設定
最初に、ゲーム ワールドに配置して操作するものがあるように、キーのコンポーネントを設定します。
コリジョン コンポーネントとメッシュ形状をキーに追加するには、次の手順に従います。
BP_Keyで [Viewport (ビューポート)] タブに移動します。左上隅にある [Components (コンポーネント)] パネルで [Add (追加)] をクリックし、[Capsule Collision (カプセル コリジョン)] を検索して選択します。
これは、プレイヤーがキー型を入手するために接触できるコリジョン ボリュームです。 これがないと、プレイヤーはキーを検出できません。
キー メッシュ自体にコリジョンを追加することもできますが、コリジョン形状を使用することで複雑なジオメトリを均一化することができ、コリジョン検出とゲームのパフォーマンスが向上します。
[Capsule (カプセル)] コンポーネントを選択して、再度 [Add (追加)] をクリックします。 今回はSphere (スフィア) の基本形状を検索して選択し名前を「
KeyMesh」に変更します。Capsule (カプセル) コンポーネントを選択してから スフィア メッシュを追加すると、メッシュはカプセルの子になり、カプセルがメッシュの親となります。 子コンポーネントは親から全てのプロパティを継承します。
KeyMesh コンポーネントの設定:
KeyMesh コンポーネントを選択します。 [Details(詳細)] パネルで [Transform(トランスフォーム)] カテゴリに移動します。 [Scale (スケール)] では 値を「
0.3」、「0.3」、「1.0」に変更します。これにより、メッシュの側面が楕円形に縮小されます。
[Collision (コリジョン)] カテゴリで [Collision Presets (コリジョン プリセット)] を [NoCollision (コリジョンなし)] に設定します。
カプセル コンポーネントとのコリジョンを追加したので、これによってメッシュのコリジョンがオフになり、プレイヤー キャラクターがスタティック メッシュで跳ねることなくスムーズにキーを収集することができます。
カプセル コンポーネントを設定します。
カプセル コンポーネントを選択します。 [Details (詳細)] パネルの [Transform (トランスフォーム)] カテゴリで、 [Location (位置)] を「
0.0」、「0.0」、「80.0」に設定します。これにより、キーが地面の上に浮きます。 メッシュはカプセルとともに移動します。メッシュは親コンポーネントから全てのプロパティを継承している子コンポーネントだからです。
[Shape (形状)] カテゴリで [Capsule Half Height (カプセルの半分の高さ)] を「
60.0」に設定します。 これによりコリジョン ボリュームが引き伸ばされ、メッシュをよりよく囲むようになります。
[Components (コンポーネント)] パネルで、DefaultSceneRoot を選択します。 [Add (追加)] をクリックして [Rotating Movement (回転移動)] を選択します。 キーをゆっくり回転させ、プレイヤーの興味を引きます。
ブループリントを保存してコンパイルします。
キーのプロパティの設定
また、キーには、キー型や、キーの各型に対応するマテリアルやメッシュなどの情報も格納する必要があります。
これを設定するには、前に作成したキー 型の列挙型およびキー データ構造体を使用します。
ブループリントにキー型の変数を追加するには、次の手順を実行します。
[Components (コンポーネント)] パネルの下には [My Blueprint (マイ ブループリント)] パネルがあります。 [Variables (変数)] セクションで、[+] ボタンをクリックして、新しい変数を追加します。
変数の名前を「
KeyType」にします。デフォルトでは、この型はブーリアンです。 型のドロップダウンをクリックし、「Enum Key Type (列挙型キー型)」を検索して選択します。 この変数の型は以前に作成した列挙型であるため、ここで使用します。 ここで、KeyType 変数を Red、Yellow、Blue に設定することができます。
ブループリントでは、変数がノードのピンとして表示されるため、変数の型はピン型とも呼ばれます。
KeyType 変数の横にある 目 のアイコンをクリックして、この変数を編集可能なパブリック変数にします。 こうすることで後で Unreal Editor でこの変数の値を編集したり、レベルの各キー型を設定したりできるようになるため、これは重要です。
KeyType をクリックして選択します。 [Details (詳細)] パネルの [Category (カテゴリ)] プロパティの横にある [Default (デフォルト)] を削除して、「
Setup」と入力します。これにより、KeyType プロパティが [Details (詳細)] パネルの [Setup (設定)] というカテゴリの下に表示されます。
各キー型には、形状と色の組み合わせが含まれている必要があります。 次のステップでは、マップ変数を作成しての組み合わせを定義します。
キー型を形状および色にマップする変数を設定するには、次の手順を実行します。
[My Blueprint (マイ ブループリント)] パネルで、「KeyMap」という名前の新しい変数を追加します。これもタイプは列挙型キー型です。
KeyMap 変数を選択すると、[Details (詳細)] パネルの型ドロップダウンの横に、変数のコンテナ型や変数が保持する値の数を設定する別のメニューが表示されます。 コンテナ型を Map(マップ) に変更します。
Map コンテナを設定すると、コンテナ型の隣に別のタイプのドロップダウンが表示されます。 これは各マップ オプションに格納されるデータの型です。 このキー データは前に構造体で定義したため、ドロップダウンをクリックしてデータ型を Struct_KeyData に設定します。
ブループリントをコンパイルして KeyMap にマテリアルとメッシュ形状を取り込み、各 KeyType オプションに対してマテリアルとメッシュのペアを設定できるようにします。
[Details (詳細)] パネルで [Default Value (デフォルト値)] カテゴリに移動します。
[Key Map (キー マップ)] の横にある [+] ボタンをクリックして、新しい要素をマップに追加します。
キー型をブルーから別の色に変更します。 そうしない場合、デフォルトのキー型の要素がすでに存在するため、新しい要素を追加できません。
これをさらに 2 回繰り返して、2 つ目と 3 つ目の要素を作成します。
3 つのマップ要素を追加したら、次の値でキー型を設定します。
キータイプ キー マテリアル キー メッシュ 赤
M_BasicColor_RedCone (コーン)
黄
M_BasicColor_YellowSphere (スフィア)
青
M_BasicColor_BlueCube (キューブ)
キーマップは次のようになります。
このブループリントを保存してコンパイルします。
最後に、プレイヤー キャラクターがキーに触れたときの、プレイヤー キャラクターへの参照を格納する変数が必要です。
別のアクタへの参照を格納する変数を作成するには、以下の手順に従います。
[Variables (変数)] セクションで、
OtherActorという名前の新しい変数を追加します。タイプを [Actor (アクタ)] > [Object Reference (オブジェクト参照)] に変更します。
[Details (詳細)] パネルで、このキーとやり取りする 1 つのアクタ (プレイヤー) のみを参照する必要があるため、コンテナ型を [Single (単一)] に変更します。
この時点で、キーの変数は次のようになっているはずです。
キーのテスト
キーをテストして、ここまでで様子を確認します。
レベルに戻り、コンテンツ ブラウザで BP_Key をレベル内にドラッグします。 ゲームにインスタンスを追加できるブループリントを作成しました。おめでとうございます! ただし、依然としてグレーのままです。
キーを選択した状態で [Details (詳細)] パネルに移動します。 作成した [Setup (設定)] カテゴリを探し、[Key Type (キー型)] プロパティを見つけます。 これを Blue (ブルー)、Yellow (イエロー)、Red (レッド) に変更することができますが、グレーのオーバル キーはまだ変更されていません。
これはキーにコンポーネントとデータを追加したものの、それらのパーツが相互に通信していないためです。 そうするにはmブループリント ビジュアル スクリプトが役立ちます。ブループリント内で情報を渡し、その情報を使用してアクションを実行するロジック (ノードとワイヤー) をビルドします。
ブループリント関数でのキーの値の設定
次に、KeyMap オプションを KeyMesh コンポーネントに接続し、キー型に基づいて適切なメッシュ形状とマテリアルの色を自動的に設定する機能を作成します。
関数は、特定のタスクを実行する再利用可能なブループリント ノードのセットです。 ノード グラフを整理した状態に保つことができ、同じロジックを再作成することなく複数回実行 (または「呼び出し」) できます。 関数を使用すると、他のブループリントからブループリントのロジックの該当部分の実行をトリガーできます。
キー ブループリントで関数を作成する代わりに、新しいブループリント関数ライブラリに関数を配置します。ライブラリは、再利用可能な関数のコレクションを格納するブループリント アセットの一種です。 これらの関数は、特定のブループリントやアクタに関連付けられていません。 代わりに、プロジェクト全体でグローバルにアクセスできます。 ライブラリを使用すると、便利な関数を 1 か所に保持できるため、複数のブループリントにコピーして貼り付ける必要がありません。
新しい関数でブループリント関数ライブラリを作成するには、次の手順に従います。
コンテンツ ブラウザに移動し、[Content (コンテンツ)] > [AdventureGame] > [Designer (デザイナー)] > [Core (コア)] に移動します。
[Core (コア)] フォルダを右クリックし、[Blueprint (ブループリント)] に移動して [Blueprint Function Library (ブループリント関数ライブラリ)] を選択します。 新しいアセットに「
BPL_FPGame」と名前を付けて開きます。[My Blueprint (マイ ブループリント)] パネルの [Functions (関数)] セクションで、ハイライトされている 1 つの新しい関数から開始します。 「
fnBPLSetKey」と名付けます。このチュートリアルのサンプル プロジェクトでは、ブループリント ライブラリの関数に
BPLラベル、関数にfnプレフィックスを使用しています。 これにより、SetKey 自体とその由来を識別しやすくなり、ノード アクション リストで関数を見つけやすくなります。
次に、必要な入力と出力を使用して関数を設定します。
入力とは、関数が処理できるようにするために関数に渡す値のことです。 変数と同じように動作します。 fnBPLSetKey 関数は、KeyType、KeyMap、KeyMesh の間のアクションを実行する必要があるため、これらは入力である必要があります。
出力は、通常は結果の作成後に関数がブループリントに渡す情報です。 この fnBPLSetKey 関数は出力を必要としません。
fnBPLSetKey 関数に入力を追加するには、次の手順を実行します。
fnBPLSetKey 関数をクリックして選択します。 詳細パネルの [Inputs (入力)] カテゴリで [+] ボタンをクリックして新しい入力を作成します。
変数と同様に、各入力には名前、変数ピン タイプ、コンテナ型があります。
入力の名前を「
Static Mesh Array (スタティック メッシュ配列)」に変更します。タイプを [Static Mesh Component (スタティック メッシュ コンポーネント)] > [Object Reference (オブジェクト参照)] に変更します。 関数のノード グラフでは、紫色の機能エントリ ノードに作成した入力を含むピンが表示されており、ピンのスタイルはその型 (スタティック メッシュ配列) を反映していることに注目してください。
タイプの横にある [Container Type (コンテナの型)] ドロップダウンをクリックし、[Array (配列)] を選択します。
配列は、単一のコンテナに同じ型の複数の値を格納する変数です。 各値は配列要素として格納されます。
キーの KeyMap プロパティに一致するように、別の入力を設定します。
入力を追加して
KeyMapという名前を付けます。[Pin Type (ピン型)] ドロップダウンをクリックして [Enum Key Type (列挙型キー型)] に設定します。
[Container Type (コンテナ型)] ドロップダウンをクリックして [Map (マップ)] を選択します。
[Value Type (値の型)] ドロップダウンをクリックして [Struct Key Data (構造体キーデータ)] に設定します。
キー 型の入力を設定します。
入力をもう 1 つ追加して「
Key」という名前にします。[Container (コンテナ)] を [Single (単一)] に設定し タイプを [Enum Key Type (列挙型キー型)] のままにします。
3 つの入力は次のようになります。
次に、関数のノードをビルドします。 [Graph (グラフ)] パネルには、関数エントリ ノード fnBPLSetKey と、先ほど作成した入力 (スタティック メッシュ配列、キー マップ、キー) が表示されます。
ブループリント グラフの操作
パン:右クリックしてドラッグします。
ズーム:マウス ホイールを使用します。
新しいキー メッシュ形状でキーを設定する関数にロジックを追加するには、次の手順を実行します。
このノードの三角の [execution (実行)] ピンをドラッグし、For Each Loop を検索して、ノード アクション リストで選択します。 これにより、fnBPLSetKey ノードに接続される新しいノードが作成されます。
For Each ループ ノードを使用すると、配列のそれぞれのアイテムに対していくつかのアクションを実行できます。 ループ本体の実行ピンに接続したロジックは、配列要素ごとに 1 回実行されます。 ループが完了すると、実行は [Completed (完了)] ピンで継続されます。
fnBPLSetKey ノードの スタティック メッシュ配列 ピンをドラッグし、For Each Loop の配列 ピンに接続します。
キーには 1 つのメッシュしかありませんが、fnBPLSetKey はスタティック メッシュ配列を使用しているため、さまざまなレベル オブジェクトで使用できます。 たとえば、このチュートリアル シリーズの次のパートでは、右ドアと左ドア用の 2 つのスタティック メッシュがあるドア ブループリントを使用します。
次に、fnBPLSetKey ノードの[Key Map] ピンをドラッグし、Find ノードを検索して選択します。 このノードは、キー型を受け取り、KeyMap から対応するメッシュとマテリアルを取り出すことができます。
Find ノードの 青色の出力 ピンを右クリックし、[Split Struct Pin (分割構造体ピン)] をクリックします。
これにより、出力が Key Material (キー マテリアル) と Key Mesh (キー メッシュ) に分けられ、これらは
Struct_KeyDataの 2 つの変数です。fnBPLSetKey ノードの [Key] ピンを Find ノードのターコイズ [Key] ピンに接続します。
次に、For Each Loop ノードで、[Loop Body] ピンからドラッグして、[Struct (構造体)] カテゴリの下にある [Is Valid] を検索します。 疑問符アイコン (?) が付いている、構造体値に使用する Is Valid ノードを追加します。
このノードは有効なメッシュ形状が関数に渡されたかどうかをチェックします。 オブジェクトのスタティック メッシュとそのマテリアルの両方を設定します。 そうでない場合はマテリアルのみを設定します
Find ノードの [Key Mesh] ピンを Is Valid ノードの [Input Object] ピンに接続します。
Is Valid ノードで [Is Valid] ピンをドラッグし、Context Sensitive (コンテキストに応じて変化) オプションを false に切り替えます。
Set Static Mesh ノードを検索して追加します。
For Each Loop ノードの [Array Element] ピンをドラッグして、Set Static Mesh ノードの [Target] ピンに接続します。
ターゲットはノードが動作するエンティティです。 Set Static Mesh アクションは KeyMesh に対して実行する必要があるため、スタティック メッシュ配列がターゲットになります。
Find ノードから、[Key Mesh] ピンをドラッグし、Set Static Mesh ノードの [New Mesh] ピンに接続します。
この関数のグラフは次のようになります。
キーに新しいメッシュ形状を設定したので、次は新しいマテリアルも設定する必要があります。
新しいキー マテリアルの色でキーを設定するロジックを追加するには、次の手順を実行します。
Set Static Mesh ノードの Exec ピンをドラッグして、Set Material ノード ([Rendering (レンダリング)] > [Material (マテリアル)] カテゴリ) を検索して作成します。
その [Target (ターゲット)] ピンを For Each Loop ノードの [Array Element (配列要素)] にドラッグします。
その [Material] ピンを Find ノードの [Key Material] ピンにドラッグします。
メッシュが提供されていない場合にマテリアルが設定されていることを確認するには、ノードの Is Not Valid ピンを Set Material ノードの実行ピンに接続します。 2 つのコネクタを追加してワイヤーの形状を変更します。
ブループリントを保存してコンパイルします。
完全な fnBPLSetKey 関数は次のようになります。
このノード グループをプロジェクトにコピーするには、[Copy Full Snippet (フル スニペットをコピー)] をクリックし、ブループリント内の対応するグラフ内の空白の領域をクリックして、Ctrl + V キーを押します。 続いて、機能 Entry ノードのピンを For Each Loop ノードと Find ノードに接続します。
キーの初期化
これで、キー ブループリント内で作成した機能を使用する準備が整いました。 まず、割り当てた KeyType に基づいてキーを初期化します。
ブループリント レベル オブジェクトを初期化するとは、ビューポートまたはゲームの開始時に、レベル オブジェクトが作成されたときに設定することを指します。
キーを初期化するには、次の手順に従います。
Construction Script ノードの [Exec] ピンをドラッグし、以前作成した fnBPLSetKey 機能を検索します。
この関数ノードにはスタティック メッシュ配列、キー マップ、およびキーが必要で、これらは
BP_Keyで指定します。[My Blueprint (マイ ブループリント)] パネルの [Variables (変数)] セクションの [Setup (設定)] カテゴリを展開し、KeyType 変数をノード グラフの機能ノードの近くにドラッグします。
変数の値取得または設定するかどうかを確認するプロンプトが表示されます。 キーのタイプを確認する必要があるので [Get(取得)] を選択します。
新しい Get Key Type ノードのピンを Fn BPLSet Key ノードの [Key] ピンに接続します。
KeyMap 変数に対しても同じ手順を繰り返します。 それをノードグラフにドラッグし Get ノードを作成します。 このノードのピンを Fn BPLSet Key ノードの [KeyMap] ピンに接続します。
次に、[Components (コンポーネント)] パネルから KeyMesh をグラフにドラッグし、Get ノードを作成します。
Key Mesh ノードには単一のスタティック メッシュ コンポーネント参照が含まれますが、Function ノードには配列が必要です。 Unreal Engine がこの処理に対応し、[Key Mesh] ピンを Fn BPLSet Key ノードの [Static Mesh Array] ピンに接続します。
ブループリントを保存してコンパイルします。
キーのコンストラクション スクリプトは、次のようになります。
このスニペットをプロジェクトにコピーする場合は、FnBPLSetKey ノードを Construction Script ノードに接続する必要があります。
キーの機能のテスト
ここで、キーと新しい関数で作成した色を変更する機能をテストすることができます。
ブループリント エディタ ウィンドウを閉じ、レベル エディタに戻ります。
デフォルトのキー型値は Blue (ブルー) なので、キーは青の矩形として初期化されます。
キー アクタを選択し、[Details (詳細)] パネルの [Setup (設定)] セクションで キー型を Yellow (イエロー) と Red (レッド) の間で変更します。 変更すると、レベル内でキーの色と形状が更新されるのを確認することができます。
プレイヤー キャラクターへのキーの付与
プレイヤーがキーを入手する手段と、他のオブジェクトにプレイヤーが保持しているキーを知るための手段が必要です。 キーの付与と取得を処理するには、ブループリント インターフェースを使用します。
ブループリント インターフェースを使用してブループリント間で通信
ブループリント インターフェースには、インターフェースにアクセスできる各ブループリントで使用できる関数のリストが格納されています。 インターフェースを実装するには、ブループリントに共有の一連のイベント (またはメッセージ) に応答する機能を提供する必要があります。
プレイヤーと NPC キャラクターが歩き回るゲームでは、キーがプレイヤー キャラクターのみとやり取りするようにする方法が必要です。 これを行うには、BP_AdventureCharacter で実装するブループリント インターフェースを作成します。 これは、プレイヤーのブループリントが、ピックアップ キーのメッセージをリッスンするために使用する許可スリップのように機能します。
ブループリント インターフェースは、異なるブループリントが互いの詳細を把握することなく通信する必要がある場合に役立ちます。
2 つの関数を含むブループリント インターフェースを作成するには、次の手順を実行します。
コンテンツ ブラウザに移動し、[Content (コンテンツ)] > [AdventureGame] > [Designer (デザイナー)] > [Blueprints (ブループリント)] > [Core (コア)] に移動します。
[Core (コア)] フォルダを右クリックして [Blueprint (ブループリント)] に移動し、新しいブループリント インターフェースを作成します。 このアセットに
BPI_PlayerKeysと名前を付け、ダブルクリックして開きます。このウィンドウは、ブループリント エディタに似ています。 右側の [My Blueprint (マイ ブループリント)] パネルには、このインターフェースの全ての関数がリストされています。 その下に [Details (詳細)] パネルがあります。
[My Blueprint (マイ ブループリント)] パネルには 作成済みの初期関数があります。 「
fnBPIAddKey」と名付けます。関数を選択し、詳細パネルの [Inputs (入力)] セクションにある [+] ボタンを押して新しい入力を追加します。
入力に「
KeyType」という名前を付けて、その型を列挙型キー型に変更します。[Details (詳細)] パネルの [Category (カテゴリ)] の隣に「
Keys」と入力します。 こうすることで、ブループリントのインターフェース リストで関数を見つけやすくなります。次に、[My Blueprint (マイ ブループリント)] パネルに「fnBPIGetKeys」という名前の新しい関数を追加します。この関数は、キーの取得を処理します。
新しい fnBPIGetKeys 機能を選択し、詳細パネル の [Outputs (出力)] セクションにある [+] ボタンをクリックして、「Held Keys」という名前の新しいパラメータを追加します。
その型を列挙型キー型に変更し、リターン値を [Array (配列)] に変更することで、プレイヤーが見つけたキーを返せるようにします。
インターフェースを保存してコンパイルします。 次に、BPI_PlayerKeys ウィンドウを閉じることができます。
インターフェースはブループリント システムに関連しているため、ブループリントと同様にコンパイルする必要があります。
ブループリント インターフェースでは、関数の宣言のみを作成できました。 インターフェース関数自体にはロジックは含まれませんが、その設定によってブループリントでの使用方法が決まります。
出力のないインターフェース関数 (fnBPIAddKeys) はイベントのように動作し、出力のある関数 (fnBPIGetKeys) はロジックを追加できる通常の関数のように動作します。
新しいプレイヤー キャラクターの作成
キャラクターに追加する前に、プロジェクトに付属するデフォルトのプレイヤー キャラクターを複製し、独自のバリアントを作成します。 また、新しいキャラクターを使用するには、ゲーム モードの設定も変更する必要があります。
プロジェクトで使用するプレイヤー キャラクターを作成するには、次の手順を実行します。
コンテンツ ブラウザに行き、[Content (コンテンツ)] > [AdventureGame] > [Designer (デザイナー)] > [Blueprints (ブループリント)] フォルダに移動します。
「
Characters」という名前の新しいフォルダを作成します。[Content (コンテンツ)] > [Variant_Shooter] > [Blueprints (ブループリント)] > [FirstPerson] フォルダに移動します。
BP_ShooterChracterアセットを作成した [Characters] フォルダにドラッグし、[Copy Here (ここにコピー)] を選択します。[Characters] フォルダで新しいコピーを右クリックし、名前を
BP_AdventureCharacterに変更します。[Edit (編集)] > [Project Settings (プロジェクト設定)] に移動します。 左側のパネルで、[Project (プロジェクト)] > [Maps & Modes (マップ & モード)] 設定に移動します。
DefaultGameMode 設定で SelectedGameMode を展開します。
デフォルトのプレイヤー キャラクターなど、ワールドの一連のルールを定義するゲーム モード アセット。 作成した新しいキャラクターを使用するには、このフォルダを変更する必要があります。 ゲーム モード設定はここで変更することも、アセット自体を開いて変更することもできます。
デフォルトのポーン クラスを「
BP_AdventureCharacter」に変更します。[Project Settings (プロジェクト設定)] ウィンドウを閉じます。
プレイヤーにブループリント インターフェースを追加
このセクションでは、プレイヤー キャラクターのブループリントを変更します。 このキャラクターには、事前に作成した BPI_PlayerKeys インターフェースを追加し、キー型を入手できるようにします。
次に、キー型を使用するように新しい BP_AdventureCharacter を変更します。
キャラクターにブループリント インターフェース関数を追加するには、次の手順に従います。
新しい「Characters」フォルダに移動して
BP_AdventureCharacterを開きます。BPI Player Keys インターフェースを追加して、プレイヤーのブループリントがそれを実装するようにします。 新しいウィンドウの上部にあるツールバーで、[Class Settings (クラス設定)] ボタンをクリックします。
右側の [Details (詳細)] パネルの [Interfaces (インターフェース)] > [Implemented Interfaces (実装されたインターフェース)] セクションで、[Add (追加)] をクリックし、ドロップダウンから
BPI_PlayerKeysを選択します。 これにより、fnBPIGetKeys 関数と fnBPIAddKey 関数を実装する能力をキャラクターに付与します。インターフェース関数を使用できるようにブループリントをコンパイルします。 [My Blueprint (マイ ブループリント)] パネルの [インターフェース] セクションには、fnBPIAddKey と fnBPIGetKey を含む Keys カテゴリがあります。 グレーではなく黄色のアイコンで、これらの関数がイベントのように動作することを意味するものです。
ピックアップ キーの格納
プレイヤーが収集したキーを格納する必要があるため、そのための新しい変数を作成します。 変数は最大 3 つのキーを保持する必要があるため、配列にする必要があります。
プレイヤーのキーを格納する配列変数を作成するには、以下の手順に従います。
BP_AdventureCharacterブループリントで、[My Blueprint (マイ ブループリント)] パネルの変数リストに新しい変数を追加します。変数を「
Held Keys」という名前にします。変数を選択し、[Details (詳細)] パネルでコンテナ を配列型キー型の配列に設定します。 配列を使用することは、プレイヤーが同時に複数のキーを保持できるためです。
プレイヤーがキーを回収したときに保持キー配列にキーを追加するには、次の手順に従います。
キャラクターの [Event Graph (イベント グラフ)] タブに移動します。
グラフを右クリックして、イベント fnBPIAddKey を検索します。 これは、fnBPIAddKey 関数が呼び出されたときに実行されるイベント ノードです。
実行ピンをドラッグして [
Array Add (配列追加)] を検索し、Add ノードを選択します。 このノードは新しい要素を取得すると 配列に追加しますHeld Keys 変数への参照を追加します。これには、変数をイベント グラフにドラッグし、[Get (取得)] を選択します。
Held Keys ノードを Array Add ノードの Target Array 入力に接続します。 このピンは四角形に見えます。
イベント ノードの [Key Type] ピンを Add ノードの New Item 入力に接続します。
次に、このイベント関数がトリガーされると、プレイヤー キャラクターは提供されたキー型を保持キー配列に追加します。
プレイヤーのキーのリストの取得
このチュートリアルの次のパートで使用するドアは、プレイヤーの全てのキーをチェックする必要があるため、プレイヤーが手に入れたキーの配列を返す機能を追加します。
キーの取得を処理するには、次の手順を実行します。
BP_AdventureCharacterブループリントで、[My Blueprint (マイ ブループリント)] > [Interface (インターフェース)] の下にあるキーセクション を展開します。リスト内の fnBPIGetKeys はグレーのアイコンで表示されています。これは、イベントだけでなく、通常の関数として使用できることを意味します。
fnBPIGetKeys をダブルクリックして、関数のグラフを開きます。
Held Keys 変数への参照を追加するにはドラッグして [Get (取得)] を選択します。
Get Held Keys ノードを Return ノードの [Held Keys] ピンに接続します。
fnBPIGetKeys グラフは次のようになります。
プレイヤーとのコリジョンをキーで検出
次に、プレイヤーがキーを入手したときに fnBPIGetKeys イベント関数をトリガーする機能を追加します。 これは、プレイヤーがキーのコリジョン ボリュームに触れたときに発生します。
カプセル コリジョン コンポーネントに属するイベントを追加します。 ゲームプレイ中に問題が起きたときにイベントがトリガーされます。 その場合、プレイヤー アクタがキーのカプセルにオーバーラップすると、キーがいくつかのアクションを実行する必要があります。
オーバーラップ イベントを追加して、オーバーラップしているアクタがプレイヤーであるかどうかをチェックするには、次の手順を実行します。
BP_Keyブループリントを開き、イベント グラフの空白の領域に移動します。[Components (コンポーネント)] パネルで Capsule コンポーネントを右クリックし、[Add Event (イベントの追加)] > [Add OnComponentBeginOverlap (OnComponentBeginOverlap を追加)] を選択します。 関連付けられているノードがイベント グラフに表示されます。 このイベント ノードは、このアクタと別のアクタの間にオーバーラップが発生するとトリガーします。
イベントノードは、そのイベントに関する情報を備えています。 たとえば、イベントをトリガーした、オーバーラップしているアクタは、Other Actor ピンに渡されます。
OtherActor 変数を変数リストからグラフにドラッグして、[Set (設定)] を選択します。 Set ノードは新しい値をその変数に保存します。
イベント OnComponentBeginOverlap ノードの 実行 ピンをドラッグし、Set Other Actor ノードの Exec 入力に接続します。
イベント OnComponentBeginOverlap ノードの Other Actor ピンをドラッグし、Set Other Actor ノードの Other Actor 入力に接続します。
キーを使って何かを行う前に、オーバーラップしているアクタがプレイヤーかどうかを確認します。これは、キーを収集できる唯一のキャラクターがプレイヤーであるためです。 ブループリント インターフェースを備えている場合は、プレイヤーであることがわかります。
Set ノードの近くを右クリックして、Does Object Implement Interface ノードを追加します。
Does Object Implement Interface ノードで、Interface ピンを BPI_PlayerKeys に変更します。
Test Object の入力ピンを Set Other Actor ノードの青色のピンに接続します。 このピンは Get Other Actor ノードと同じように機能します。
Does Object Implement Interface ノードで、[Return Value] ピンをドラッグし、Branch ノードを追加します。
Branch ノードの実行入力ピンを Set ノードに接続します。
Branch ノードは、条件が true か false かをチェックするため、それぞれの結果に対して異なるアクションを実行できます。 ここでは、オーバーラップしているアクタがプレイヤーであるかどうかに基づいて、true と false の 2 つのシナリオのロジックを作成します。
プレイヤーがキーを押したときにキー追加関数を呼び出すには、次の手順を実行します。
Branch の結果が true の場合、アクタはキーを取得できるため、インターフェースのイベント関数をトリガーします。 Branch ノードの [True] ピンからドラッグし、Fn BPIAdd Key (Message) ノードを追加します。
通常の機能ノードではなく message ノードを追加します。これは、ブループリント インターフェース機能を呼び出すと、message を送信することになるためです。 ターゲット ブループリントは、そのインターフェースを実装している場合にのみ応答します。
Fn BPIAdd Key ノードの [Target] ピンをドラッグして、Get Other Actor ノードを追加します。
[Key Type] ピンをドラッグして、Get Key Type ノードを追加します。 これは、変数の参照を追加するもう 1 つの方法です。
キーが回収されると、再び回収できないように少しディレイして消えます。 これを処理するには、Fn BPIAdd Key ノードの [Exec] ピンをドラッグして、Delay ノードを追加します。 デフォルトの持続時間を
0.2のままにします。タイマーが切れるとキーが消えるので、Destroy Actor ノードを Delay ノードの [Completed] ピンに接続します。 Target が Self に設定されていることを確認します。つまり、キー アクタはレベルから自身を削除します。
ブループリントを保存してコンパイルします。
Branch ノードの False の結果には何も追加していないことがわかります。 これは、オーバーラップしているアクタがキーのインターフェースを持たない場合、キーを取得できないため、何も実行しません。
キーの完全なイベント グラフは、次のようになります。
これは、このページの冒頭にお見せしたアセット図ですが、今回は作成した全てのアセットと関数の概要と、それらを組み合わせてキーのアピアランスと動作を作成する方法を示しています。
最終キーのテスト
レベルに戻り、各色のキーを追加します。 キーの上を歩いて、ゲーム内でキーの入手を試みることができるようになりました。
コンテンツ ブラウザからフロアにキーをドラッグした後、フロアにキーを配置するには、[End (終了)] を押します。 これにより、選択したレベル オブジェクトが床にスナップされます。
次の内容
次のセクションでは、ドアのブループリントを変更し、キーと同じように色を変えられるようにし、プレイヤーが対応するキーを拾わない限りドアが閉まらないようにします。