このチュートリアルでは、2 つの共通ゲームプレイ オブジェクトを構築して、プラットフォームを作成します。
プレッシャープレートのスイッチ。
プレイヤーに反応する物理キューブ。
レベル デザインと、時間、物理、ダメージなどのゲーム メカニクスを使用して、パズルの難易度を調整し、プレイヤーのアクションの結果を生み出します。
開始する前に
このチュートリアルでは、パズル アドベンチャーの設計の前のセクションで扱った次のトピックについてすでに理解していることが前提となります。
マテリアル
ブループリント
変数
ブループリント インターフェース
プレイ インエディタ モード
キーの作成 で以下のアセットを作成する必要があります。
M_BasicColor_Blue
ゲームプレイ デザインのアプローチ
ジャンルに関係なく、圧倒的なゲームプレイはプレイヤーに何かを感じさせます。プレイヤー同士の対戦の興奮や農業シミュレーターの快適さなどです。 こうした感情的な反応がプレイヤーのエンゲージメントにつながります。 ゲームに魅力がないと、プレイヤーがプレイを継続する可能性が低くなり、プロジェクトの成功に影響する可能性があります。
ゲーム デザイナーの仕事は、レベル デザインやゲームの仕組みを通じてゲームプレイを設計することです。 レベルは直感的に設計することができますが、このチュートリアルでは、数式を使用してプロセスを視覚化します。
レベル デザイン
レベル デザインでは、タスクの難易度を増減できます。 たとえば、プラットフォーマーでは、プラットフォームに飛び乗ることがタスクになります。 キャラクターのジャンプ距離の上限にプラットフォームを配置すると、プラットフォームに到達してタスクを完了するのがさらに難しくなります。
しかし、失敗しても重大ではないタスクであれば、高難易度のタスクであっても、プレイヤーは安心して作業を行うことができるでしょう。
安心感は、プレイヤーが結果なしでコントロールを学習できる、ゲームプレイのチュートリアル セクションで役立ちます。
ただし、常に定数の安心感がゲームに適さない場合もあります。 たとえば、緊張感がなければボスとの戦闘は退屈で、プレイヤーがいないことにつながります。
プレイヤーに緊張感を持たせるために、ゲーム メカニクスのダメージによって重大な結果をもたらすことができます。
ゲームの仕組み
ダメージは、プレイヤーが何か重要なものを失う可能性を数値で表します。具体的には、
装備
パワーアップ
レベルの進行状況
プレイ可能なキャラクターまたはプレイ不可能なコンパニオン
タスクの難易度と結果の重大さを組み合わせると、プレイヤーが感じる緊張の度合いに影響を与える可能性があります。
結果や見返りの少ない不必要な難しいタスクは、プレイヤーのストレスを引き起こす可能性があります。
タスクを行っているときの緊張感の度合いは、勝利条件を満たしたときにプレイヤーが感じる満足感のレベルに影響を及ぼすことがあります。 満足感を得られると、特にやりがいがある場合は、プレイを継続するモチベーションが生まれます。
勝利条件は、タスクを正常に完了するためにプレイヤーが満足する必要がある条件です。
スイッチを作成する
スイッチは、何かがスイッチするとエフェクトを生み出すゲームプレイ オブジェクトです。
スイッチの作成方法を習得することで、ボタンを押してドアを開けるなどのゲームプレイ機能を設計できるようになります。 この場合、スイッチを使用してインゲーム アクタとのコリジョンの色を変更します。
ロジックによるビルド
このスイッチは、オブジェクトかプレイヤーが重なると起動します。 構築を開始する前に、質問に答えることで、このインタラクションを実現するロジックのドラフトを作成しましょう。どのような場合に、誰に、いつ、どのようなアクションを実行する必要があるのか、
以下は、このスイッチのロジックの詳細です。
ランタイム時には、このスイッチはオフになっています。
プレイヤーがスイッチを踏むと、スイッチがオンになります。
プレイヤーがスイッチから降りるとスイッチはオフになります。
スイッチには 2 つの状態 (オン と オフ) があるため、マテリアルを使用してランタイム時に各状態を視覚化できます。 テスト時には、ロジックが正しく機能しているかを簡単に確認できます。
マテリアルの作成
スイッチのオフ ステートでは M_BasicColor_Blue を使用し、オン ステートでは エミッシブ マテリアルを作成します。
エミッシブ マテリアルは光を放出します。
エミッシブ マテリアルを作成するには、次の手順を実行します。
コンテンツ ブラウザ で、[AdventureGame] > [Designer] > [Materials (マテリアル)] で右クリックして、[Material (マテリアル)] を選択します。
新しいマテリアルに
M_EmissiveColorと名前を付け、ダブルクリックしてマテリアル エディタを開きます。マテリアル グラフで右クリックして「Vector Parameter」を検索します。 クリックしてグラフに取り込み、
「Color」と名付けます。 これはマテリアルのライトの色を制御します。Color ノードで色見本をダブルクリックして カラー ピッカー を開きます。
独自の色を選択するか、[Hex sRGB
27F774FF] に設定して作業を進めます。右クリックして、さらに Constant と Multiply の 2 つのノードを検索します。
Color ノードを Multiply ノードの A ピンに接続します。 次に、Constantを Multiply ノードの B ピンに接続します。 最後に、Multiply ノードを M_EmissiveColor ノードの Emissive Color ピンに接続します。
定数の 値 はマテリアルのエミッシブ強度、つまり輝度を制御します。 希望に応じて調整するか、
25に設定すると、処理が進みます。マテリアルを保存して閉じます。
マテリアル フォルダは次のようになります。
このチュートリアルでは M_EmissiveColor が唯一のエミッシブ マテリアルであるため、インスタンスを作成する必要はありません。 ただし、マテリアル インスタンスは、プロジェクトのモジュール性を維持し、開発環境で効率的に作業するための優れた方法です。
次に、スイッチをビルドします。
ブループリント クラスを設定する
このスイッチは、スタティック メッシュとボックス コリジョンで構成されるブループリントになります。 ボックス コリジョンはプレイヤーとの接触を検出し、スイッチのオン/オフの状態をトリガーします。
コリジョンとは、実行時に 2 つのオブジェクトが接触することを検出することを指します。 ボックス コリジョンは、球体やカプセル コリジョンとともに、これらの検出に使用するボリュームです。 たとえばヒットボックスは、アタックが成功したことを検出するためにコリジョン形状を使用する例です。
開始するには、以下の手順に従います。
コンテンツ ブラウザの AdventureGame > Designer > Blueprints フォルダで、
「Activation」という名前の新しいフォルダを作成します。アクティベーション内で右クリックして 新しいブループリントクラスを作成します。
Pick Parent Class (親クラスを選択) ダイアログで Actor (アクタ) を選択します
新しいブループリントに
BP_Switchと名付け、ダブルクリックしてブループリント エディタでBP_Switchを開きます。[Components (コンポーネント)] タブで、[Add (追加)] をクリックしてスタティックメッシュを作成し、
「cube」を検索して選択します。キューブに
Switchという名前を付けます。[Details (詳細)] パネルの[Transform (トランスフォーム)] で、スイッチのスケールを
2.0、2.0、0.1に調整します。[Components (コンポーネント)] タブで、[Add (追加)] をクリックし、「
box collision」を検索してボックス コリジョンを作成します。「
Trigger」と名付けます。[Details (詳細)] パネルの [Location (場所)] でボックス コリジョンの Z の値を
200に調整します。[Scale (スケール)] でスケールを
1.5、1.5、5.0に調整します。 このボックス コリジョンは、コリジョンを簡単にキャプチャできるように、スタティック メッシュよりも厚くなります。このブループリントを保存してコンパイルします。
「Blueprints」フォルダは次のようになります。
コンパイルに失敗した場合に作業内容が失われないように、大きな変更を行った後は、ブループリントを保存してからコンパイルします。
次に、スイッチの動作を制御する変数を作成します。
変数を作成する
変数を使用すると、BP_Switch は作成したばかりのマテリアルを参照することができます。 特定のマテリアルをスイッチにハードコードする代わりに、マテリアルをその場で切り替えることができます。これはこのチュートリアルの後の部分で行います。
ここでは BP_Switch で次の変数を作成します。
変数名 | 型 | デフォルト値 | 説明 |
OnMaterial | マテリアルインターフェース |
| オンのときのスイッチの色。 |
OffMaterial | マテリアルインターフェース |
| オフであるときのスイッチの色。 |
[MyBlueprint] タブの [Variables (変数)] で、[+] ボタンを 2 回クリックして、2 つの新しい変数を作成します。
一方を
OnMaterial、もう一方をOffMaterialという名前にします。ピンの型を Material Interface (Object Reference) に設定します。
[OnMaterial] を選択します。 [Details (詳細)] パネルの Category (カテゴリ) の隣に
[Setup (設定)]という名前の新しいカテゴリを作成します[Compile(コンパイル)] をクリックして [Default Value (デフォルト値)] を使用します。 [Default Value (デフォルト値)] で
M_EmissiveColorを選択します。 この変数はひとまずこれで終了です。OffMaterial を選択します。 [Details (詳細)] パネルで、[Setup (設定)] カテゴリに追加します。
[Default Value (デフォルト値)] で
M_BasicColor_Blueを選択します保存してコンパイルします。
これでブループリントがマテリアルを参照できるようになったので、ロジックを使用してこれらを使用するタイミングをスイッチに指示します。
ロジックを実装する
ボックス コリジョン、スタティック メッシュ、2 つのマテリアルがあります。 これでスイッチのロジックを次のように記述できます。
ランタイム時に、Switch が OffMaterial を表示する必要があります。
Trigger がコリジョンを検出したら、Switch のマテリアルを OnMaterial に設定します。
Trigger がコリジョンの検出を停止したら、Switch のマテリアルを OffMaterial に設定します。
このロジックをビルドするには、コンストラクション スクリプトを使用してランタイム時に BP_Switch が OffMaterial を使用するように指示します。
[Construction Script (コンストラクション スクリプト)] タブで、Construction Script ノードの 実行ピンをドラッグして、 「Set Material (Switch)」を検索します。 クリックしてマテリアルを作成します。
Set Material ノードで、Material ピンからドラッグし、Get OffMaterial を検索します。 選択します。
保存してコンパイルします。
残りのロジックは EventGraph で処理します。 オーバーラップ時にスイッチのオン/オフを指定するには、次の手順を実行します。
EventGraph で、Event BeginPlay ノード、Event ActorBeginOverlap ノード、および Event Tick ノードを削除します。 それらは不要です。
[My Blueprint (マイ ブループリント)] タブの [Components (コンポーネント)] 見出しで、[Trigger] を右クリックし、 [Add Event (イベントの追加)] > [Add OnComponentBeginOverlap] を選択します。
この処理を繰り返して、OnComponentEndOverlap ノードも追加します。
OnComponentBeginOverlap(Trigger) ノードの Exec ピンからドラッグし、「SetMaterial (Switch)」を検索します。
Set Material ノードの Materialピンから 「Get OnMaterial」をドラッグして、検索します。
OnComponentEndOverlap(Trigger) ノードの Exec ピンから「Set Material (Switch )」をドラッグして、検索します。
Set Material ノードの Material ピンから、「Get OffMaterial」をドラッグして、検索します。
スイッチは、ひとまず終了です。保存してコンパイルします。
コンストラクション スクリプト グラフは次のようになります。
EventGraph は次のようになります。
これで、プロジェクトをテストして、スイッチが正しく機能するかどうかを確認することができます。
BP_Switch のインスタンスをコンテンツブラウザからルーム 1 にドラッグします。 [プレイモード] ツールバーの 3 点メニューをクリックし、[Current Camera Location (現在のカメラ位置)] を選択します。 これにより、1 つの機能をテストするためにレベル全体を実行するのではなく、ビューポートの現在位置から PIE モードに切り替えることができます。
PIE モードでは、スイッチに足を踏み入れるとライトが点灯します。 スイッチから降りると、ライトは青く点灯します。
モジュール式開発のメリット
たとえば、1 つではなく 2 つのスイッチが必要で、2 つ目のスイッチは緑ではなく赤に光るようにしたいとします。 同じロジックで新しいスイッチをビルドし、赤色のマテリアルを割り当てることができますが、開発時間が長くなり、プロジェクトのオーバーヘッドも増加します。
オーバーヘッドとは、リソース (処理能力、時間、ストレージの量など) の消費のことです。
各プラットフォーム (コンピュータとコンソール) の処理能力は限られているため、ゲーム デベロッパーは通常、オーバーヘッドを削減するためにモジュール式の作業を行いたいと考えています。
ブループリントと変数を使用してスイッチをビルドしたため、すでにモジュール的に作業することができます。 実際の作業を確認しましょう。
コンテンツ ブラウザ で
BP_Switchをダブルクリックし、 ブループリント エディタで開きます。[Variables (変数)] で OnMaterial を選択し目のアイコンをクリックして開きます。
OffMaterial を選択し、別の方法で同じことを実行します。[Details (詳細)] パネルの Instance Editable (インスタンス編集可能) をオンにします。 すると目のアイコンが開いてパブリック変数になりました。
保存してコンパイルし閉じます。
レベル内に BP_Switch のインスタンスが 1 つあるはずなので、2 つ目のインスタンスをドラッグします。 ビューポートでいずれかのスイッチを選択すると、[Details (詳細)] パネルに [Setup (設定)] という新しい UI カテゴリが表示されます。 これは、「変数を作成する」で作成した変数カテゴリです。 [Setup (設定)] では、ビューポートからオンザフライで変更できるパラメータとしてパブリック変数が表示されます。
マテリアルを希望どおりに変更し、PIE モードでスイッチがどのように反応するかをテストします。 スイッチの各インスタンスは、新しいスイッチをゼロから作成することなく、固有のオン/オフのマテリアルを保持できるため、開発が高速化し、オーバーヘッドが削減されます。
このビューポートとまったく同じ外観にしたい場合は、このチュートリアルに進む前にスイッチの 2 つ目のインスタンスを削除してください。
単一のアクティベーションと複数のアクティベーションを作成
現在の設定では、スイッチのオンとオフが無限に切り替わります。 1回だけ有効にするのが重要な場合もあります。 たとえば、略奪につながる廊下で、プレイヤーが回避しなければならないトラップを有効にするスイッチが必要な場合があります。 プレイヤーがトラップを回避して戦利品を回収した場合、スイッチはトラップを再度有効にしません。
すでにビルドしたものを破棄するのではなく、スイッチの使用を 1 回だけ許可するブーリアンを追加します。
変数名 | 型 | デフォルト値 | 説明 |
ActivateOnce | ブーリアン | False | このスイッチが繰り返しアクティブ化できるようにするか、1 回だけアクティブ化するかを指定します。 |
このためには、次のステップを実行します。
BP_Switchのブループリント エディタの [Variables (変数)] で [+] ボタンをクリックして新しい変数を追加します。「
ActivateOnce」と名付け ピンの種類を Boolean に設定します[Details (詳細)] パネルで、[Instance Editable (インスタンス編集可能)] ボックスをオンにします。
[Category (カテゴリ)] の横にあるドロップダウンメニューをクリックして [Setup (設定)] を選択します。
[Compile (コンパイル)] をクリックして、変数の [Default Value (デフォルト値)] を表示し、オフであることを確認します。 つまり、このブループリントでは ActivateOnce はデフォルトでオンになりません。
EventGraph で右クリックして Branch ノードを検索します。
Branch ノードの Condition ピンからドラッグし、Get ActivateOnce を検索します。
On Component End Overlap (Trigger) ノードの Exec ピンを Branch ノードの Exec ピンにドラッグします。 これで SetMaterial ノードから接続が解除されます。
Branch ノードの False ピンを Set Material ノードの Exec ピンに接続します。 つまり、オブジェクトがスイッチから離れると、ActivateOnce が True に切り替わると、スイッチはコリジョンの検出を停止します。 ActivateOnce が False に切り替わった場合、このスイッチは無期限に機能します。
このブループリントを保存してコンパイルし、閉じます。
ビューポートで
BP_Switchを選択します。 [Details (詳細)] パネルで、このインスタンスの ActivateOnce チェックボックスはオンオフできます。 有効にして、仕組みを確認してみましょう。
EventGraph は次のようになります。
[Play (プレイ)] をクリックして PIE モードで変数をテストします。 ActivateOnce が有効な場合、スイッチは、スイッチから降りた後でも光ったままです。
物理によるスイッチの有効化
このチュートリアルの後半部分で、プレイヤーはスイッチを押したままにしてレベルの残りの部分を移動する必要があります。 このために、このパズルの 2 つ目のゲームプレイ オブジェクトを作成します。物理キューブです。 これはゲームのメカニックである物理を、あなたがデザインするパズルに組み込みます。
ブループリントを使用して物理キューブを作成するには、次の手順を実行します。
コンテンツ ブラウザで、[AdventureGame] > [Designer (デザイナ)] > [Blueprints (ブループリント)] > [Activation (アクティベーション)] に移動し、右クリックして新しい ブループリント クラスを作成します。
Pick Parent Class (親クラスを選択) ダイアログで Actor (アクタ) を選択します
新しいブループリントを
「BP_Cube」という名前にします。これをダブルクリックしてブループリントエディタで
BP_Cubeを開きます。[Components (コンポーネント)] タブで、[Add (追加)] をクリックしてスタティックメッシュを作成し、
「cube」を検索して選択します。メッシュを
「Cube」という名前にします。[Details (詳細)] パネルの [Static Mesh (スタティック メッシュ)] で「SM_ChamferCube」を検索し、選択します。
Z 位置を
50.0に設定します。Materials (マテリアル) で Element 0 (要素0) を
M_BasicColor_Blueに設定します。[Physics (物理)] の [Simulate Physics (物理をシミュレート)] を有効にします。 この設定により、UE の Chaos (カオス) 物理エンジン を使用できるようになり、プレイヤーが押したことにキューブが反応するようになります。
保存してコンパイルします。
機能をテストするには、BP_Cube のインスタンスをレベル内のスイッチの近くにドラッグします。 [Play (プレイ)] を押して PIE モードに入り、WASD キーを使用して BP_Cube をスイッチに押し込んでオンにします。
Debug
キューブをスイッチに押し込むとスイッチがオンになりますが、問題に気づく場合があります。 スイッチから離れると、キューブがまだスイッチに重なっている状態でもスイッチがオフになります。
現在のロジックを確認してエラーを見つけます。
Trigger が コリジョン の検出を停止したら、Switch のマテリアルを OffMaterial に設定します。
この問題を解決するには、続行する前にオーバーラップするアクタをチェックするように Trigger に指示します。
トリガーがコリジョンの検出を停止し、トリガーにオーバーラップするアクタがない場合、Switch のマテリアルを OffMaterial に設定します。
ブループリントにこの調整を加えるには、次の手順に従います。
BP_Switchのブループリント エディタで、右クリックして Branch ノードを作成します。Condition ピンからドラッグし、Is Empty (Array) ノードを検索して作成します。
Is Empty ノードの Target Array ピンから、Get Overlapping Actors (Trigger) を検索して作成します。
クラスフィルタ を [Actor] に設定します。
1 つ目の Branch ノードの False ピンからドラッグして、2 つ目の Branch ノードの Exec ピンに接続することで、このロジックを既存のノードに接続します。
2 番目の Branch ノードの True ピンを Set Material ノードの実行ピンに接続します。
保存してコンパイルします。
EventGraph は次のようになります。
トリガーのコリジョン設定を調整するには、次の手順を実行します。
[Components (コンポーネント)] タブで [Trigger] を選択します。
[Details (詳細)] パネルの [Collision Presets (コリジョン プリセット)] ヘッダで、ドロップダウン メニューを [Custom (カスタム)] に設定します。
Collision Enabled (コリジョンが有効) ドロップダウンで、Collision Enabled (Query and Physics) (コリジョンが有効 (クエリと物理)) を選択します。
[Object Type (オブジェクト タイプ)] ドロップダウンで WorldDynamic を選択します。
WorldDynamic の横にある [Ignore (無視)] をオンにします。
保存してコンパイルします。
PIE モードを開いてソリューションをテストします。 オパシティに関係なく、アクタがオーバーラップしている限り、スイッチが点灯したままになる必要があります。
追加の機能を作成する
ここまででオンとオフのスイッチを作成できました。 これは、スイッチが適切に機能しているかどうかを視覚化するのに優れていますが、より便利です。 次に、スイッチを使用してレベル内にある他のオブジェクトを有効にします。
まず、2 つの関数を使用して ブループリント インターフェースを作成します。それぞれスイッチのオンとオフの状態を表します。 これらの関数は、オブジェクト間でシグナルを送るイベントなどに使用されます。
コンテンツ ブラウザで、[AdventureGame] > [Designer] > [Blueprints (ブループリント)] > [Core] に移動し、右クリックして [Blueprint (ブループリント)] をハイライトします。 [Blueprint Interface (ブループリントインターフェース)] を選択します。
インターフェースに
BPI_Interactionという名前を付けます。 ダブルクリックして、[Blueprint Interface (ブループリント インターフェース)] ウィンドウを開きます。MyBlueprint パネルでは、新しい関数がすでに存在しているはずです。 「
fnBPISwitchOn」という名前を付けます[Add (追加)] をクリックし 2つ目の関数を作成します 「
fnBPISwitchOff」という名前を付けますインターフェースが完了しました。 保存してコンパイルし、閉じます
次に、スイッチを有効にするすべてのオブジェクトを含む配列を作成します。 このチュートリアルでは、配列を使用して、新しいオブジェクトごとに固有のロジックを作成するのではなく、スイッチがアクティブにするオブジェクトを管理します。
変数名 | 型 | デフォルト値 | 説明 |
InteractObjectList | アクタの配列 | None (なし) | このスイッチがアクティブ化するアクタの配列。 |
BP_Switchの My Blueprint タブの Variables (変数) で、+ ボタンをクリックして新しい変数を作成します。「
InteractObjectList」という名前を付けて、ピンのタイプを Actor (Object Reference) に設定します。[Details (詳細)] パネルの [Variable Type (変数の型)] でコンテナの型を [Array (配列)] に設定します。
これを UI パラメータにするには、[Instance Editable (インスタンス編集可能)] をオンにして [Setup (設定)] カテゴリに追加します。
保存してコンパイルします。
ロジックを使用して、配列内の各オブジェクト (現在は空) をイテレートし、前に作成した BPI_Interaction インターフェースを使用して通知するようにスイッチに指示します。 そうするには For Each Loop を使用します。
このためには、次のステップを実行します。
EventGraph で、Set Material ノード (On Component Begin Overlap ノードの) の Exec ピンからドラッグして、 For Each Loop を検索します。
イベントを実行するオブジェクトを指定するには、For Each Loop の Array ピンをドラッグし、Get InteractObjectList を検索します。
最後に、For Each Loop の Loop Body ピンをドラッグして、「fnBPISwitchOn」を検索します。 これが呼び出すイベントです。
For Each Loop の Array Element ピンを fnBPISwitchOn ノードの Target (ターゲット) ピンに接続します。
On Component End Overlap (Trigger) についても同じように設定する必要があります。 この処理を高速化するには、For Each Loop ノードと Interact Object List ノードを選択し、右クリックして [Copy] または [Ctrl + C] を押してコピーします。 Ctrl + P キーを押して、それをグラフに貼り付けます。
Set Material ノードの Exec ピンを For Each Loop の Exec ピンに接続します。
For Each Loop の Loop Body ピンからドラッグして、fnBPISwitchOff を検索します。 Array Element ピンを Target ピンに接続します。
スイッチは、ひとまず終了です。 保存してコンパイルし閉じます。
EventGraph は次のようになります。
これで、スイッチの各インスタンスごとにレベル内のユニークなオブジェクト リストを有効にするための基礎が整いました。 次のチュートリアルでは、この課題の 3 つ目のゲームプレイ オブジェクトである、動くプラットフォームを作成します。