チュートリアル シリーズのこのセクションでは、新しいレベルの作成、オブジェクトの配置とトランスフォーム、さまざまなビューポート モードの操作、アウトライナーの使用により整理された状態を保つ方法など、Unreal Editor の基本を学習します。
また、スケール、垂直性、オクルージョン、コントラスト、ガイドラインなどのレベル デザインの概念を適用しながら、シンプルな形状を使用してアイディアをブロックする方法を学びます。 これらはプレイヤーのレベルの移動や体験に影響を与えるツールです。
コースを終えると、トラックの次のセクションで作成するゲームプレイの基礎となるプレイ可能な空間ができあがります。
開始する前に
Epic Games Launcher と Unreal Engine がインストールされていることを確認します。
このチュートリアルを実行するには、Unreal Editor のツールバー、パネル、およびビューポート コントロールの基本を理解している必要があります。 詳細については、このチュートリアルを開始する前に Unreal Engine の新しいユーザー向けドキュメントの他のページを参照してください。
アイデアのスケッチ
エディタでビルドを開始する前に、まず 10~20 分ほど紙にアイデアを書いたり、スケッチしたりします。 この初期段階のイテレーションは、以下に役立ちます。
レベル内で基本的なゲームプレイの要素と概念を定めます。
エディタで時間をかけてアイデアをビルドする前に、ゲームプレイのアイデアがうまく機能するかどうか、スコープ内に収まっているかどうかを確認します。
作業セッションの合間にアイデアを思い出します。
この初期設計は、ゲームプレイのメカニクスから始めるか、レベル デザインから行うかなど、さまざまな方法でアプローチすることができます。 レベル デザインの手法は、作成しているゲームの型や個人的な好みに応じて、選択したり組み合わせたりすることができます。 ゲーム デザインに基づいた正しいアプローチは 1 つだけではなく、重要なのは結果です。 レベル デザインとゲームプレイが互いにサポートし合っているゲームでは、一貫性が高まり、プレイヤーにとってより没入感のある魅力的な体験を創出できます。
ノード マッピングという手法では、レベル内の異なる空間、それらの空間で発生する事象、そしてプレイヤーが空間間を移動する方法を示すために、円と線で構成された簡略化された抽象的な図を描きます。 ノード マッピングは、ゲームプレイのペーシング、パスの分岐、プレイヤーの選択に重点を置くものです。 1 つのノードは 1 つのプレイヤーの動作またはイベントを表します。 このイベントからスペースの形状を決めることができます
このチュートリアルでは一連の部屋を使用して、ロックされたドアとキー型でプレイヤーを制限する方法、プレイヤーにダメージを与えるオブジェクトを作成する方法、それらの障害物を克服するためのプラットフォームやスイッチを追加する方法など、一般的なゲームプレイ オブジェクトを実装する方法を学びます。 ノードでこの種のレベル構想をスケッチした方法は以下の通りです。
もう 1 つの手法は、レベルの実際のレイアウトの上面、側面、または正投影ビューのビジュアル スケッチの描画です。 ここではレベル デザインではなく、ゲームプレイに焦点を当てます。 レベルの空間の形状は、プレイヤーの行動やイベントを促すことができます。
最初にチュートリアル レベルの部屋と廊下のデザインをスケッチした方法を次に示します。
また、プレイヤーの動詞や、ジャンプ、走る、隠れる、つかむ、クラフト、撃つ、近接、会話など、プレイヤーがゲーム内で行えるアクションをデザインすることもできます。 これにより、ワールド内の要素からプレイヤーが取り組んでいる要素に焦点が移動します。 この考え方は、レベルのエンゲージメント、楽しさ、ペースを高めるのに役立ちます。
レベルの空間をデザインするとき、プレイヤーの動詞を有意義に使用する機会をどこに追加できるかを考えてください。 動詞によってスペースのデザインを構成することができます たとえば、動詞がジャンプであれば、飛び越える隙間、プラットフォーム、垂直方向の空間、飛び越えられる敵や危険などがあります。 ゲームプレイを新鮮でテンポの良いものにするために、スペースに応じて動詞を変化させてください。
レベルとゲームプレイの設計にどのようなアプローチを取る場合でも、プレイヤーが何をしているかを常に考慮する必要があります。
プロジェクトを作成する
まず、一人称視点テンプレートを使って新しいプロジェクトを作成します。 テンプレートには、レベル デザインの編集に役立つメッシュ、ゲームプレイ オブジェクト、プレイヤー キャラクターなど、事前作成済みのアセットが含まれています。
メッシュは 3D モデル、または 3D モデルを作成するポリゴンのセットです。 スタティック メッシュは、レベル内にオブジェクトを作成するために使用される 3D モデルで、平行移動、回転、スケーリングが可能です。
プログラミング トラック チュートリアルを開始した場合は、このトラックでプロジェクトを引き続き使用できます。
新しいファーストパーソン プロジェクトを作成するには、次の手順を実行します。
Unreal Editor を開きます。 [Unreal Project Browser (Unrealプロジェクトブラウザ)] で、[Games (ゲーム)] プロジェクト カテゴリに移動し、[First Person (一人称視点)] テンプレートを選択します。
全てのプロジェクトデフォルトを維持し、バリアントとして Arena Shooter (アリーナシューター) を選択します。 テンプレート バリアントには、追加のアセットと、そのゲームプレイ ジャンルに対応するサンプル レベルが含まれています。
プロジェクトに名前を付けます。 このチュートリアルでは、プロジェクト名として
AdventureGameを使用します。[Create (作成)] をクリックし、Unreal Editor で新しいプロジェクトを開きます。
ビューポートに Lvl_FirstPerson サンプル レベルが開かれた状態で、プロジェクトが開きます。
新しいレベルの開始
このプロジェクトを独自に開始するには、まったく新しいレベル (別名マップ) を作成してそのコンテンツを確認し、ゲームの開始方法を設定して初回のプレイを行います。
Unreal Editor で作業している際に予期しない動作が発生した場合 (アセットやアクタが表示されない、または更新されないなど)、エディタを再起動してみてください。 Unreal Engine はキャッシュに大きく依存しているため、多くの場合、これらの問題は再起動することで解決できます。
新しいレベルを作成するには、次の手順に従います。
Unreal Editor のメニューバーで、[File (ファイル)]、[New Level (新しいレベル)] の順に選択します。
[New Level (新しいレベル)] ウィンドウで、[Basic (基本)] を選択し、[Create (作成)] をクリックします。 これにより、まず床、空、プレイヤー スポーン、環境光を設定することができます。
[File (ファイル)] > [Save Current Level (現在のレベルを保存)] の順に選択します。
このチュートリアル シリーズで作成するアセットを格納するフォルダ構造を作成します。
[Save Level As (レベルに名前を付けて保存)] ウィンドウの左パネルで、[Content (コンテンツ)] フォルダを右クリックして、[New Folder (新しいフォルダ)] を選択します。
このフォルダにプロジェクトにちなんだ名前を付けます。 このチュートリアルでは、
AdventureGameを使用します。新しいフォルダを右クリックして [New Folder (新しいフォルダ)] を選択します
このフォルダに
Designerという名前を付けて選択します。
レベルの名前を入力して、[Save (保存)] をクリックします。 このチュートリアルでは
Lvl_Adventureを使用します。
アウトライナーと詳細パネルの活用
アウトライナーを見ると、レベル内の全てのオブジェクトのリストを確認できます。 これらのオブジェクトは、多くの場合、アクタとも呼ばれます。
[Lighting (ライティング)] フォルダには、レベルの背景と環境光を制御する一連のオブジェクトがあります。 それぞれの設定がレベルのルック アンド フィールにどのように影響しているのかを確認するには、それぞれの上にカーソルを置いて目のアイコンをクリックし、ビューポートでの表示/非表示を切り替えます。
これらのライティング レベル オブジェクトの位置は重要ではないため、必要に応じて邪魔にならないように移動できます。
また、レベルには、フロア メッシュと、プレイヤーがレベルを開始する位置をコントロールする PlayerStart スポーン ポイントも含まれます。
[Outliner (アウトライナー)]で [DirectionalLight] をクリックします。 このライトは、レベルを照らし、シャドウをキャストする太陽 (または月) として機能するように構成されます。 [Details (詳細)] パネルでは、色、強度など、ライトの各プロパティを表示および変更でき、ビューポートで結果がすぐに更新されるのを確認できます。
ビューポート内のオブジェクトが見つからない場合は、[アウトライナー] でそのオブジェクトをクリックしてFキーを押すと、そのオブジェクトに焦点が合うようにビューポートの位置を変更することができます。
レベルのライティングのカスタマイズについては、「環境のライティング」を参照してください。
ゲームプレイをビューポートでプレビューする
ビューポートは、レベルのプレビューを表示します。 ビューポート ツールバーで、[Play (プレイ)] をクリックすると、ビューポート内でレベルを再生できます。 多くの場合、これはプレイインエディタ (PIE) モードとも呼ばれます。 PIE モードを使用すると、Unreal Editor 内 (ビューポート内または新しいウィンドウ内) からランタイム時にプロジェクトがどのように機能するかをテストできます。
ランタイムとは、マシンやコンソールなどのターゲット プラットフォームでプロジェクトが実行されている期間を指します。
レベルをプレイすると、PlayerStart の場所でスポーンします。
続いて、ビューポートをクリックし、WASD キーまたは矢印キーを使用して移動し、スペース キーを使用してジャンプします。
下の方に確認すると、ゲームでデフォルトのファーストパーソン プレイヤー キャラクターが使用されていることがわかります。
Shift+F1 を押してカーソルに再び切り替え、[Stop (停止)] (または Escape を押す) をクリックしてプレイ モードを終了します。
ゲームのフル バージョンのスタンドアローン バージョンでプレイするには、プレイ モード コントロールの横にある 3 つの点をクリックして、Standalone Game (スタンドアローン ゲーム) モードを選択します。 これにより、新しいウィンドウでゲームをプレイして、完成したエクスポート済みのゲーム バージョンをシミュレートし、UI メニューやロード画面、解像度のスケーリング、マウス入力をテストすることができます。 ただし、このモードはエディタ内で実行されます。 temporary .exe をビルドして実行します。[Quick Launch (クイック起動) ] モードを選択します
このメニューを使用すると、ビューポート内での再生モードに戻ります。
コンピュータで Unreal Editor の動作が遅いと感じた場合は、ビューポート の右上隅にある Performance and Scalability (パフォーマンスおよびスケーラビリティ) ツール のボタンをクリックして、Viewport Scalability (ビューポート のスケーラビリティ) を選択し、より低い品質設定を選択します。または、ビューポート ツールバーの右側にある [Lit (ライティングあり)] をクリックして、[View Mode (表示モード)] メニューを開き、[Unlit (ライティングなし)] を選択します。 これは Unreal Editor にのみ影響し、最終プロジェクトには影響しません。
スタートアップ レベルの変更
[Project Settings (プロジェクト設定)] を使用して、Unreal Editor でプロジェクトを開いたとき、および完成したゲームをプレイするときにロードされるレベルを変更します。
プロジェクトのデフォルトの開始レベルを変更するには、次の手順を実行します。
エディタのメイン メニューで、[Edit] > [Project Settings (プロジェクト設定)] の順に移動します。
左側のパネルの [Project (プロジェクト)] セクションで、[Maps & Mode (マップとモード)] を選択します。
[Default Maps (デフォルト マップ)] セクションで、Editor Startup Map (エディタのスタートアップ マップ) と Game Default Map (ゲームのデフォルト マップ) を新しいレベルに変更します。 エディタでは、プロジェクトを開くときに Editor Startup Map (エディタのスタートアップマップ) が開き、Unreal Engine は、プロジェクトのスタンドアローンまたはパッケージ化された
.exeをプレイするときに、 Game Default Map (ゲームのデフォルトマップ) をロードします。[Project Settings] を閉じます。
マップのブロックアウト
コンセプト、新鮮なプロジェクト、新しいレベルが準備できたので、Unreal Editor で設計を開始することができます。
最終的なアートや洗練されたディテールについて考える前に、まずレベルのレイアウトとプレイアビリティに焦点を置くことが重要です。 この設計フェーズは、多くの場合、ブロックアウト (または グレーボックス) と呼ばれ、壁、小道、機能的な障害物を表すシンプルな形状を使用してレベル内の大まかな空間を構築します。 ペイントで仕上げる前に、キャンバスに鉛筆でスケッチするようなものです。
ブロックアウトは、素早くアイデアをイテレートしてテストすることで、設計の適切な改善点とそうでないものを判断するのに役立つツールです。 なおこれは最終的な製品ではなく、プレイヤーが実際に操作するゲームの部分に多くの時間を費やせるよう、このプロセスは迅速に行う必要があります。
レベルをブロックアウトすると、次の点で役立ちます。
完成したアート デザインの完了を待たずに、ゲームプレイのデザインを開始できます。
デザインの問題を早い段階で把握できます。
アートアセットを手直しするリスクをせずに、素早く実験してイテレートすることができます。
この段階で不要な詳細に時間を使わずに、スケール、視線、ゲームプレイ フローをテストできます。
ゲームプレイを支える障害物だけを使用して、可能な限りシンプルでナビゲート可能なバージョンのレベルを作成できます。 見かけではなく、空間がどのように感じられるか、楽しいかどうか、ゲームプレイの目標に沿っているかどうかに注目してください。 基本的な形状を使用しているため、問題が起きても削除して新しいことを試すことができます。
機能し、ゲームプレイをサポートする限り、レイアウトと芸術的なデザインの両方をブロックアウトに組み込むことができます。 成功を収めるゲームは、両方のデザイン要素を活用して魅力的で没入感のある空間を作り出しています。
| ブロックアウトに追加する | ブロックアウトに追加しない | |
|---|---|---|
レイアウト デザインの選択肢 |
|
|
芸術的なデザインの選択 |
|
|
スケールの決定
レベルのブロックアウトを行いすぎる前に、ゲームの標準的な測定値とスケールを確立することが重要です。 これには、レベル内の共通の構造物のサイズの決定も含まれます。例:
ジャンプ可能なオブジェクト、登ることができるオブジェクト、遮蔽物、廊下、および部屋の高さ。
ドア、窓、廊下のサイズ。
レベルのスケールを調整する際の目標は、レベルに一貫性があり、自然な形になり、わかりやすくなります。 ブロックアウトは環境アーティストにとってスケールも生み出します。
Unreal Engine ではセンチメートル単位で作業し、100 センチメートルは 1 メートルに相当します。
自然にする
空間の特徴は、プレイヤーの大きさに基づいてリアルに感じられるようにする必要があります。 ただし、全てのリアリズムがゲームで必ずしも平行移動するとは限らないことを覚えておいてください。 たとえば、幅が 0.8 メートルの出入口は、現実では広く感じられますが、ゲーム内では非常に狭く、カメラがクリッピングせずに通り抜けられない可能性があります。 各種のゲームで、納得のいくリアリズムと楽しさのバランスを見つけてください。
スケールは、プレイヤーのサイズ、空間をどのように感じるか、その空間でサポートされるゲームプレイによって異なります。 その空間は、狭くて閉所恐怖症のような廊下か、それともオープンで風通しのいい部屋か? 1 人のプレイヤー、複数のプレイヤー、または敵との遭遇に対応する必要はあるか?
レベルの空間のスケールを決定するとき、これらの平均的な測定値について留意する必要があります。
| レベル オブジェクト | 標準測定 |
|---|---|
人間キャラクター | 身長 1.8m、ジャンプの高さ 0.5m |
廊下 | 幅 2~3m、高さ 3~4m サードパーソン カメラを使用するには、カメラに合わせて広い廊下が必要です。 |
ドア | 1 - 幅 1.5m、高さ 2m |
壁 | 高さ 4m |
これは単なるガイドラインです。 レベルのデザインとスケールは、ゲームプレイ エクスペリエンスのニーズと一致している必要があります。
わかりやすくする
レベルの特徴のスケールは、プレイヤーが読みやすく、予測可能である必要があります。 プレイヤーがオブジェクトに向かって歩いていくとき、カバーのために横にしゃがむ、飛び乗る、登る、または通過できないのかが一目でわかるようにします。
たとえば、小さな庭の壁を表現する短い構造物があります。これはプレイヤーを導きますが、飛び越えることはできません。 高さは 0.6m (プレイヤーのジャンプの高さから 10cm 高い) です。
低いので飛び越えられると思われる壁に向かって走り、実際は飛び越えられない場合、プレイヤーはストレスを感じるかもしれません。 代わりに、壁を一連の背の高い格子状のパネルに置き換えると、壁と同じような可視性を確保しながらも、プレイヤーにこの方法では通り抜けられないことを伝えることができます。
一貫性を持たせる
レベルをリアルに感じさせ、ワールドの構築をサポートするには、環境全体の共通の物体のサイズを一定に保ちます。
ただし、プレイヤーの注意を引き、感情を呼び起こすために何らかのコントラストを導入することはできます。 たとえば、1 つのドアを他の全てのドアよりも大きくすることで、その重要性を示唆することができます。
多くのデザイナーがレベルやプロジェクトで作業している場合、測定値を標準化することでアセット間の不一致を防ぎ (作業をやり直す必要がなくなります)、プレイヤーのための一貫したエクスペリエンスを作成するのに役立ちます。
レベルをデザインする際に、プレイヤーのスケールの参照用として、各スペースにプレイヤー サイズのキューブまたはキャラクター メッシュを作成します。 プレイヤー スタティック メッシュを追加するには、コンテンツ ブラウザで [Content (コンテンツ)] > [Characters (キャラクター)] > [Mannequins (マネキン)] > [Meshes (メッシュ)] フォルダに移動し、SKM_Manny_Simple をビューポートにドラッグします。
カメラがより後方にあるため、サードパーソン ビューではオブジェクトが小さく表示されます。そのため、ファーストパーソン ゲームと比較すると、空間のスケールを大きくする必要がある場合があります。 適切なガイドラインは、サードパーソン カメラで作業している場合、スケールに 1.5 を乗算すること (50% 増加) です。
モジュラーと完了な構成要素の比較
空間をブロッキングする場合、壁、床、天井を長いメッシュでビルドすることも、メッシュを複製してよりモジュール化した設計にすることもできます。
この選択肢は好みや空間の型に応じて異なります。廊下や部屋にはモジュール式のピースを使用し、変わった形状の部屋や自然の空間には大きなピースを使用できます。
モジュール式ピースでブロックアウトすることには次のメリットがあります。
多くのレベル デザイナーは、それぞれのモジュラー ピースのサイズを変更するよりも、ピースを複製する方が、作業をより迅速かつ予測可能に進められると考えています。
ブロックアウトでは、1 つの大きなピースではなく、1 つまたは 2 つのモジュラー ピースを変更する方が簡単である場合があります。
これにより、アーティストが作成しなければならないアセットの数を最小限に抑えながら、多彩な空間をビルドできます。
標準化されたサイズでは、全てのアラインメントが同じグリッドとスケールで維持されるため、必要となるユニークなマテリアルとメッシュの数が減ることでパフォーマンスが向上します。
モジュール式のデザイン手法を使用して、構成要素のように使用してレベルの空間を組み立てることができるメッシュ形状のパレットを作成できます。 しかし これらは単なる基礎であり必要に応じていつでもユニークな形状を追加できます。
最初のオブジェクトの追加
プロジェクトに含まれるサンプル アセットを使用して、スケールの実験を開始し、レベルをブロックアウトします。
アセットとは、プロジェクトに作成またはインポートするファイルのことで、コンテンツ ブラウザに格納されます。 アセットとしては、3D メッシュ、2D 画像、サウンド ファイルなどがあります。
Unreal Engine では、アセットおよびアクタを操作します。
アセットとは、プロジェクトに作成またはインポートするファイルのことで、コンテンツ ブラウザに格納されます。
アクタは、レベル内に配置される任意のオブジェクトです。
多くの場合、アクタはアセットのインスタンスであり、ワールドに配置されたそのアセットの個々のコピーを意味します。
最初のスタティック メッシュをレベルに追加するには、次の手順に従います。
コンテンツ ブラウザのアセット ツリーで、[Content (コンテンツ)] > [LevelPrototyping] > [Mesh (メッシュ)] フォルダに移動します。
SM_Cubeをクリックして、ビューポートの PlayerStart の近くにドラッグします。 これにより、レベル内にSM_Cubeアセットを使用するスタティック メッシュ アクタが作成されます。
コンテンツ ブラウザ アセットとそのアセットのレベル オブジェクト インスタンスには親子関係があります。 親の SM_Cube アセットに変更を加えると、レベル内のメッシュに影響を及ぼしますが、レベル内の SM_Cube オブジェクトのインスタンスに加えた変更は、 コンテンツ ブラウザの SM_Cube アセットに影響することはありません。
このブロックは 1m x 1m x 1m で、一目でその寸法を確認できるよう、グリッド マテリアルが含まれています。 マテリアル上の暗色のラインは 1m のグリッドを作成し、床のマテリアル上の明るい色のラインは 0.1m のグリッドを作成します。 垂直サーフェスの光のラインは 0.2m グリッドです。
Unreal Engine でのマテリアルとは、メッシュのサーフェスの外観を変更する、2D テクスチャで構成されるアセットを指します。 マテリアルは、メッシュを金属や木材、または単に単色に見えるようにするものです。
1m のブロックのサイズを壁に合わせるには、次の手順を実行します。
ビューポートで、そのブロック メッシュをクリックして選択します。
ビューポート ツールバーで、[Scale (スケール)] ボタンをクリック (または R キーを押す) します。 スケール ギズモがブロックに表示されます。
ギズモのハンドルをクリックしてドラッグすると、ブロックをより薄く、長く、高くすることができます。 壁の厚さは、何を構築しているかによって異なります。 家屋の壁は薄く、要塞にはより厚い壁があります。 10~30cm を目安にするとよいでしょう。
形状のサイズを変更するときは、[Details (詳細)] パネルを確認して、その [Scale (スケール)] プロパティがどのように変化するかを確認します。 詳細パネルでオブジェクトの位置、回転、サイズを変更することもできます。
複数の次元で一度に形状を大きくまたは小さくするには、赤と青の間にある三角形を黄色でハイライトして、クリックしてドラッグします。
3 つの次元を一度にスケールするには、ギズモの中央にある白い球体をクリックしてドラッグします。
壁の位置を調整するには、次の手順に従います。
ビューポート ツールバーで、[Translate (平行移動する_] ボタンをクリック (または、W キー) します。
緑色または赤色のハンドルをクリックしてドラッグし、フロアに沿っていずれかの方向に形状を移動できます。
形状を 2 方向に同時に移動するには、緑色と赤色のハンドルの間にある四角が黄色で強調表示されるまでカーソルを置き、形状をクリックしてフロアにドラッグします。
オブジェクトを複製し整列して部屋をビルド
部屋を作るにはさらにいくつかの壁が必要です。先に進みましょう。
簡単に別の壁の構成要素を作成するには、壁のメッシュを選択し、Alt キーを押しながら平行移動するギズモを使用してメッシュを移動します。 これにより、元のメッシュはそのまま維持されて複製が作成されます。
壁のピースを複製して移動させ、最初の部屋をビルドします。 このチュートリアルの後のモジュールで、十分なスペースがあることを確認してから、障害物を追加します。
Ctrl を押して一度に複数の構成要素を選択し、Alt キーを押したまま回転または平行移動すると、選択項目全体を複製します。
オブジェクトを移動させると、非表示のグリッドに沿ってスナップされることがわかります。 グリッドとグリッド スナップ ツールは、レベル内でのオブジェクトの正確な配置、整列、およびスケールに役立ちます。 グリッドにより、全ての要素がきれいにスナップされ、サイズと位置が一定になります。
人工的な空間は、自然の空間よりもグリッドに沿っています。
ビューポート ツールバーで、グリッド スナップ メニューを使用して、平行移動、回転、スケールの別のグリッド サイズ (またはスナップの増分) を選択できます。 デフォルトでは、移動中のオブジェクトのグリッド サイズは 10 ユニット、つまり 10cm です。
大きいスナップ間隔は部屋や壁のレイアウトに適しており、小さいグリッド サイズはオブジェクトの配置を微調整するのに便利です。 たとえば、オブジェクトを直角に整列させるには、回転のグリッド スナップを 45° または 90° に変更します。
全てのスナップ オプションの詳細については、ビューポート ツールバーの「スナップ ツールとスナップ設定」セクションを参照してください。
オブジェクトの位置が合っていることを確認するもう 1 つの方法は、2D ワイヤーフレーム ビューを使用することです。 ビューポート ツールバーの右側にある [Perspective (パースペクティブ)] をクリックしてカメラ オプションを開き、[Top (上)] を選択します。
これらの正投影型のビューは、デフォルトでワイヤーフレームモードになっており、レベルのジオメトリのエッジとポリゴン構造が表示されます。 このモードではグリッドも表示できます レベルをブロックアウトする際は、上部ビューまたは側面ビューに定期的に切り替えて、メッシュのアライメントを確認します。 完了したらパースペクティブ モードに戻します。
2D ワイヤーフレーム ビューポートでオブジェクトを選択しようとすると、大きなライト、スカイ メッシュ、トリガー ボリュームなどの一部のオブジェクトが邪魔になることがあります。 これらのオブジェクトを非表示にするには、ビューポート ツールバーの [Show Flags (フラグを表示)] メニューを使用してオブジェクトのタイプを非表示にします。 または、アウトライナーを使用して個々のオブジェクトを非表示にします。
開始点を設定
レベルの開始位置を確保したので、PlayerStart の位置をプレイヤーが開始する場所に再配置し、正しい方向を向いていることを確認します。
プレイヤーの開始位置と方向を変更するには、次の手順を実行します。
PlayerStart オブジェクトをクリックします。 Translate (平行移動) ギズモを使用して、プレイヤーを最初の部屋にスポーンさせたい場所にギズモを移動します。
キーボードの Q キーを押して [Select (選択)] モードに変更し、ギズモを削除します。 PlayerStart オブジェクトの青い矢印は、ゲーム開始時にプレイヤーが向いている方向を示しています。
トランスフォーム ツールバーを使用して Rotation (回転) ギズモに切り替えて回転させることで、開始時にプレイヤーが向いている場所をコントロールできます。
ドアの追加
このチュートリアルの後半では、さまざまな色に設定できるキー型のブループリントを作成し、それぞれの色に一致するドアのロックを解除する方法を学びます。 この機能のためのレベルを設定するには、ドアを追加します。
BP_DoorFrame ブループリントを追加したりサイズ変更したりするには、以下の手順に従います。
ブロックアウトに 3 つの異なるドアのための空間を作ります。
コンテンツ ブラウザで、[Content (コンテンツ)] > [LevelPrototyping] > [Interactable (インタラクト可能)] > [Door (ドア)] に移動します。
BP_DoorFrameをレベルにドラッグします。このオブジェクトはSM_Cubeのようなプレーンなスタティック メッシュではないブループリントで、追加の機能や動作がスクリプト化されたビジュアル アセットです。 ビューポートでは、このウィジェットがトリガー ボリュームに囲まれ、Door Size (ドア サイズ) ウィジェットがあることがわかります。 ブループリントの詳細については このチュートリアルの次のモジュールで説明しますDoor Size (ドア サイズ) ウィジェットをクリックします。 これにより、平行移動ギズモが強制的にアクティブになりますが、スケール ギズモと同じようにドアのサイズを変更するために使用できます。
ドアのメッシュをクリックし、平行移動ギズモを使用してドアを壁の隙間の 1 つに移動させます。 全てがきれいに収まるように、壁やドアの幅を調整する必要がある場合があります。
ワイヤーフレームのトップダウン ビューで微調整します。これらの手順を繰り返して、部屋にドアを 2 つ追加します。
廊下のビルド
次に、最初の部屋と 2 番目の部屋をつなぐ廊下でトラバーサルを行う空間を追加します。
廊下をデザインする方法はいくつかあります。 まず、直線的にするとどうでしょうか?
これはおもしろいとは言えないかもしれませんが、プレイヤーが廊下を進んでいくときに遠隔アタックによってプレッシャーをかけたい場合や、廊下の終わりでプレイヤーに何かを予測させたい場合には効果的です。 直線の廊下は、プレイヤーが身をかわしたり乗り越えたりする必要がある障害物によってよりおもしろくすることができます。
曲がりくねった廊下はどうでしょうか?
プレイヤーが角を曲がると、オクルージョンや発見などがあります。 オクルージョンとは、プレイヤーの視界が部分的または完全に遮られることを指します。 オクルージョンを使用すると、レベル内でプレイヤーの注意を向けさせることができます。 たとえば、収集アイテムやレベルの進行状況に注意を向けたり、ジャンプスケアを促すために敵の視界を隠したりします。
廊下と隣の部屋に窓を追加するとどうなるでしょうか?
これにより、廊下を歩くのが少しおもしろくなります。 プレイヤーに目的地をのぞかせて表示することで、期待を高め、パスの探索で時間を費やすことで得られる報酬を示します。
垂直の要素を加えたらどうでしょうか? つまり、階段、丘、プラットフォーム、登ることができるエリアなど、レベルに高さの変化を加えます。
垂直要素を追加すると、ゲームプレイに次の影響があります。
空間に多様性をもたらし、探索をよりおもしろいものにする。
プレイヤーに戦術的なアドバンテージ (高い場所) またはデメリット (低い場所) を与える。
プレイヤーが次に向かう場所を示す (景色を見渡すなど)。
プレイヤーの移動を制御する (空間に落下して戻れなくなる、またはロープを見つけた後にのみ空間に登ることができるようにするなど)
ブロックアウトに階段を追加するには、SM_Ramp ([Content (コンテンツ)] > [LevelPrototyping] > [Meshes (メッシュ)]) をレベルにドラッグし、サイズを変更します。 必ずスケールを逐次テストしてください。
この通路は、箱型になりすぎないように曲線を取り入れ、オクルージョンを確保しています。また、2 つの異なるルートを通れるよう幅を広く取り、それぞれでステルス行動やカバーを活用できるようになっています。 このような選択肢を加えることで、プレイヤーに対してエージェントとしての感覚を持ってもらうことができます。
早期および頻繁なテスト
レベルをプレイし、メトリクスとスケールがどのように設定されているかを確認してから、ビルドを続行してください。
プレイヤーの視線をテストして、オクルージョンが適切に設定されているかどうかを確認します。 ビューポートからは問題なく見えることがありますが、プレイテストを行うと、相手チームのスポーン地点など、プレイヤーには見えないものが見えていることが判明することがあります。
レベルが大きくなり、プレイヤーのスポーン地点から開始することなく、あるセクションをプレビューする場合は、ビューポート内の対象を右クリックして、[Play From Here (ここからプレイ開始)] を選択します。
ブロック ボリュームの追加
デザインをプレイテストしているうちに、プレイヤーがジオメトリをジャンプしてプレイ エリアを離れたり、スキップしたりできる場所が見つかることがあります。 ブロッキング ボリュームは、見えない壁として機能するレベル オブジェクトで、意図しないエリアをふさぎ、プレイヤーがレベル内に留まります。
ただし、開かれた出入口や廊下など、プレイヤーが自由に移動できると想定される場所にはブロッキング ボリュームを使用しないでください。
レベルにブロッキング ボリュームを追加するには、次の手順を実行します。
メイン ツールバーにある [Create (作成)] ボタンをクリックします。 このメニューでは、新しいアクタを作成できます。
[Create (作成)] メニューから ボリューム にスクロールし、
ブロッキングを検索して、[Blocking Volume (ボリュームのブロッキング)] を選択します。エディタで、メイン ビューポートの中央に
BlockingVolumeが追加されます。
ブロッキング ボリュームでの作業が完了したら、それらをビューポートから非表示にすることで、レベル内での煩雑さを低減できます。
この例の廊下では、ブロック ボリュームによって、プレイヤーが窓からジャンプしたり、柱を登った後に屋根からジャンプしたりできないようにしています。
ブロッキング ボリュームは複雑なコリジョン形状や詳細なジオメトリを平らにすることもできるため、プレイヤーが小さなエッジや穴にぶつかったり、不自然に衝突したりすることがなくなります。
アウトライナーでオブジェクトを整理
レベルが拡大すると、アウトライナー パネル内のオブジェクトのリストも拡大します。 オブジェクトをフォルダに整理すると、アウトライナーを整理して操作しやすくなります。 フォルダを作成し、オブジェクトを機能別や場所ごとにグループ化できます。
全てのブロックアウト メッシュを含むジオメトリ フォルダを作成するには、次の手順に従います。
アウトライナー パネルで、全てのブロックアウト ジオメトリを選択します。 (Ctrl または Shift を押すと選択内容に追加されます)。
アウトライナーの右上付近にある -[Create folder (フォルダを作成) ]ボタンをクリックします。
フォルダの名前を入力します (例:
Geometry)。
レベルが拡大した際には、レベルの各領域または部屋にブロックアウト ジオメトリのフォルダを作成することで、プロジェクトをさらに整理することができます。
ジオメトリフォルダのサブフォルダに格納するために、メッシュのサブセットに対してこの手順を繰り返します。
アウトライナーの表示/非表示の切り替えを使用して、フォルダ内の全てのオブジェクトを非表示にします。
テキストラベルを追加
スペース、障害物、またはゲームプレイ要素にラベルを付けるには、ブロックアウトにテキスト レンダリング アクタを追加します。 このテキストは、プレースホルダーとして機能したり、プレイテスターにその空間について計画されている内容のコンテキストを提供したりすることができます。
テキスト レンダリング アクタを使用してレベル内にテキスト文字列を表示するには、次の手順を実行します。
メイン ツールバーにある [Create (作成)] ボタンをクリックします。
[Create (作成)] メニューから
[Text Render (テキスト レンダリング)]を検索し、[Text Render Actor (テキスト レンダリング アクタ)] を選択します。 エディタにより、メイン ビューポートの中央に TextRenderActor が追加されます。アクタを選択した状態で、[Details (詳細)] パネルで Text プロパティを使用して、レベルに表示するテキストを入力します。
[World Size (ワールド サイズ)] を使用すると、テキストの大きさを変更することができ、[Text Render Color (テキスト レンダリング カラー)] を使用すると、テキストの色を変更することができます。
テキストを回転して適切な位置に移動します。 テキスト レンダリング アクタは、壁、床、または障害物に配置すると最もよく見えるようになります。
オプション:ゲーム内でテキスト レンダリング アクタを非表示にするには、Details パネルの [Rendering (レンダリング)] セクションで [Actor Hidden in Game (ゲームで非表示のアクタ)] を有効にします。
デザインを向上
最初の部屋といくつかの廊下から始めました引き続き作成します。
このチュートリアルの残りの部分を完了するには、ブロックアウトに次の要素を含めることをおすすめします。
プレイヤーが 3 つの異なるキー型を集め、それぞれのキーに一致する扉のロックを解除できるエリアです。
床のスイッチで無効にできるトラップの迷路を配置するエリアです。
一連の移動するプラットフォームを横切るエリアです
NPC 敵と戦うためのエリア
それだけでなく、想像力を駆使して、実験やイテレートを行うこともできます。 これがグレーボックスの優れている点です。
ビルドする際には、さらにいくつかの設計原則を考慮する必要があります。
障害物とオクルージョン
機能的な障害物を忘れずに取り入れてください。 たとえば、次のようになります。
明確な道をふさいでいるオブジェクト。プレイヤーにおもしろい迂回方法を見つけさせます。
視線を遮り、興味深いものを加える柱。
カバーを作成するオブジェクト。
プレイヤーに動作の一部 (ジャンプ、しゃがみ、ほこりなど) を教えるジオメトリ。
以下は、高さの変化とオクルージョンを伴うブロックアウトされた部屋の例です。
レベル フローとガイドライン
レベル内のプレイヤー パスのリズムとペースについて検討します。 プレイヤーは自然に次のエリアに導かれているでしょうか? 緊張感のあるひとときや、落ち着いたひとときはありますか? プレイヤーはいくつかの選択肢があると感じられますか?
ガイドラインやコントラストを使用することで、プレイヤーが知らない間に興味のある領域に誘導することができます。 プレイヤーがこれらの要素に沿って、またはこれらの要素に向かって自然に描画されるため、ワールドを直感的に感じさせることができます。
たとえば、次のようになります。
ケーブル、パイプ、フェンス、手すり、小道に沿って、これらのエッジに沿ってプレイヤーの視線を誘導します。
光源または対照的なビジュアルがプレイヤーの注意を引きます。
次のエリアを縁取るランドマークや出入口のビューは、プレイヤーをその方向に引き付けます。
プレイヤーがこの部屋に入ると、窓に向かって壁沿いに描画され、プレイヤーを出口に向けます。
空間をデザインするとき、空間がどのように横断するかを検討します。 たとえば、このチュートリアルでは、プレイヤーが特定の目標を完了した後に最初の部屋に戻る必要がある、ハブ アンド スポーク スタイルの空間を作成します。 プレイヤーは何度もこの廊下を通る必要があるため、この廊下は長くなりすぎないようにする必要があります。
形状言語
さまざまな形状を使用することで、開発のブロックアウト段階でもプレイヤーに感情や機能を伝えることができます。
丸みを帯びたコーナーやカーブは自然性や安全性を示唆しているため、これらの形状は休息場所や回復場所に適しています。
正方形やボックス型のエリアは、人工的で安定していて整然とされている感じがします。
三角、ギザギザ、とげとげの領域は危険を感じさせます。 このような空間では、罠や敵が近くにいることをプレイヤーに無音で警告できます。
背の高い、または広大な空間では力を呼び起こしますが、閉所恐怖症のような雑然とした空間では緊張感や不快感を生じさせます。
たとえば、このチュートリアルの後のセクションでは、プレイヤーが上に落ちた場合にダメージを与える罠を設計します。 プレイヤーはスパイクと危険を関連させるため、このデザインではこの障害物を避ける必要があることをプレイヤーに伝えるためにこの形状言語を利用しています。
ブロックアウト例
こちらがチュートリアルで使用する空間です。 それに合わせることもできますし 完全に独自のものをデザインすることもできます。
このチュートリアルの手順で特定の部屋を参照できるように、全ての部屋には番号が付いています。
部屋は、ますます複雑になることを示すようにビルドされています。
Start Room はプレイヤーがスタートする場所です。 Start Room につながる小さいスポーン エリアも追加しました。
部屋 2 は平面で、廊下に基本的な L 字型の曲げがあります。
部屋 1 では、さまざまなパス、オクルージョン、高さの変化を特徴とする湾曲した廊下によって複雑さが増します。
部屋 3 では、一人称視点テンプレートに含まれている基本的なシェイプで作成できるものの可能性を最大限に示すデモが行われています。 床と壁に詳細レベルを加え、ゲームのアート スタイルに影響を与え、アーティストが空間に入れる要素を想像するのに役立ちます。
部屋 1 と 2 のブロックアウト スタイルは、通常、レベルのデザイン時に目指しているディテールです。
Hallway 3 と Room 3 には、[Content (コンテンツ)] > [LevelPrototyping] > [Interactable (インタラクト可能)] > [Door (ドア)] > [Assets (アセット)] > [Mesh (メッシュ)] にある BP_DoorFrame のメッシュも使用します。
サンプル レベルを試す
このチュートリアル用に作成したサンプルのブロックアウトを使用したい場合は、以下のスニペットを使用してください。 これは、このサンプルの作成に使用した全てのブロックアウト メッシュのテキスト バージョンです。 このテキストをレベル エディタにコピーして貼り付けると、Unreal Engine によってレベル オブジェクトに変換されます。
Begin Map
Begin Level
Begin Actor Class=/Game/LevelPrototyping/Interactable/Door/BP_DoorFrame.BP_DoorFrame_C Name=BP_DoorFrame_C_4 Archetype="/Game/LevelPrototyping/Interactable/Door/BP_DoorFrame.BP_DoorFrame_C'/Game/LevelPrototyping/Interactable/Door/BP_DoorFrame.Default__BP_DoorFrame_C'" ExportPath="/Game/LevelPrototyping/Interactable/Door/BP_DoorFrame.BP_DoorFrame_C'/Temp/Untitled_1.Untitled_1:PersistentLevel.BP_DoorFrame_C_4'"
Begin Object Class=/Script/Engine.SceneComponent Name="DefaultSceneRoot" Archetype="/Script/Engine.SceneComponent'/Game/LevelPrototyping/Interactable/Door/BP_DoorFrame.BP_DoorFrame_C:DefaultSceneRoot_GEN_VARIABLE'" ExportPath="/Script/Engine.SceneComponent'/Temp/Untitled_1.Untitled_1:PersistentLevel.BP_DoorFrame_C_4.DefaultSceneRoot'"
End Object
Begin Object Class=/Script/Engine.BoxComponent Name="Box" Archetype="/Script/Engine.BoxComponent'/Game/LevelPrototyping/Interactable/Door/BP_DoorFrame.BP_DoorFrame_C:Box_GEN_VARIABLE'" ExportPath="/Script/Engine.BoxComponent'/Temp/Untitled_1.Untitled_1:PersistentLevel.BP_DoorFrame_C_4.Box'"
Begin Object Class=/Script/Engine.BodySetup Name="BodySetup_0" Archetype="/Script/Engine.BodySetup'/Game/LevelPrototyping/Interactable/Door/BP_DoorFrame.BP_DoorFrame_C:Box_GEN_VARIABLE.BodySetup_0'" ExportPath="/Script/Engine.BodySetup'/Temp/Untitled_1.Untitled_1:PersistentLevel.BP_DoorFrame_C_4.Box.BodySetup_0'"
End Object
End Object
Begin Object Class=/Script/Engine.TimelineComponent Name="Door Control" ExportPath="/Script/Engine.TimelineComponent'/Temp/Untitled_1.Untitled_1:PersistentLevel.BP_DoorFrame_C_4.Door Control'"
Begin Map
Begin Level
Begin Actor Class=/Script/Engine.ExponentialHeightFog Name=ExponentialHeightFog_0 Archetype="/Script/Engine.ExponentialHeightFog'/Script/Engine.Default__ExponentialHeightFog'" ExportPath="/Script/Engine.ExponentialHeightFog'/Temp/Untitled_1.Untitled_1:PersistentLevel.ExponentialHeightFog_0'"
Begin Object Class=/Script/Engine.BillboardComponent Name="Sprite" Archetype="/Script/Engine.BillboardComponent'/Script/Engine.Default__ExponentialHeightFog:Sprite'" ExportPath="/Script/Engine.BillboardComponent'/Temp/Untitled_1.Untitled_1:PersistentLevel.ExponentialHeightFog_0.Sprite'"
End Object
Begin Object Class=/Script/Engine.ExponentialHeightFogComponent Name="HeightFogComponent0" Archetype="/Script/Engine.ExponentialHeightFogComponent'/Script/Engine.Default__ExponentialHeightFog:HeightFogComponent0'" ExportPath="/Script/Engine.ExponentialHeightFogComponent'/Temp/Untitled_1.Untitled_1:PersistentLevel.ExponentialHeightFog_0.HeightFogComponent0'"
End Object
Begin Object Name="Sprite" ExportPath="/Script/Engine.BillboardComponent'/Temp/Untitled_1.Untitled_1:PersistentLevel.ExponentialHeightFog_0.Sprite'"
AttachParent="HeightFogComponent0"
End Object
Begin Map
Begin Level
Begin Actor Class=/Script/Engine.StaticMeshActor Name=Floor_90 Archetype="/Script/Engine.StaticMeshActor'/Script/Engine.Default__StaticMeshActor'" ExportPath="/Script/Engine.StaticMeshActor'/Temp/Untitled_1.Untitled_1:PersistentLevel.Floor_90'"
Begin Object Class=/Script/Engine.StaticMeshComponent Name="StaticMeshComponent0" Archetype="/Script/Engine.StaticMeshComponent'/Script/Engine.Default__StaticMeshActor:StaticMeshComponent0'" ExportPath="/Script/Engine.StaticMeshComponent'/Temp/Untitled_1.Untitled_1:PersistentLevel.Floor_90.StaticMeshComponent0'"
End Object
Begin Object Name="StaticMeshComponent0" ExportPath="/Script/Engine.StaticMeshComponent'/Temp/Untitled_1.Untitled_1:PersistentLevel.Floor_90.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
Begin Map
Begin Level
Begin Actor Class=/Script/Engine.StaticMeshActor Name=StaticMeshActor_911 Archetype="/Script/Engine.StaticMeshActor'/Script/Engine.Default__StaticMeshActor'" ExportPath="/Script/Engine.StaticMeshActor'/Game/AdventureGame/deleteme.deleteme:PersistentLevel.StaticMeshActor_911'"
Begin Object Class=/Script/Engine.StaticMeshComponent Name="StaticMeshComponent0" Archetype="/Script/Engine.StaticMeshComponent'/Script/Engine.Default__StaticMeshActor:StaticMeshComponent0'" ExportPath="/Script/Engine.StaticMeshComponent'/Game/AdventureGame/deleteme.deleteme:PersistentLevel.StaticMeshActor_911.StaticMeshComponent0'"
End Object
Begin Object Name="StaticMeshComponent0" ExportPath="/Script/Engine.StaticMeshComponent'/Game/AdventureGame/deleteme.deleteme:PersistentLevel.StaticMeshActor_911.StaticMeshComponent0'"
StaticMesh="/Script/Engine.StaticMesh'/Game/LevelPrototyping/Meshes/SM_Cylinder.SM_Cylinder'"
StaticMeshImportVersion=1
StaticMeshDerivedDataKey="STATICMESH_FD1BFC73B5510AD60DFC65F62C1E933E_228332BAE0224DD294E232B87D83948FQuadricMeshReduction_V2$2e1_6D3AF6A2$2d5FD0$2d469B$2dB0D8$2dB6D9979EE5D2_CONSTRAINED0_100100000000000000000000000100000000000080FFFFFFFFFFFFFFFFFFFFFFFF000000000000803F00000000000000803F0000803F00000000000000003D19FC1626C9B2485E57DB4B8EC731318B8215AE8D46FAD400000000010000000100000000000000010000000100000000000000000000000100000001000000400000000000000001000000000000000000F03F000000000000F03F000000000000F03F0000803F00000000050000004E6F6E65000C00000030000000803FFFFFFFFF0000803FFFFFFFFF0000000000000041000000000000A0420303030000000000000000_RT00_0"
RelativeLocation=(X=-2790.000000,Y=-1610.000000,Z=-0.499892)
このブロックアウトの例を空のレベルにコピーするには、次の手順を実行します。
新しい、基本タイプのレベルで、Floor メッシュと PlayerStart メッシュを削除し、ライティング レベル オブジェクトのみを含むレベルを作成します。
[Copy Full Snippet (フルスニペットをコピー)] をクリックします。
Unreal Editor で、ビューポートまたはアウトライナーが有効な パネル であることを確認し、(ビューポートまたはアウトライナー内の任意の場所をクリックしてから Esc キーを押す)し、Ctrl + V を押します。
全ての部屋と廊下に対して繰り返してください。
アウトライナーでは、全てのメッシュがそれぞれの部屋と廊下にちなんだ名前のフォルダに整理されているのがわかります。
サンプル レベルでは、アウトライナーの多くのオブジェクトに命名規則を使用しています。 レベル プロトタイプ作成メッシュは、用途に応じて次のように変更されます。
壁は
SM_Wallという名前列名は
SM_ColumnとSM_QuarterColumn
これらの命名規則を使用してオブジェクトの名前を変更する場合は、アウトライナーでメッシュのグループを選択し、選択した対象を右クリックして、[Edit (編集)] > [Rename Selected Actors (選択したアクタの名前を変更)] を選択します。 アウトライナーの操作の詳細については、アウトライナーのドキュメントを参照してください。
次の内容
レベルを作成したら、次はゲームプレイ要素を追加します。 次のセクションでは、Unreal Engine におけるブループリント ビジュアル スクリプティングの概要を説明し、ゲームプレイ ロジックをブループリント レベル オブジェクトにビルドする方法を学びます。
このチュートリアル シリーズの次のドキュメントでは、Unreal Engine のビジュアル スクリプト言語である、ブループリントの使用方法について説明します。 ブループリントが初めてで、ブループリントを利用してゲームロジックをプログラミングする方法を知りたい場合は、「ブループリントの基礎」ドキュメントを参照してください。
ブループリントの操作に慣れている場合は、「キーの作成」チュートリアルに進みます。
キーの作成
ブループリントを使用して、プレイヤーがピックアップできるキーの作成方法について説明します。