このチュートリアル シリーズでは、level designとゲーム メカニクスを使用して、プレイヤーのためのゲームプレイを設計しました。 作成したパズル、鍵、ドアはすべてゲームプレイ ループの一部です。
ゲームプレイ ループとは、プレイヤーが繰り返す一連のアクションで、ゲームプレイの核となるものです。
ビルドしたレベルのループを閉じる必要があります。 このチュートリアルでは、プレイヤーが現在のレベルを完了したことを伝える勝利画面をビルドします。 また、勝利条件を検証し、プレイヤーを次のレベルに進めるレベル遷移ポイントもビルドします。
レベルを完了したら、このトラックで学習した内容を発展させる方法を探ることができます。
勝利条件は、ゲームプレイ タスク、クエスト、レベル、またはゲームを完了するためにプレイヤーが達成する必要がある目標です。 ゲームループには、勝利条件を達成するための手段が用意されている必要があります。 ノンリニア ゲームでは、複数の勝利条件が設定されることがあります。
開始する前に
このチュートリアルでは、「Design a Puzzle Adventure」の以前のセクションで扱われている次のトピックについてすでに理解していると想定しています。
ウィジェット ブループリント
ブループリント
変数
コリジョンボリューム
プレイ インエディタ モード
親アセットと子アセット
Traps and Damage では、次のアセットが必要になります。
WBP_EliminatedScreenウィジェット ブループリントBP_Keyブループリント クラスEnum_KeyType列挙型
レベルエンドを構築する
レベルのコアとなるゲームプレイの構築が完了した場合でも、遷移ポイントはプレイヤーにレベルを完了させるための興味深い方法を提供する良い機会となります。 この場合は、ジャンプ パッドをビルドして、高いプラットフォームにプレイヤーを乗せます。 後で、レベルの遷移ポイントをプラットフォームに配置します。
プラットフォームをビルドする
ルームの 1 つに高架式プラットフォームを構築するには、LevelPrototyping > MeshesフォルダにあるSM_Cube とSM_Cylinder のスタティック メッシュを使用します。
このチュートリアルのサンプル レベルでは、次のような 4 本の柱を持つ 3.5 平方メートルのプラットフォームを使用しています。
これらのブロックアウトのピースをレベルにコピーしたい場合は、以下のスニペットをコピーします。 サンプル レベルに沿って作業している場合は、これらの形状がルーム 3 の後方の隅付近に表示されます。 必要に応じて移動できます。
プラットフォームをコピーするには、以下の手順を実行します。
[Copy Full Snippet (フルスニペットをコピー)]をクリックします。
Command LineBegin Map Begin Level Begin Actor Class=/Script/Engine.StaticMeshActor Name=StaticMeshActor_785 Archetype="/Script/Engine.StaticMeshActor'/Script/Engine.Default__StaticMeshActor'" ExportPath="/Script/Engine.StaticMeshActor'/Game/AdventureGame/Designer/Lvl_Adventure.Lvl_Adventure:PersistentLevel.StaticMeshActor_785'" 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.StaticMeshActor_785.StaticMeshComponent0'" End Object Begin Object Name="StaticMeshComponent0" ExportPath="/Script/Engine.StaticMeshComponent'/Game/AdventureGame/Designer/Lvl_Adventure.Lvl_Adventure:PersistentLevel.StaticMeshActor_785.StaticMeshComponent0'" StaticMesh="/Script/Engine.StaticMesh'/Game/LevelPrototyping/Meshes/SM_Cylinder.SM_Cylinder'" StaticMeshImportVersion=1 bUseDefaultCollision=False StaticMeshDerivedDataKey="STATICMESH_FD1BFC73B5510AD60DFC65F62C1E933E_228332BAE0224DD294E232B87D83948FQuadricMeshReduction_V2$2e1_6D3AF6A2$2d5FD0$2d469B$2dB0D8$2dB6D9979EE5D2_CONSTRAINED0_100100000000000000000000000100000000000080FFFFFFFFFFFFFFFFFFFFFFFF000000000000803F00000000000000803F0000803F00000000000000003D19FC1626C9B2485E57DB4B8EC731318B8215AE8D46FAD400000000010000000100000000000000010000000100000000000000000000000100000001000000400000000000000001000000000000000000F03F000000000000F03F000000000000F03F0000803F00000000050000004E6F6E65000C00000030000000803FFFFFFFFF0000803FFFFFFFFF0000000000000041000000000000A0420303030000000000000000_RT00_0"Unreal エディタ で、[ビューポート] または Outliner がアクティブなパネルであることを確認してから、Ctrl + V キーを押します。
次に、プレイヤーをプラットフォームの上に乗せるジャンプ パッドを追加します。
ジャンプパッドを使う
ジャンプ パッドを一からビルドすることはできますが、時間とコストがかかります。 時間の制約が多い開発環境では、自分でアセットを作成するのではなく、事前作成 (プレハブ) アセットをインポートする方が便利です。 ゲームのビジュアル スタイルに沿ったプレハブを選択することで、目立つことなく開発をスピードアップすることができます。
このチュートリアルでは、「First Person (ファースト パーソン)」テンプレートに付属するアセットである BP_JumpPad を使用します。
BP_JumpPad を統合するには、次の手順を実行します。
コンテンツ ブラウザで、 「LevelPrototyping」>「Interactable」>「JumpPad」に移動します。
BP_JumpPadのインスタンスをレベル内、プラットフォームの前にドラッグします。このチュートリアルで示されている位置と完全に一致させる場合は、BP_JumpPadの 位置を「1790」、「-1460」、「10」に設定します。
設定したレベルは次のようになります。
作業をテストする時間です。 まずいずれかのBP_EnemyのMax Speedが0であることを確認します。 これにより、テスト中に動く敵が処理されないことが保証されます。
ビューポートを右クリックし、Play From Here (ここからプレイ開始) を選択して、現在の位置からレベルをプレイテストします。 ジャンプ パッドに足を踏み入れ、プラットフォームにたどり着くようにします。
ジャンプ パッドのブーストを使っても、プレイヤー キャラクターはプラットフォームに到達できないことに注目してください。 ジャンプ パッドの速度パラメータを調整することで、これを解決できます。
ブループリントで作成した多くの編集可能な変数と同様に、Velocity パラメータはジャンプ パッド アセット用の事前作成済みのインスタンス編集可能な変数です。
速度を調整するには、次の手順を実行します。
ビューポートで
BP_JumpPadを選択します。[Details (詳細)] パネルで [Velocity (速度) (Z)」 を
「1000」に設定します。
レベルをもう一度テストします。 これでプラットフォームに飛び乗ることができるはずです。
次は、プレイヤーがレベルを完了したときに表示される勝利画面を作成します。
勝利画面を作成する
ウィジェット ブループリントを使用して勝利画面を作成します。これは、 Traps and Damage で作成した WBP_EliminatedScreenゲームオーバー画面と似ています。 これら 2 つの画面は非常によく似ているため、開始点として WBP_EliminatedScreen を使用します。
ゲームオーバー画面を複製して勝利画面を作成するには、次の手順を実行します。
コンテンツ ブラウザで、「AdventureGame」>「Designer」>「Blueprints」> 「ウィジェット」に移動します。
WBP_EliminatedScreenを右クリックして[Duplicate (複製)]をクリックします。新しいウィジェット ブループリントに
WBP_WinScreenと名前を付け、ダブルクリックしてウィジェット エディタで開きます。 「ウィジェット」フォルダは次のようになります。メッセージを変更するには、[Hierarchy (階層)] で [Text (テキスト)] ウィジェットをクリックします。
[Details (詳細)] パネルの[Content (コンテンツ)]見出しの[Text (テキスト)]のフィールド内に
Level Complete!「Level Complete!」 …Loading the Next Leve と入力します。[Appearance] 見出しの [Color] と [Opacity] の横にある色見本をクリックして、カラー ピッカーを開きます。 好きな色を選択するか、Hex sRGB の値を
FFE000FFに設定して作業を進めます。勝利画面のテキストは短いため、サイズを大きくして画面をより適切に表示できます。 Font (フォント) 見出しの下にある Size (サイズ) を
72または自分が最も読みやすいと感じるサイズに変更します。保存、コンパイルし、ウィジェット エディタを閉じます。
次に、レベルの遷移ポイントを作成します。
レベルの遷移を作成する
レベル トランジションによって次のレベルがロードされます。 レベルの遷移は、プレイヤーがカットシーンを終了したときや、ピックアップを収集したとき、またはレベルの最後に到達したときなどさまざまな方法でトリガーすることができます。
このチュートリアルでは、レベルの遷移は、以下の2つのことが発生した際にブループリントがトリガーします。
プレイヤーがレベルの遷移にオーバーラップする。
勝利条件が満たされている。
新しいブループリントを作成するには、次の手順を実行します。
コンテンツ ブラウザで、「AdventureGame」>「Designer」>「Blueprints」に移動します。
右クリックして[New Folder (新規フォルダ)]を選択します。 このフォルダに
LevelTransitionという名前を付けます。「[Level Transition (レベル遷移)]」フォルダ内で右クリックして [Blueprint Class (ブループリント クラス)] を選択し、新しいブループリントを作成します。
親クラスとして[Actor (アクタ)]を選択します。
この新しいブループリントに
BP_LevelTransitionと名前を付け、ダブルクリックしてブループリント エディタで開きます。
「Level Transition (レベル遷移)」フォルダは次のようになります。
これまでに作成した他のブループリントと同様に、レベルの遷移には次のものが必要です。
ランタイム時にプレイヤーに見えるスタティックメッシュです。
プレイヤーが衝突したときを検出するためのコリジョン形状。
インタラクションを駆動するロジック。
まずメッシュとボックス コリジョンをビルドし、それからロジックに移ります。
スタティック メッシュとコリジョン形状を作成するには、次の手順を実行します。
BP_LevelTransitionの コンポーネント タブで、Add ボタンをクリックし、「cube」を検索して新しいスタティックメッシュを作成します。このスタティックメッシュに
TransitionPointという名前を付けます。[TransitionPoint] を選択した状態で、[Details (詳細)] パネルで [Scale] を
「3.0」、「3.0」、、、「0.1」に設定します。 このサンプル レベルの最終プラットフォームに合わせたサイズになっています。レベルで最適なサイズにサイズを変更できます。[Component s (コンポーネント)]タブに戻り DefaultSceneRootを選択します。 [Add (追加)] ボタンをクリックし、
box collisionを検索して、コリジョン形状を作成します。ボックスコリジョンを
LevelTriggerという名前にします。LevelTrigger を選択した状態で、[Details (詳細)] パネルで [Scale (スケール)] を「
4.0」、「4.0」、「2.0」に設定します。 Z位置を「55.0」に設定します.ボックス コリジョンが正しい形状として表示されない場合は、それが TransitionPoint の子でないことを確認してください。
保存してコンパイルします。
ロジックによるビルド
BP_LevelTransition は、次の5つのことを順に行います。
オーバーラップを確認。
勝利条件を検証。
プレイヤー入力を無効する。
勝利画面を表示する。
次のレベルをロードする。
ステップごとに これらのインタラクションを実行するロジックを作成していきましょう。
オーバーラップを確認
オーバーラップをチェックするロジックをビルドするには、次の手順に従います。
BP_LevelTransitionの [MyBlueprint] タブの [Variables] セクションで、[+]ボタンをクリックして新しい変数を作成し、「OtherActor」という名前を付けます。ピンの種類を Actor (オブジェクト参照) に設定します。
EventGraphで 既存の3つのイベントノードを削除します。 それらは不要です。
[Components (コンポーネント)] タブで、[LevelTrigger]を右クリックし、 [Add Event (イベントを追加)] > [Add OnComponentBeginOverlap (OnComponentBeginOverlap を追加)] をクリックします。 この関数は、オブジェクトがコリジョン形状とオーバーラップするタイミングをチェックします。
Execピンからドラッグして Set Other Actorを作成します。
両方のOther Actorピンを接続します。
次に、勝利条件を検証するロジックをビルドします。
勝利条件を検証する
このチュートリアルでは、3 つのキーをすべて収集することが勝利条件となります。 この特定の条件を選択する理由は、ゲームを壊すプレイヤーの行動を予測し、回避するためです。
たとえば、勝利条件が「プレイヤーがレベル トランジションにオーバーラップすること」であった場合、プレイヤーが部屋の壁を越える方法を見つけた場合、プレイヤーはレベル全体をバイパスすることができます。 鍵を勝利条件として使用することで、プレイヤーは壁やドアを通り抜ける方法を見つけた場合でも、ゲーム ループを完了しなければなりません。
すべてのバグを予測することは不可能ですが、先を見越した設計にすることで、プレイヤーがゲームを壊してしまうことを防ぐことができます。
キー データを格納する配列を作成するには、次の手順を実行します。
BP_LevelTransitionのMyBlueprint タブで、 + ボタンをクリックして新しい変数を作成し、HeldKeysと名前を付けます。ピンの型をEnum Key Typeに設定し コンテナの型をArrayに設定します。
Set ノードの Exec ピンからドラッグして、fnBPIGetKeys を作成します。
TargetピンからドラッグしてGet Other Actorを作成します。
fnBPIGetKeys の Exec ピンからドラッグして Set Held Keys を作成します。
両方の Hold Keys 配列ピンを接続します。
勝利条件を設定するために列挙型キーを作成するには、以下の手順に従います。
新しい変数を作成し、
RequiredKeysという名前を付けます。 これが勝利条件です。ピンのタイプが Enum Key Type であり、コンテナのタイプが Array であることを確認します。
Details (詳細) パネルで Instance Editable (インスタンス編集可能) を有効にし、Category (カテゴリ) を
Setup (設定)に設定します。ブループリントをコンパイルして、デフォルト値を利用できるようにします。 + ボタンをクリックして、3 つの新しい要素を配列に追加します。
インデックス のドロップダウン メニューをクリックして、 インデックス を Yellow (黄)、、Blue (青)、、Red (赤) に設定します。
条件が満たされているかどうかを検証するブーリアンを作成します。 with Break を含む For Each Loop は、HeldKeys 配列を切り替えてそれぞれのキーを確認し、キーが欠落している場合はブレークします。
不足しているキーをチェックするロジックをビルドするには、以下のステップに従います。
新しい変数を作成し、
FoundAllKeysという名前を付けます。[Pin (ピン)]のタイプをBooleanに [Container (コンテナ)]のタイプをSingleに設定します。
SetHeldKeys,のExecピンからドラッグしてFor Each Loop with Breakを作成します。
For Each Loop の Array ピンからドラッグして、Get Required Keys ノードを作成します。
Loop BodyピンからドラッグしてBranchを作成します。
Condition ピンからドラッグし、Contains Item (Array) ノードを作成します。
Contains ノードの Target Array ピンからドラッグして Get Held Keys を作成します。
Condition ノードの Item to Find ピンを loop ノードの Array Element ピンに接続します。
Branch ノードの True ピンからドラッグして Set Found All Keys を作成します。 FoundAllKeys の横のチェックボックスをクリックして、true に設定します。
Branch ノードのFalse ピンからドラッグして Set Found All Keys を作成します。 チェックボックスは空のままにして、Execピンを For Each LoopのBreakピンに接続します。
先ほど確認したシーケンスでは、プレイヤーがすべてのキーを持っている場合に限り、さらに 3 つのステップがあります。
プレイヤー入力を無効する。
勝利画面を表示する。
次のレベルをロードする。
FoundAllKeys の結果を使用してロジックのシーケンスを開始するには、以下の手順に従います。
For Each Loop の Completed ピンからドラッグして Branch を作成します。
ConditionピンからドラッグしてGet FoundAllKeysを作成します。
Branch ノードのTrueピンからドラッグして、 Sequence ノードを作成します。
このシーケンスでは 3 つのアクションをビルドする必要があるため、Add Pin (ピンの追加) ボタンをクリックします。
シーケンスの次のステップに進みましょう。プレイヤー入力を無効にしています。
プレイヤー入力を無効にする
勝利画面を表示している間、プレイヤーの入力を無効にすると、プレイヤーが動き回ったり、意図しないダメージを受けたりするのを防ぎます。
プレイヤー入力を無効にするには、次の手順を実行します。
シーケンスのThen 0ピンからドラッグして、Disable Inputノードを作成します。
Disable InputノードのTargetピンからワイヤーを引き出して Get Other Actorを作成します。
Player Controller ピンからドラッグして、Get Player Controller ノードを作成します。
次に、勝利画面を表示するためのロジックをビルドします。
勝利画面を表示する
WBP_Winscreen ウィジェットを表示するには、次の手順を実行します。
Sequence ノードの Then 1 ピンからドラッグして、Create Widget ノードを作成します。
ClassをWBP_WinScreenに設定します。
Create Widget ノードの Exec ノードからドラッグして Add to Viewport ノードを作成します。
Create Widget の Return Value ピンを Add to Viewport の Target ノードに接続します。
このロジックに問題はありませんか? 現時点では、問題を修正せずに最終手順のビルドに進みます。 その後、レベルをプレイテストして問題を検出し、解決策をビルドします。
次のレベルをロードする
このチュートリアルでは、現在のレベルを次のレベルのプレースホルダーとして使用します。 独自のゲームをデザインしている場合、遷移ポイントはプレイヤーをまったく新しいレベルに進めるようにする必要があります。
現在のレベルをロードするロジックをビルドするには、次のステップに従います。
Sequence ノードの Then 2 ピンからドラッグして、Open Level (by Object Reference) ノードを作成します。
Open LevelのLevelピンからドラッグしてPromote to Variableを検索します。 これによって World 型の変数が強制的に作成されます。
この変数は [MyBlueprints (マイブループリント)] タブから作成することもできますが、World ピン型を見つけるのが難しい場合があります。
World 変数を選択した状態で、[Detail (詳細)]パネルで変数の名前を
NextLevelに変更します。これを Setup (設定) カテゴリに追加して Instance Editable (インスタンス編集可能) を有効にします。
ブループリントをコンパイルして変数のデフォルト値を使用できるようにし、ロードするレベルに設定します。 このチュートリアルに従う場合は、
Lvl_Adventureに設定すると現在のレベルをループします。保存してコンパイルします。
作業をテストする時間です。 高くなったプラットフォームの上に BP_LevelTransition のインスタンスをドラッグします。そして、キーに簡単にアクセスできるようにして、勝利条件を満たします。 これを行うには、Create a Key で作成した黄色、青、赤の各キーのインスタンスを同じルームに配置します。
レベルはこのようになります。
ビューポートを右クリックし、Play From Here (ここからプレイ開始) を選択して、現在の位置からレベルをプレイテストします。 プラットフォームにジャンプしてレベル トランジションを有効にすると、画面がフリーズし、プレイヤーに勝利画面のメッセージを読む時間が与えられずに次のレベルが開くことがわかります。
この問題は次のセクションで解決します。
ディレイを作成する
このチュートリアルでは、Open Level (レベルを開く) を使用して現在のレベルを閉じ、新しいゲーム インスタンスとして次のレベルを開きます。 ロード中、Open レベル はゲームをフリーズします。 プレイヤーのシステムによって、このフリーズは短すぎたり (勝利画面が表示されない場合) 、長すぎたり (ゲームがクラッシュしたように表示される) ことがあります。
レベル ストリーミングを利用するゲームも含め、多くのゲームではロード画面を利用して、ゲームが適切に機能していることと、待機する必要があることをプレイヤーに知らせます。 画面のロードで別の問題も解決します。長時間、頻繁、退屈な待機時間は、没入感を壊し、不満の原因になります。 多くの場合、ロード画面にはヒント、アニメーション、オーディオが含まれ、プレイヤーがプレイしていない間の注意力を維持するために使用されます。
この技術的な問題を設計上解決するために、以下を実現する意図的なディレイを作成します。
すべてのプレイヤーのロード時間を均一化します。
プレイヤーが勝利画面を読むのに十分な時間を確保します。
プレイヤーが見えるものを用意することで、ロード時間を短縮できます。
遅延を挿入するには、次の手順を実行します。
BP_LevelTransitionを開きます。 [MyBlueprint (マイ ブループリント)] タブで、+ をクリックして新しい変数を追加し、LevelLoadDelayと名前を付けます。ピンの種類をFloatに設定します。
Details (詳細) パネルで Instance Editable (インスタンス編集可能) を有効にし、Category (カテゴリ) を Setup (設定) に設定します。
ブループリントをコンパイルして、デフォルト値を利用できるようにします。 Level Load Delay では、ディレイの持続時間を設定します。 そのまま進めるには
5.0秒に設定します。EventGraphで、 Sequence ノードに移動します。 遅延を挿入するには、Then 2 ピンからドラッグして Delay ノードを作成します。
DurationピンからドラッグしてGet LevelLoadDelayを作成します。
ブループリントを保存してコンパイルし、閉じます。
最終的な BP_LevelTransition の EventGraph は次のようになります。
レベルをもう一度テストします。 レベルの遷移ポイントに重なると、勝利画面が表示され、背景がぼやけて、プレイヤー入力が 5 秒間無効になり、プレイヤー キャラクターが次のレベルに表示されます。
レベルを最終的にプレイテストする前に、ルーム 3 のキーを削除し、BP_Enemy の 最大速度 を 200 に設定し直すことを忘れないでください。
コンセプトから制作
[Project Setup] と [Level Blockout] で作成したブロックアウトを最終レベルと比較してみましょう。 初期の設計から、レベル デザインとゲームプレイ ループは、バグへの対応や新機能の作成、開発中にプレイテスターが発見した制限事項の回避に対応するように変更されました。
レベルをブロックし、モジュール的に作業し、設計に関する技術的な問題を解決し、アセットを整理しておくことで、制限や新しい機能がゲームの開発進行を変更したときも柔軟に対応することができます。
このトラックを完了すると、コンセプトからプレイ可能なデモにレベルが向上します。 これで、1 つ以上のレベルを設計するための構成要素が揃いました。 スイッチ、トラップ、鍵、ドア、敵を無限に組み合わせて、独自のスタイルで新しいゲームプレイ ループをデザインできます。 互いに接続することで、それぞれのレベルがはるかに大きなプロジェクトの一部となります。考えられます。
サンプル プロジェクト
以下は、このチュートリアル シリーズのドキュメントを使用してビルドできる最終プロジェクトをダウンロードするリンクです。 このサンプル プロジェクトを使用すると、最終的なプロジェクトの外観を確認したり、プロジェクトのビルドと設計方法を確認するための参考として使用したりできます。
(ダウンロード サイズ:75 MB)
プロジェクトを開くには、ファイルを解凍し、adventuredesigner フォルダーを Unreal Projects ディレクトリに移動してください (デフォルトでは、C:\Users\UserName\Documents\Unreal Projects にあります)。
次の内容
マテリアル、ライティング、ポストプロセス エフェクト、サウンド、ビジュアル エフェクトを追加してレベルの作業を続けるには、アーティスト トラック チュートリアル シリーズ」をお試しください。
別のブループリントのビルドについても実際に学習したい場合は、デザイナー トラック チュートリアル シリーズのボーナス モジュールに進んでください。
プロジェクトをテストおよび共有用のスタンドアローン プログラムとしてパッケージ化することに関心がある場合は、次のドキュメントを参照してください。