ゲームエンジン Unreal Engine 5 の基本機能
【目次】
1. 用語
1.1 3次元空間の基本概念
3次元座標系
3次元座標系は、XYZ軸による3次元直交座標系であり、3D空間内の位置を表現する。Unreal Engineでは、X軸が前後(正方向が前方)、Y軸が左右(正方向が右方)、Z軸が上下(正方向が上方)を表す。点(2,3,1)は前方に2、右方に3、上方に1の位置を示す。座標系には左手座標系と右手座標系がある(左手座標系は、左手の親指をX軸、人差し指をY軸、中指をZ軸の正方向に向けたときの配置で定義される)。Unreal Engineは左手座標系をデフォルトとして採用する。ワールド座標系は空間全体の基準となる座標系であり、ローカル座標系はオブジェクトごとの基準となる座標系である。
ベクトル
ベクトル(Vector)は、3D空間内の位置、または方向と大きさを表現する。位置と方向の表現により、Set Actor Location関数による位置設定などの3D空間での操作を行える。点の減算によりベクトルが得られ、点にベクトルを加算することで新しい点が得られる。Vector(1,0,0)はX方向の単位ベクトルを表す。
1.2 レベル構造
レベル階層構造
レベル階層構造は、3D空間内のオブジェクトの階層構造を管理するツリー構造のデータ構造である。レベル内のアクターとコンポーネントの集合として表現され、座標変換や属性の継承を行う。親の移動が子に影響し、子の移動は親に影響しない。Spawn Actor from Class関数で親アクターを作成し、Attach Actor To関数で子アクターを接続することで階層を構築する。
アクター
アクターは、レベル内のオブジェクトの基本クラスである。階層構造の中でオブジェクトへの参照を表し、Attach Actor To関数で階層構造を構築し、Get Attached Actors関数でアクターの親子関係を取得する。ワールドアウトライナーにはすべてのアクターが表示される。
1.3 3Dモデルの構成要素
メッシュ
メッシュは、3Dモデルを構成する頂点、辺、面の集合である。ポリゴンの集合により形状を表現し、テクスチャやマテリアルなどの表面属性を持つ。
ジオメトリ
ジオメトリは、3D空間内の形状データを表現する要素である。点、線、面で構成され、頂点座標、法線ベクトル、テクスチャ座標などの属性を持つ。スタティックメッシュエディタで形状を定義し、レンダリングパイプラインで処理される。
頂点
頂点は、3D空間内の点を表す要素であり、位置座標(x,y,z)を持つ。法線ベクトル、色、テクスチャ座標などの付加的な属性を持ち、頂点シェーダで処理される。
ポリゴン
ポリゴンは、3つ以上の頂点で構成される面であり、3Dモデルの表面を形成する要素である。基本的なポリゴンは三角形である。テクスチャマッピングにおいても使用される。
法線ベクトル
法線ベクトルは、面や頂点の向きを示す単位ベクトル(長さが1のベクトル)である。光の反射計算に利用される。法線ベクトルの向きは、面の表裏を判定する基準となる。スムーズシェーディングやノーマルマッピングなどの表現にも使用される。マテリアルエディタではNormalノードで法線を設定する。
テクスチャ
テクスチャは、3Dモデルの表面に貼り付ける画像データである。色や凹凸などの表現に用いられ、アルベド、ラフネス、メタリック、ノーマルマップなど複数のテクスチャを組み合わせる。
1.4 カメラと視点
カメラ
カメラは、3D空間内の視点を表現し、3D空間からスクリーン座標への変換を制御する。位置、向き、視野角のパラメータを持ち、透視投影または平行投影を指定できる。Set Actor Location関数で位置を設定し、Set Actor Rotation関数で視線方向を設定する。
視野角
視野角は、カメラが捉える視界の広さを角度で表現するパラメータである。値が大きいほど広い範囲が表示されるが、画面の歪みも大きくなる。Set Field of Viewノードで設定する。
回転表現
回転表現は、ヨー、ピッチ、ロールの3つの角度で物体の向きを表現する方法である。ヨーはZ軸周りの回転、ピッチはY軸周りの回転、ロールはX軸周りの回転を表す。Make Rotatorノードでヨー、ピッチ、ロールの値を設定し、Set Actor Rotationノードで向きを設定する。ピッチ角が±90度に達するとジンバルロック(回転の自由度が失われる現象)が発生するため、ピッチ角の範囲を±90度未満に制限する。
1.5 照明と影
ライティング
ライティングは、3D空間内の光源と照明効果を制御するシステムである。ディレクショナルライト、ポイントライト、スポットライト、スカイライトなどの光源を組み合わせ、Set Intensityノードで強度を設定する。
光源の種類
3D空間を照らす光源には複数の種類がある。スカイライト(Sky Light)は空からの環境光を表現し、シーン全体に光を与える。ディレクショナルライト(Directional Light)は太陽光のような平行光線を生成する。ポイントライト(Point Light)は点から全方向に広がる光を表現し、スポットライト(Spot Light)は円錐状の光を表現する。
シャドウマッピング
シャドウマッピングは、光源から見たシーンの深度情報を記録し、3D空間内のオブジェクトに影を付与する技術である。処理は2段階で行われる。第1段階では、光源の位置にカメラを配置し、シーンを描画して各ピクセルの深度情報をシャドウマップとして記録する。第2段階では、通常のカメラ視点から描画する際に、描画中のピクセルの光源からの距離を計算し、シャドウマップに記録された深度値と比較する。ピクセルの距離がシャドウマップの深度値より大きい場合、そのピクセルは他のオブジェクトによって遮られており、影の中にあると判定される。
深度バッファ
深度バッファは、各ピクセルの奥行き情報を保持するメモリ領域である。オブジェクトの前後関係を表現するために使用され、隠面消去(見えない部分の除去)を実現する。シャドウマッピングなどの基礎となる。
1.6 レンダリングと入力処理
レンダリング
レンダリングは、3D空間のデータを2D画像として描画する処理である。モデリングデータの変換、光源計算、テクスチャマッピング、ピクセル処理など複数の段階を経て最終的な画像を生成する。
キーボード/マウス入力
キーボード/マウス入力は、ユーザーからの操作を検出し処理する。キーの押下、保持、解放を区別し、マウスは位置と移動量を検出する。Unreal Engine 5ではEnhanced Input Systemを用い、Input Actionアセットと Input Mapping Contextを使用してキーや操作にアクションを割り当てる(例:スペースキーにジャンプアクションを割り当てる)。入力検出時に対応するイベントノードが実行され、ノードシーケンスで処理を実行する。
ティック管理
ティック管理は、定期実行や遅延実行の管理を行う。Event Tickノードで定期実行処理を登録し、Delta Secondsピンでフレーム間の経過時間を取得する。ゲームループ(入力処理、状態更新、描画の繰り返し)の実装や時間に基づく処理の制御に用いる。
2. Unreal Engine 5による3次元ゲーム開発の基礎
2.1 座標系の基本操作
3次元空間での位置指定
3次元空間での位置指定は、XYZ軸による3次元直交座標系で行う。X軸は前後、Y軸は左右、Z軸は上下を表す。点(2,3,1)は前方に2、右方に3、上方に1の位置を示す。座標系にはワールド座標系とローカル座標系がある。
左手座標系
左手座標系は、左手の親指(X)、人差し指(Y)、中指(Z)を直角に交差させた配置で表現される座標系である。Unreal Engineは左手座標系をデフォルトとして採用する。回転方向や法線の判定は、座標系の定義に基づいて処理する。
ベクトルと点の違い
点は位置(2,3,1)を表し、ベクトルは方向と大きさを表す。点の減算によりベクトルが得られ、点にベクトルを加算することで新しい点が得られる。ベクトルの加減算や内積・外積の演算を3D空間の計算に用いる。
オブジェクトの配置と移動
オブジェクトの配置と移動を実装する手順を以下に示す。
- Make Vectorノードを配置し、X=0, Y=0, Z=0に設定
- Make Vectorノードの出力をSet Actor Locationノードの「New Location」ピンに接続
- Make Rotatorノードを配置し、Yaw=0, Pitch=0, Roll=0に設定
- Make Rotatorノードの出力をSet Actor Rotationノードの「New Rotation」ピンに接続
- Set Actor Scale 3Dノードを配置し、「New Scale 3D」入力に(1.0, 1.0, 1.0)を設定
レベルにキューブアクターを配置し、上記のブループリントをキューブアクターのEvent BeginPlayイベントに接続する。実行するとキューブが原点(0,0,0)に配置され、回転なし、スケール1.0となる。
相対移動
相対移動を実装する手順を以下に示す。
- Get Actor Locationノードを配置
- Make Vectorノードを配置し、X=1, Y=0, Z=0に設定
- 両ノードの出力をVector+Vectorノードに接続
- その結果をSet Actor Locationノードの「New Location」ピンに接続
- Set Actor Locationノードの「Sweep」をFalseに設定(Sweepは移動経路上の衝突判定を行うオプション)
キューブアクターに適用し実行すると、キューブがX軸方向に1単位移動する。
2.2 レベル管理の基本
木構造によるデータ構造
木構造は、親ノードと子ノードの階層関係を表現するデータ構造である。3D空間では親の移動が子に影響し、子の移動は親に影響しない。アニメーションやオブジェクトのグループ化に利用する。キャラクターの骨格構造も木構造で表現する。
階層構造の概念
階層構造は、オブジェクト間の親子関係を管理する仕組みである(例:車体とタイヤ、腕と手の関係)。
3Dモデルのファイル形式
3Dモデルのファイル形式には、FBX、OBJなどがある。形状、材質、テクスチャ、アニメーションなどの情報を含む。
ノードの階層構造
ノードの階層構造を構築する手順を以下に示す。
- Spawn Actor from ClassノードをEvent BeginPlayの後に配置し、Class欄でCubeアクターを選択
- Spawn Actor from Classノードの「Return Value」出力ピンを変数「parent」に保存
- 別のSpawn Actor from ClassノードをSequence経由で配置し、Class欄でCubeアクターを選択
- 2つ目のSpawn Actor from Classノードの「Return Value」出力ピンを変数「child」に保存
- Attach Actor Toノードを配置し、「Target」に「child」、「Parent」に「parent」を接続
- Make Vectorノードを配置し、X=1, Y=0, Z=0に設定
- 「child」変数を取得してSet Relative Locationノードに接続し、「New Location」にMake Vectorノードの出力を接続
実行後に親キューブを移動させると、子キューブも一緒に移動する。
モデルの読み込みと配置
モデルの読み込みと配置を実装する手順を以下に示す。
- Add Componentノードを配置してStatic Mesh Componentを追加
- コンテンツブラウザからStaticMeshアセットをノードの「Static Mesh」入力ピンにドラッグ&ドロップ
- Attach to Componentノードで親コンポーネントにアタッチ
- Set Relative Locationノードでコンポーネントの位置を設定
実行後にメッシュが指定位置に表示される。
2.3 カメラ制御の基本
視点と注視点の概念
視点は観察者の位置、注視点は見つめる対象の位置を表す。この2点で視線方向が決定する。
視野角とクリッピング面
視野角は、カメラが捉える視界の広さを角度で表現するパラメータである。クリッピング面は表示距離の範囲を定義し、近接面と遠方面で設定する。
カメラの初期設定
カメラの初期設定を行う手順を以下に示す。
- Camera Actorをレベルに配置、またはSpawn Actor from Classノードでスポーン
- Make Vectorノードを配置し、X=-10, Y=0, Z=3に設定してカメラ位置とする
- Make Vectorノードの出力をSet Actor Locationノードの「New Location」ピンに接続
- 別のMake Vectorノードを配置し、X=0, Y=0, Z=0に設定して注視点とする
- カメラのGet Actor Locationノードとステップ4のMake Vectorノードの出力をFind Look at Rotationノードに接続
- Find Look at Rotationノードの出力をSet Actor Rotationノードに接続
- Set Field of Viewノードを配置し、視野角の値を設定
ゲームを実行し、カメラアクターが原点(0,0,0)を見るように配置され、設定した視野角で表示されることを確認する。
マウスによる視点回転
マウスによる視点回転を実装する手順を以下に示す。
- Event Tickノードを配置
- Get Mouse Deltaノードを配置してX,Y移動量を取得
- Get Actor Rotationノードを配置してカメラの現在の回転を取得
- Break Rotatorノードを配置してYaw、Pitch、Rollに分解
- Get Mouse DeltaのX出力に感度係数を乗算し、現在のYaw値に加算
- Get Mouse DeltaのY出力に感度係数を乗算し、現在のPitch値に加算
- ClampノードでPitch値を±90度未満の範囲に制限
- Make Rotatorノードで新しいYaw、Pitch、Roll値を組み立て、Set Actor Rotationノードに接続
ピッチ角を±90度未満に制限する理由は、ジンバルロックを回避するためである。ゲーム実行中にマウスを動かすと、水平方向の動きでカメラが水平回転し、垂直方向の動きで設定した範囲内でカメラが垂直回転することを確認する。
2.4 ライティングの基本
光の基本特性
光の特性として、直進、反射、屈折、減衰を考慮する。光源からの距離による減衰や物体表面での反射特性を再現する。色はRGB値で表現し、各成分は0から1の範囲である。
拡散反射と鏡面反射
拡散反射は光を全方向に均等に反射する反射である。鏡面反射は特定方向への反射である。物理ベースレンダリング(PBR)では、これらの反射特性を物理法則に基づいて再現する。マテリアルのプロパティで反射特性を制御し、メタリックパラメータは物体が金属かどうかを、ラフネスパラメータは表面の粗さを0から1の値で表現する。
光源の種類
3D空間を照らす光源には複数の種類がある。スカイライトは空からの環境光をシーン全体に与える。ディレクショナルライトは太陽光のような平行光線を生成する。ポイントライトは点から全方向に広がる光、スポットライトは円錐状の光を表現する。
光源の設定
光源を設定する手順を以下に示す。
- Sky Lightアクターをレベルに配置
- 「Light」カテゴリの「Intensity」プロパティを0.2に設定
- 「Light」カテゴリの「Light Color」プロパティをRGBで(0.2, 0.2, 0.2)に設定
- Directional Lightアクターをレベルに配置
- 「Light」カテゴリの「Intensity」プロパティを1.0に設定
- 「Light」カテゴリの「Light Color」プロパティをRGBで(1, 1, 1)に設定
ブループリントで操作する場合の手順を以下に示す。
- Spawn Actor from Classノードを配置し、Class欄でSky Lightアクターを選択
- Spawn Actor from Classノードの「Return Value」出力ピンからSet Intensityノードに接続し、値を0.2に設定
- Set Light Colorノードに接続し、RGBで(0.2, 0.2, 0.2)に設定
- 別のSpawn Actor from Classノードを配置し、Class欄でDirectional Lightアクターを選択
- Spawn Actor from Classノードの「Return Value」出力ピンからSet Intensityノードに接続し、値を1.0に設定
- Set Light Colorノードに接続し、RGBで(1, 1, 1)に設定
シーンにオブジェクトを配置し、Sky Lightの強度を変更すると環境光の明るさが変化し、Directional Lightの回転を変えると影の方向が変わることを確認する。
2.5 入力処理の基本
イベント駆動プログラミング
イベント駆動プログラミングは、キー入力やマウス操作をイベントとして検出し、対応する処理を実行する方式である。Unreal Engineのイベントシステムは、入力を検出すると対応するイベントノードを呼び出す。
キーボード/マウス入力の仕組み
キーボード/マウス入力では、キーの押下、保持、解放を区別する。マウスは位置と移動量を検出する。相対モードではカーソルを中心に固定し、移動量のみを使用する。
入力状態管理
入力状態管理では、現在の入力状態をフラグや数値で保持する。これによりキーの同時押しに対応し、入力履歴の管理により連続入力にも対応する。
キー入力の設定
キー入力を設定する手順を以下に示す(Unreal Engine 5ではEnhanced Input Systemを使用する)。
- コンテンツブラウザで「Input Action」アセット(IA_Jump、IA_Quit)を作成
- 「Input Mapping Context」アセット(IMC_Default)を作成し、IA_Jumpに「Space」キー、IA_Quitに「Escape」キーをマッピング
- プレイヤーコントローラまたはPawnのブループリントでEnhanced Input Local Player Subsystemを取得し、Add Mapping Contextノードでマッピングコンテキストを追加
- 「EnhancedInputAction IA_Jump」イベントノードを配置し、Triggered出力をジャンプ処理に接続
- 「EnhancedInputAction IA_Quit」イベントノードを配置し、Triggered出力をQuit Game関数に接続
ゲーム実行中にスペースキーを押すとジャンプイベントが発火し、Escapeキーを押すとゲームが終了することを確認する。
キー状態の管理
キー状態を管理する手順を以下に示す。
- ブループリント内で「W Pressed」と「A Pressed」のブール変数を作成
- Event BeginPlayノードから各変数をFalseに初期化
- IA_MoveW、IA_MoveAの各Input Actionアセットを作成しIMCにマッピング
- 「EnhancedInputAction IA_MoveW」イベントノードを配置し、Started出力から「W Pressed」をTrueに、Completed出力から「W Pressed」をFalseに設定
- IA_MoveAについても同様に設定
ゲーム実行中にPrint Stringノードで「W Pressed」「A Pressed」変数の値を表示させ、キーを押すとTrue、離すとFalseになることを確認する。
2.6 ティック管理の基本
ゲームループ
ゲームループは、入力処理、状態更新、描画を繰り返す処理である。フレームレートの制御と時間管理を行い、固定時間ステップと可変時間ステップを用途に応じて使い分ける。
フレームレートと時間管理
フレームレートは1秒あたりの画面更新回数である。60FPSの場合、1フレームあたりの時間は$$\frac{1}{60}$$秒となる。処理負荷による変動を考慮し、前フレームからの経過時間であるDelta Secondsに基づいて動きを調整する。垂直同期によりティアリングを防止する。
タスクスケジューリング
タスクスケジューリングでは、定期実行や遅延実行の管理を行い、優先度により実行順序を制御する。
定期実行タスクの登録
定期実行タスクを登録する手順を以下に示す。
- Event Tickノードを配置
- Event TickノードのDelta Secondsピンを変数に保存または直接使用
- UpdateGameという関数を作成
- Event Tickノードの実行ピンをUpdateGame関数に接続
- UpdateGame関数内でDelta Seconds値を用いてキャラクター移動量などを計算
Print StringノードでDelta Secondsの値を表示する。60FPSの場合、Delta Secondsは$$\frac{1}{60}$$秒となる。オブジェクトを一定速度で移動させる場合、$$\text{移動距離} = \text{速度} \times \text{Delta Seconds}$$の関係式を用いる。
2.7 シャドウマッピングの基本
シャドウマッピングの原理
シャドウマッピングは、光源から見たシーンの深度情報をもとに、3D空間内のオブジェクトに影を付与する技術である。処理は2段階で行われる。第1段階では、光源の位置にカメラを配置し、シーンを描画して各ピクセルの深度情報をシャドウマップとして記録する。第2段階では、通常のカメラ視点から描画する際に、描画中のピクセルの光源からの距離を計算し、シャドウマップに記録された深度値と比較する。ピクセルの距離がシャドウマップの深度値より大きい場合、そのピクセルは他のオブジェクトによって遮られており、影の中にあると判定される。
アーティファクトと対策
シャドウマッピングでは、シャドウアクネ、エイリアシングなどの問題が発生する。シャドウアクネは、深度バッファの精度不足により本来影にならない部分に斑点状の影が現れる現象であり、バイアス値の調整により軽減できる。エイリアシングは、シャドウマップの解像度不足により影の境界にジャギーが現れる現象であり、PCF(Percentage Closer Filtering)やカスケードシャドウマップで対策する。
シャドウマップの設定
シャドウマップを設定する手順を以下に示す。
- Directional Lightアクターをレベルに配置
- 「Light」カテゴリの「Cast Shadows」をTrueに設定
- 「Light」カテゴリの「Shadow Resolution Scale」を1.0に設定
- 「Cascaded Shadow Maps」セクションの「Dynamic Shadow Distance MovableLight」を設定
- 「Cascaded Shadow Maps」セクションの「Num Dynamic Shadow Cascades」を設定
ブループリントでシャドウ設定を変更する場合は、Directional Lightアクターへの参照を取得し、Set Cast ShadowsノードをTrueに設定し、Set Shadow Resolution Scaleノードを1.0に設定する。光源の位置や角度を変更したときに影の位置や形が変わることを確認する。Shadow Resolution Scaleの値を下げると影の解像度が低下することも確認する。