ゲームエンジン Unreal Engine 5 の基本機能

【概要】 ゲームエンジンUnreal Engine 5の主な機能として,レベル階層構造,カメラシステム,ライティング,シャドウシステムがある.レベル階層構造はツリー構造のデータ構造で,3D空間内のオブジェクトを階層的に管理し,親アクターの変形が子アクターやコンポーネントに継承される特性がある.カメラはビューポートを通した視点を表現し,位置・向き・視野角の設定により,3D空間からスクリーン座標への変換を制御する.ライティングはアンビエントライト・ディレクショナルライト・ポイントライトなどの光源を組み合わせて,リアルな光の表現を可能にする.シャドウマッピングは光源からの深度情報を利用して影を生成する技術である.これらの技術要素を組み合わせることで,高品質で臨場感のある3D表現を実現できる.

【目次】

  1. 概要
  2. 用語
    1. 3次元空間の基本概念
    2. レベル構造
    3. 3Dモデルの構成要素
    4. カメラと視点
    5. 照明と影
    6. レンダリングと入力処理
  3. Unreal Engine 5による3次元ゲーム開発の基礎
    1. 座標系の基本操作
    2. レベル管理の基本
    3. カメラ制御の基本
    4. ライティングの基本
    5. 入力処理の基本
    6. ティック管理の基本
    7. シャドウマッピングの基本

概要

1. 用語

1. 3次元空間の基本概念

3次元座標系

互いに垂直な3つの座標軸であるXYZ軸による3次元直交座標系で,3D空間内の位置を表現する基本的な仕組みである.X軸は左右,Y軸は前後,Z軸は上下を表し,点(2,3,1)は右に2,前に3,上に1の位置を示す.空間全体の基準となるワールド座標系とオブジェクトごとの基準となるローカル座標系があり,オブジェクトの配置と移動の基礎となる.

Vector

Vectorは3D空間内の位置や方向と大きさを持つ量であるベクトルを表現する.位置と方向を表現することで,Set Actor Location(Location Vector(0, 0, 0))のように位置設定などの3D空間での操作を行える.点の減算でベクトルを得られ,点にベクトルを加えて新しい点を得られる.Vector(1,0,0)はX方向への単位ベクトルを表す.

2. レベル構造

レベル階層構造 (Level Hierarchy)

3D空間内のオブジェクトの階層構造を管理するツリー構造のデータ構造である.レベル内のアクターとコンポーネントの集合として表現され,座標変換や属性の継承が可能である.親の移動が子に影響し,子の移動は親に影響しない特性を持つ.Spawn Actor from Class関数で親アクターを作成するなど,3D空間の管理と操作のための仕組みである.

アクター (Actor)

レベル内のオブジェクトの基本クラスである.階層構造の中でオブジェクトへの参照を表し,Attach Actor Toで階層構造を構築し,Get Attached Actorsでアクターの親子関係を取得する.3Dオブジェクトの配置や変形を制御するために有用である.ワールドアウトライナーではすべてのアクターが表示される.

3. 3Dモデルの構成要素

メッシュ (Mesh)

3Dモデルを構成する頂点,辺,面の集合である.3つ以上の頂点で構成される面であるポリゴンの集合によって形状を表現する.表面画像であるテクスチャや,物体の材質を定義するマテリアルなどの表面属性を持つ.3Dオブジェクトの見た目を決定する最も重要な要素の一つであり,複雑な形状の表現を可能にする.

ジオメトリ (Geometry)

3D空間内の形状データを表現する基本要素である.点,線,面などで構成され,頂点座標,面や頂点の向きを示す法線ベクトル,テクスチャ座標などの属性を持つ.スタティックメッシュエディタで形状定義が行われ,3D描画の処理であるレンダリングパイプラインで処理される.

頂点 (Vertex)

3D空間内の点を表す要素であり,位置座標(x,y,z)を持つ.法線ベクトル,色,テクスチャ座標などの付加的な属性を持ち,頂点シェーダで頂点データを処理できる.

ポリゴン (Polygon)

3つ以上の頂点で構成される面であり,3Dモデルの表面を形成するための要素である.最も基本的なポリゴンは三角形である.3D形状の表現の基礎であり,画像を面に貼り付けるテクスチャマッピングにおいても使用される.

法線ベクトル (Normal Vector)

面や頂点の向きを示す長さが1の単位ベクトルである.光の反射計算に利用される.法線ベクトルの向きは,面の表裏を判定する基準となる.滑らかな陰影表現であるスムーズシェーディングや凹凸表現のノーマルマッピングなどの表現にも使用され,3Dオブジェクトの光沢や陰影表現に役立つ.マテリアルエディタでNormalノードを使用して法線を設定する.

テクスチャ (Texture)

3Dモデルの表面に貼り付ける画像データである.色や凹凸などの詳細な表現を可能にし,アルベド(拡散反射),ラフネス,メタリック,ノーマルマップなど複数のテクスチャを組み合わせることでより豊かな表現が可能となる.リアルな表面表現を実現する技術である.

4. カメラと視点

カメラ (Camera)

3D空間内の視点を表現する.3D空間からスクリーン座標への変換を制御するために利用される.位置,向き,視野角などのパラメータを持ち,透視投影または平行投影の投影方式を指定できる.Set Actor Location(0, -10, 3)のようにSet Actor Locationで位置を設定し,Set Actor Rotationで視線方向を設定する.

視野角 (Field of View, FOV)

カメラが捉える視界の広さを角度で表現するパラメータである.値が大きいほど広い範囲が見えるが画面の歪みも大きくなる.一般的なゲームでは60度から90度の範囲で設定され,Set Field of Viewノードで80度に設定するなど,3D表現の重要な要素となる.

回転表現

ヨー(水平回転),ピッチ(縦回転),ロール(傾き)という3つの角度で物体の向きを表現する回転表現方法である.Make Rotatorノードとともにヨー,ピッチ,ロールの値を設定し,Set Actor Rotationノードで向きをリセットする.

5. 照明と影

ライティング (Lighting)

3D空間内の光源と照明効果を制御するシステムである.アンビエントライト(Ambient Light),ディレクショナルライト(Directional Light),ポイントライト,スポットライトなどの異なる種類の光源を組み合わせ,Set Intensity,Set Lightnessで強度を適用するなど,リアルな光の表現が可能となる.3D表現の質を決定する重要な要素である.

光源の種類

3D空間を照らす光源には複数の種類がある.Set Intensity(0.2)で暗めに設定できるアンビエントライト(Ambient Light)は空間全体を均一に照らし,ディレクショナルライト(Directional Light)は太陽光のような平行光線を生成する.また,Point Lightは点から全方向に広がる光,Spot Lightは円錐状の光を表現する.

シャドウマッピング (Shadow Mapping)

光源から見たシーンの深度情報を記録し,3D空間内のオブジェクトに影を付与する技術である.光源からの距離を計算し,オブジェクトによって光が遮られる部分を特定することで,リアルな影を表現する.Set Shadow Resolution(2048, 2048)で2048×2048の高解像度影を生成する.影は,3D表現に重要である.

デプスバッファ (Depth Buffer)

各ピクセルの奥行き情報を保持するメモリ領域である.オブジェクトの前後関係を表現するために使用され,Zバッファとも呼ばれる.見えない部分を除去する隠面消去の基本的なアルゴリズムを実現し,プロジェクト設定でDepth Buffer Bit Depthを24に設定することで24ビット精度の深度情報を設定する.シャドウマッピングなどの高度な表現技術の基礎となる.

6. レンダリングと入力処理

レンダリング (Rendering)

3D空間のデータを2D画像として描画する一連の処理過程である.モデリングデータの変換,光源計算,テクスチャマッピング,ピクセル処理など,複数の段階を経て最終的な画像を生成する.Auto Expose設定などで自動露出設定を行うなど,3Dグラフィックスの最終段階を構成する.

キーボード/マウス入力

ユーザーからの操作を検出し処理する.キーの押下,保持,解放を区別し,マウスは位置と移動量を検出する.Input Action Mappingでスペースキーにジャンプアクションを割り当てるなど,イベントディスパッチャーでイベントを登録し,イベント発生時に実行されるノードシーケンスで対応する処理を実行する.ユーザーとのインタラクションを実現する基盤である.

ティック管理

定期実行や遅延実行の管理を行う.Event Tickノードで定期実行処理を登録し,Delta Secondsピンでフレーム間の経過時間を取得する.入力処理,状態更新,描画の繰り返しであるゲームループの実装や時間に基づく処理の制御など,動的な3D環境の実現に必要不可欠な機能である.

3. Unreal Engine 5による3次元ゲーム開発の基礎

1. 座標系の基本操作

3次元空間での位置指定

XYZ軸による3次元直交座標系(互いに垂直な3つの座標軸)で位置を表現する.X軸は左右,Y軸は前後,Z軸は上下を表す.点(2,3,1)は右に2,前に3,上に1の位置を示す.ワールド座標系(空間全体の基準となる座標系)とローカル座標系(オブジェクトごとの基準となる座標系)の2種類がある.

左手座標系

親指(X),人差し指(Y),中指(Z)を直角に交差させた時の左手の形で表現される座標系である.Unreal Engineの標準的な座標系である.なお、一部の計算(外積など)では右手系の規則が使われることもあるため注意が必要である.回転方向や法線(面に垂直な方向)の判定では,座標系の違いによって処理が変わる.

ベクトルと点の違い

点は位置(2,3,1),ベクトルは方向と大きさを表す.点の減算でベクトルを得られ,点にベクトルを加えて新しい点を得られる.ベクトルの加減算や内積・外積の演算が3D空間の計算で重要である.

以下のブループリントブロックでは,3D空間内でのオブジェクトの配置と移動を制御する.Make Vectorノードによる位置指定,Set Actor Locationによる配置,Make Rotatorノードと共にSet Actor Rotationによる向きの設定,そしてSet Actor Scaleによるサイズ調整を示している.

オブジェクトの配置と移動

  1. Make Vectorノードを配置し、X=0, Y=0, Z=0に設定
  2. Make Vectorノードの出力をSet Actor Locationノードの「New Location」ピンに接続
  3. Make Rotatorノードを配置し、Yaw=0, Pitch=0, Roll=0に設定
  4. Make Rotatorノードの出力をSet Actor Rotationノードの「New Rotation」ピンに接続
  5. Set Actor Scaleノードを配置し、New Scale入力に1.0を設定

このブロック構成の正しさを確認するには、レベルにキューブアクターを配置し、上記のブループリントをキューブアクターのEvent Beginplayイベントに接続します。実行するとキューブが原点(0,0,0)に配置され、回転なし、スケール1.0となることを確認できます。

相対移動

  1. Get Actor Locationノードを配置
  2. Make Vectorノードを配置し、X=1, Y=0, Z=0に設定
  3. 両ノードの出力をVector+Vectorノードに接続
  4. その結果をSet Actor Locationノードの「New Location」ピンに接続
  5. Set Actor Locationノードの「World Space」チェックボックスを「True」に設定

ブロック構成の検証には、キューブアクターに適用し実行すると、キューブがX軸方向に1単位移動することを確認できます。

座標系のポイント

2. レベル管理の基本

木構造によるデータ構造

親ノードと子ノード(階層関係を持つデータ要素)の階層関係を表現する構造である.3D空間では親の移動が子に影響し,子の移動は親に影響しない特徴を持つ.アニメーション(動画表現)やオブジェクトのグループ化に利用する.キャラクターの骨格構造も木構造で表現する.

階層構造の概念

オブジェクト間の親子関係を管理する仕組みである.例えば,車体(親)とタイヤ(子),腕(親)と手(子)の関係がある.

3Dモデルのファイル形式

FBX,OBJ(これらは3次元モデルデータの標準形式である)などの形式で3Dモデルデータを保存する.形状,材質,テクスチャ(表面画像),アニメーションなどの情報を含む.

以下のブループリントブロックでは,レベル階層構造の構成要素として,2つのアクター parent と child の階層構造を設定し,3Dモデルをレベルに配置している.Spawn Actor from Classノードを用いて設定している.

ノードの階層構造

  1. Spawn Actor from ClassノードをEvent Beginplayの後に配置し、Class欄でCubeアクターを選択
  2. Spawn Actor from Classノードの「Return Value」出力ピンを変数「parent」に保存
  3. 別のSpawn Actor from ClassノードをSequence経由で配置し、Class欄でCubeアクターを選択
  4. 2つ目のSpawn Actor from Classノードの「Return Value」出力ピンを変数「child」に保存
  5. Attach Actor Toノードを配置し、「Target」に「child」、「Parent」に「parent」を接続
  6. Make Vectorノードを配置し、X=1, Y=0, Z=0に設定
  7. Make Vectorノードの出力を「child」変数とSet Relative Locationノードに接続

このブロック構成を検証するには、実行後に親キューブを移動させると、子キューブも一緒に移動することを確認します。子キューブは親から相対的にX方向に1単位離れた位置を維持します。

モデルの読み込みと配置

  1. Static Mesh Componentを追加するAdd Componentノードを配置
  2. コンテンツブラウザからStaticMeshアセットをノードの「Static Mesh」入力ピンにドラッグ&ドロップ
  3. Attach to Componentノードを使って、親コンポーネントにアタッチ
  4. Set Relative Locationノードでコンポーネントの位置を設定

このブロック構成の検証には、実行後にメッシュが指定位置に表示されることを確認します。

レベル管理のポイント

3. カメラ制御の基本

視点と注視点の概念

視点は観察者(カメラ)の位置,注視点は見つめる対象の位置を表す.この2点で視線方向が決定する.カメラワーク(視点移動)の基本である.TPS(三人称視点ゲーム)やFPS(一人称視点ゲーム)などの視点制御に利用される.

視野角(Field of View)とクリッピング面

視野角(Field of View)は,カメラが捉える視界の広さを角度で表現するパラメータである.クリッピング面(表示範囲を定める面)は表示距離の範囲を定義し,近接面と遠方面で設定する.

回転表現

3つの角度(ヨー(水平回転),ピッチ(縦回転),ロール(傾き))で物体の向きを表現する.特定の角度での回転制限に注意が必要である.

以下のブループリントブロックでは,カメラの初期設定と視点回転を設定している.Set Actor Locationによる位置設定,Find Look at Rotationノードによる注視点指定,Set Field of Viewによる視野角設定,そして視点回転の制限を実装している.

カメラの初期設定

  1. Camera Actorをレベルに配置または「Spawn Actor from Class」ノードでスポーン
  2. Make Vectorノードを配置し、X=0, Y=-10, Z=3に設定
  3. Make Vectorノードの出力をSet Actor Locationの「New Location」ピンに接続
  4. Make Vectorノードを別に配置し、X=0, Y=0, Z=0に設定(注視点)
  5. Get Actor Locationノードとステップ4のMake Vectorノードの出力をFind Look at Rotationノードに接続
  6. Find Look at Rotationノードの出力をSet Actor Rotationノードに接続
  7. Camera Actorの「Camera Settings」カテゴリで「Field of View」を80に設定

この構成を検証するには、ゲームを実行し、カメラアクターがシーンの(0,0,0)位置を見下ろすように配置され、視野角80度で表示されていることを確認します。

マウスによる視点回転

  1. Event Tickノードを配置
  2. Get Mouse Deltaノードを配置してX,Y移動量を取得
  3. Get Actor Rotationノードを配置してカメラの現在の回転を取得
  4. Make Rotatorノードを配置
  5. Get Mouse DeltaのXピンに感度係数(例:0.1)を乗算してBreak Rotatorの「Yaw」に接続
  6. Get Mouse DeltaのYピンに感度係数を乗算してBreak Rotatorの「Pitch」に接続
  7. Clampノードを使ってPitch値を-90〜90度に制限
  8. Make Rotatorノードの出力をSet Actor Rotationノードに接続

ブロック構成の検証には、ゲーム実行中にマウスを動かすと、水平方向の動きでカメラが水平回転し、垂直方向の動きで-90〜90度の範囲内でのみカメラが垂直回転することを確認します。

カメラ制御のポイント

4. ライティングの基本

光の基本特性

光の直進,反射,屈折,減衰の物理特性を考慮する.光源からの距離による減衰や物体表面での反射特性を再現する.色はRGB値(赤緑青の三原色)で表現し,各成分は0から1の範囲である.

拡散反射と鏡面反射

拡散反射(全方向への均等な反射)は光を全方向に均等に反射する.鏡面反射(特定方向への強い反射)は特定方向への強い反射である.マテリアル(材質)のプロパティでこれらを制御する.物理ベースレンダリング(PBR)では金属度と粗さで質感を表現する.

アンビエントライト(Ambient Light)とディレクショナルライト(Directional Light)

アンビエントライト(Ambient Light)は空間全体を均一に照らす光である.ディレクショナルライト(Directional Light)は太陽光のような平行光線である.スポットライト(円錐状の光)は円錐状に広がる光である.それぞれ色と強度を設定する.

以下のブループリントブロックでは,基本的なライティング(光源)を設定する.Ambient Lightによる環境光の設定,Directional Lightによる指向性光源の追加,光の色と強度の制御を実装している.

光源(ライティング)の設定

  1. Ambient Lightアクターをレベルに配置
  2. 「Light」カテゴリの「Intensity」プロパティを0.2に設定
  3. 「Light」カテゴリの「Light Color」プロパティをRGBで(0.2, 0.2, 0.2)に設定
  4. Directional Lightアクターをレベルに配置
  5. 「Light」カテゴリの「Intensity」プロパティを1.0に設定
  6. 「Light」カテゴリの「Light Color」プロパティをRGBで(1, 1, 1)に設定

ブループリントでこれらのライトを操作するには:

  1. Spawn Actor from Classノードを使ってAmbient LightアクターとDirectional Lightアクターを生成
  2. 各ライトアクターの「Set Intensity」ノードと「Set Light Color」ノードを使用して値を設定

検証には、シーンにいくつかのオブジェクトを配置し、Ambient Lightの強度を変更すると全体的な明るさが変化し、Directional Lightの回転を変えると影の方向が変わることを確認します。

ライティングのポイント

5. 入力処理の基本

イベント駆動プログラミング

キー入力やマウス操作をイベント(プログラム上の事象)として検出する.コールバック関数(イベント発生時に実行される処理の関数)で対応する処理を実行する.イベントキュー(処理待ち行列)で入力を管理する.

キーボード/マウス入力の仕組み

キーの押下,保持,解放を区別する.マウスは位置と移動量を検出する.移動での相対モード(カーソル位置を固定する方式)ではカーソルを中心に固定し移動量のみ使用する.ゲームパッドなど他の入力デバイスも同様の仕組みである.

入力状態管理

現在の入力状態をフラグや数値で保持する.キーの同時押しにも対応できる.入力履歴の管理で連続技なども実現できる.

以下のブループリントブロックでは,基本的な入力処理を実現している.入力アクションマッピングの設定,イベントノードの配置,キー状態の管理を実装している.

キー入力の設定

  1. プロジェクト設定の「Input」セクションで新しい「Action Mapping」を追加
  2. 「Jump」という名前のアクションに「Space」キーをマッピング
  3. 「Quit」という名前のアクションに「Escape」キーをマッピング
  4. ブループリントで「InputAction Jump」イベントノードを配置
  5. 「InputAction Quit」イベントノードを配置し、Quit関数に接続

このブロック構成の検証には、ゲーム実行中にスペースキーを押すとジャンプイベントが発火し、Escapeキーを押すとゲームが終了することを確認します。

キー状態の管理

  1. ブループリント内で「W Pressed」と「A Pressed」というブール変数を作成
  2. Event Beginplayノードから各変数をFalseに初期化
  3. 「InputAction W」イベントノードを配置し、「Pressed」イベントから「W Pressed」変数をTrueに設定
  4. 「InputAction W」イベントノードの「Released」イベントから「W Pressed」変数をFalseに設定
  5. 「A」キーについても同様に設定

ブロック構成の検証には、ゲーム実行中にW、Aキーの状態に応じてPrintStringノードでデバッグメッセージを表示させ、キーを押すとTrue、離すとFalseになることを確認します。

入力処理のポイント

6. ティック管理の基本

ゲームループ

入力処理,状態更新,描画を繰り返す.フレームレート(画面更新頻度)の制御,時間管理が重要である.固定時間ステップ(一定間隔の更新)と可変時間ステップ(処理時間に応じた更新)の使い分けが必要である.

フレームレートと時間管理

フレームレートは1秒あたりの画面更新回数である.60FPS(1秒間に60回の更新)が標準的である.処理負荷による変動を考慮し,前フレームからの経過時間に基づいてで動きを調整することが重要である.垂直同期(モニタの更新と同期)でティアリング(画面の横分割現象)を防止する.

タスクスケジューリング

定期実行や遅延実行の管理である.優先度による実行順序の制御を行う.

以下のブループリントブロックでは,基本的なティック管理を実現している.Event Tickノードによる定期実行処理の登録,経過時間の取得,ゲーム状態の更新処理を実装している.

定期実行タスクの登録

  1. Event Tickノードを配置
  2. Event TickノードのDelta Secondsピンを変数に保存または直接使用
  3. UpdateGameという新しい関数を作成
  4. Event TickノードのExecuteピンをUpdateGame関数に接続
  5. UpdateGame関数内でDelta Seconds値を使ってキャラクター移動量などを計算

検証には、PrintStringノードを使ってDelta Secondsの値を表示し、60FPSのゲームなら約0.0166秒前後であることを確認します。さらに、オブジェクトを一定速度で移動させる場合、移動距離 = 速度 × Delta Secondsとなることを確認します。

ティック管理のポイント

7. シャドウマッピングの基本

シャドウマッピングの原理

シャドウマッピングは,光源から見たシーンの深度情報をもとに,3D空間内のオブジェクトに影を付与する技術である.2段階レンダリング(二段階の描画処理)で影を表現する.1段階目で深度マップ作成,2段階目で影の判定を行う.画像の平滑化処理で品質を調整する.

深度バッファ(デプスバッファ)

各ピクセルまでの距離を記録するバッファである.Z-バッファとも呼ばれる.隠面消去(見えない部分の除去)と影の計算に使用される.精度は16-32ビット.

アーティファクトと対策

シャドウアクネ(斑点状の影の不具合),エイリアシング(ジャギー,輪郭の段差)などの問題がある.バイアス値調整,PCF(影の境界を滑らかにする処理手法),カスケードシャドウ(視点からの距離に応じた解像度調整)などで対策する.

以下のブループリントブロックでは,基本的なシャドウマッピングを実現する.光源からのシャドウマップの生成,解像度の設定,シャドウマッピングの有効化を実装している.

シャドウマップの設定

  1. Directional Lightアクターをレベルに配置
  2. 「Light」カテゴリの「Cast Shadows」をTrueに設定
  3. 「Light」カテゴリの「Shadow Resolution Scale」を1.0に設定
  4. 「Light」カテゴリの「Dynamic Shadow Distance MovableLight」を設定
  5. 「Cascaded Shadow Maps」セクションで「Num Dynamic Shadow Cascades」を4に設定

ブループリントでシャドウ設定を変更するには:

  1. Directional Lightアクターへの参照を取得
  2. 「Set Cast Shadows」ノードをTrueに設定
  3. 「Set Shadow Resolution Scale」ノードを1.0に設定

検証には、光源の位置や角度を変更したときに影の位置や形が正しく変わることを確認します。また、「Shadow Resolution Scale」の値を下げると影の解像度が荒くなることも確認できます。

シャドウマッピングのポイント