ゲームエンジン Unreal Engine 5:視覚効果・物理演算・アニメーション・シーン管理の実装ガイド
【概要】本文書は、Unreal Engine 5を用いたゲーム開発における8つの基本技術を解説する。対象とする技術は、衝突判定、物理シミュレーション、アニメーション制御、サウンド制御、スプライト表示、パーティクル制御、GUI制御、シーン遷移であり、いずれもブループリントを用いた実装方法を示す。本文書は、プログラミングの基礎知識を持ち、Unreal Engine 5の基本操作を理解している学生および技術者を対象とする。Unreal Engine 5の長さの単位は、1単位=1cmである。
【目次】
1. 衝突判定の基本
バウンディング球とバウンディングボックス
衝突判定において、複雑な形状のオブジェクトをそのまま扱うと計算コストが高い。そのため、オブジェクトを単純な形状で近似する手法が用いられる。バウンディング球は中心座標と半径で定義され、バウンディングボックスは中心座標と各軸方向の長さで定義される。これらの単純な形状による粗い判定を第一段階で行い、衝突の可能性がある場合にのみ詳細な判定を実施することで、計算量を削減できる。
衝突検出アルゴリズム
効率的な衝突検出には階層的なアプローチが用いられる。まずバウンディング球同士の判定を行い、衝突の可能性がある場合にのみ詳細な形状による判定を実施する。空間分割法を併用することで判定対象を限定し、計算量をさらに削減できる。衝突検出には離散衝突検出と連続衝突検出の2種類がある。離散衝突検出は特定の時刻における位置のみを考慮するため計算コストは低いが、高速移動するオブジェクトが薄い壁を通り抜ける問題が発生する。連続衝突検出はフレーム間の移動を考慮することでこの問題を防ぐ。
実装例:衝突検出システムの基本設定
ステップ1:ブループリントの構成
イベントグラフにおいて、以下の順序でノードを接続する。
Begin Play イベント
↓
Get Component by Class ノード(Class: Sphere Collision)
↓
Set Generate Overlap Events ノード(New Generate Overlap Events: True)
↓
Set Collision Profile Name ノード(Collision Profile Name: OverlapAllDynamic)
↓
Bind Event to On Component Begin Overlap ノード
Get Component by Classノードは、アクター内のSphereコリジョンコンポーネントを取得する。Set Generate Overlap Eventsノードは、オーバーラップイベントの発生を有効化する。Set Collision Profile Nameノードは、コリジョンの応答方法を設定する(OverlapAllDynamicは、動的オブジェクトに対してオーバーラップ応答を行うプリセットである)。Bind Event to On Component Begin Overlapノードは、オーバーラップ開始時に実行する関数を指定する。
ステップ2:衝突応答の実装
On Component Begin Overlap イベント
↓
Print String ノード(In String: "Collision Detected")
この実装により、衝突が検出された際にコンソールにメッセージが表示される。実際のゲーム開発では、このイベントにダメージ処理やアイテム取得などの処理を接続する。
ステップ3:動作確認
Playモードでゲームを開始し、設定したコリジョンを持つアクターに別のオブジェクトを接近させる。衝突が発生すると、画面左上のコンソール出力エリアに「Collision Detected」というメッセージが表示される。
よくある問題と解決方法
衝突が検出されない場合、以下の点を確認する。Sphereコリジョンコンポーネントがアクターに追加されているか、両方のオブジェクトのコリジョンプロファイルが互いに反応する設定になっているか、コリジョンの範囲が適切かを確認する。コリジョンの範囲を可視化するには、コンソールコマンド「show collision」を使用する。
2. 物理シミュレーションの基本
運動方程式の基本
物理シミュレーションの基礎はニュートンの運動法則である。第二法則はF=ma(力=質量×加速度)という関係式で表される。ゲーム内の物体の動きは、この法則を時間ステップごとに適用することで計算される。
剛体力学の基本
剛体力学では、変形しない物体の運動を扱う。剛体の運動を決定する主要なパラメータは、質量、慣性モーメント、重心位置である。質量は並進運動に対する抵抗を表し、慣性モーメントは回転運動に対する抵抗を表す。重心位置は物体の質量分布の中心であり、力が加わった際の運動に影響を与える。
実装例:物理シミュレーションの基本設定
ステップ1:ブループリントの構成
Construction Scriptにおいて、以下の順序でノードを接続する。
Construction Script イベント
↓
Get Component by Class ノード(Class: Static Mesh Component)
↓
Set Simulate Physics ノード(Simulate Physics: True)
↓
Set Mass Override in Kg ノード(Mass in Kg: 1.0)
↓
Set Linear Damping ノード(Linear Damping: 0.01)
Get Component by Classノードは、アクター内のStatic Meshコンポーネントを取得する。Set Simulate Physicsノードは、物理演算を有効化する。これにより、オブジェクトは重力の影響を受け、他のオブジェクトと物理的に相互作用する。Set Mass Override in Kgノードは、オブジェクトの質量をキログラム単位で設定する。Set Linear Dampingノードは、線形減衰係数を設定する(線形減衰係数は物体の速度に比例した抵抗力を与え、空気抵抗に相当する効果を持つ)。
ステップ2:初速度の設定(オプション)
Set Linear Damping ノード
↓
Set All Physics Linear Velocity ノード(New Vel: X=0, Y=0, Z=500)
このノードは、物体に初期速度を設定する。Z軸方向に500を設定することで、物体は上方向に5m/s(500cm/s)の初速度を持つ。
ステップ3:動作確認
Playモードでゲームを開始する。物理演算が有効化されている場合、オブジェクトは重力により落下する。Unreal Engine 5のデフォルトの重力加速度は-980cm/s²である(実世界の重力加速度9.8m/s²に相当する)。エディタ上でオブジェクトを地面より高い位置に配置し、Playモードに入ると落下が確認できる。落下したオブジェクトが地面や他のオブジェクトと衝突すると、反発や回転が発生する。
よくある問題と解決方法
物理シミュレーションが機能しない場合、以下の点を確認する。Static Meshコンポーネントの詳細パネルでSimulate Physicsにチェックが入っているか、コリジョンプリセットがNoCollisionに設定されていないか、Gravity Scaleが0.0に設定されていないかを確認する。コリジョンプリセットがNoCollisionの場合は、PhysicsActorなどの適切なプリセットに変更する。
3. アニメーション制御の基本
キーフレームアニメーション
キーフレームアニメーションは、特定の姿勢を表すキーフレームを設定し、その間を補間することで動きを生成する手法である。指定するのは主要なフレームのみであり、それ以外のフレームはコンピュータが補間により計算する。キーフレームでは、位置、回転、スケールなどのプロパティを時間軸に沿って制御する。
ボーンアニメーション
ボーンアニメーションは、骨格構造による変形制御の手法である。3Dモデルの内部に仮想的な骨格を配置し、各ボーンの回転によりメッシュの変形を実現する。メッシュの各頂点は、複数のボーンから影響を受ける。この影響度はスキニングウェイトと呼ばれ、0.0から1.0の範囲で設定される。各頂点に対するすべてのボーンのウェイトの合計は1.0となる。
実装例:アニメーション付きキャラクターの制御
ステップ1:Animation Blueprintの準備
Animation Blueprintを作成する。コンテンツブラウザで右クリックし、Animation > Animation Blueprintを選択する。対象となるスケルトンを指定してAnimation Blueprintを作成する。Animation Blueprint内のAnim Graphで、State Machineを作成し、Idle(待機)、Walk(歩行)、Run(走行)などの状態を定義する。各状態には対応するアニメーションシーケンスを割り当てる。
ステップ2:ブループリントの構成
キャラクターのブループリントのイベントグラフにおいて、以下の順序でノードを接続する。
Tick イベント
↓
Get Velocity ノード(ターゲット:Self)
↓
Vector Length ノード
↓
Get Mesh ノード
↓
Get Anim Instance ノード
↓
Cast To [Animation Blueprint名] ノード
↓
Set Speed 変数(Animation Blueprint内の変数)
この構成により、キャラクターの移動速度がAnimation Blueprintに毎フレーム伝達される。Get Velocityノードは、キャラクターの現在の速度ベクトル(cm/s単位)を取得する。Vector Lengthノードは、このベクトルの大きさ(スカラー値)を計算する。Animation Blueprint側では、この速度に基づいて適切なアニメーション状態に遷移する。
ステップ3:Animation Blueprintでの状態遷移設定
Animation BlueprintのAnim Graphで、状態間の遷移ルールを設定する。IdleからWalkへの遷移は、Speed変数が10.0以上になった場合に実行される(10cm/s、すなわち0.1m/sに相当する)。WalkからRunへの遷移は、Speed変数が300.0以上になった場合に実行される(300cm/s、すなわち3m/sに相当する)。各遷移にはBlend Timeを設定することで、状態間が滑らかに切り替わる。標準的には、0.2から0.5秒程度の値を用いる。
ステップ4:動作確認
Playモードでゲームを開始する。キャラクターが静止している状態では、Idleアニメーションが再生される。移動キー(W、A、S、D)を押すと、キャラクターが移動を開始し、同時にWalkアニメーションに遷移する。移動速度が一定値を超えた場合は、Runアニメーションに遷移する。移動を停止すると、再びIdleアニメーションに戻る。
よくある問題と解決方法
アニメーションが再生されない場合、以下の点を確認する。SkeletalMeshコンポーネントの詳細パネルでAnim Classに作成したAnimation Blueprintが設定されているか、Animation Blueprint内のSpeed変数が正しく更新されているかをPrint Stringノードで検証する。アニメーションの遷移が発生しない場合は、State Machine内の遷移ルールが正しく設定されているかを確認する。
4. サウンド制御の基本
音声ファイル形式
ゲームで使用される音声ファイル形式には、WAV形式とOGG形式がある。WAV形式は非圧縮の音声形式であり、音質の劣化がない。ファイルサイズは大きいが、再生時の処理負荷は低く、短い効果音に適している。OGG形式は非可逆圧縮の音声形式であり、ファイルサイズを削減できるため、BGMなど長時間の音声に適している。音声ファイルの品質は、サンプリングレートとビットレートにより決定される。サンプリングレートは1秒間に音声をサンプリングする回数を表し、44.1kHzや48kHzが用いられる。
3D音響の基本
3D音響は、音源の位置に基づいて音量と定位を変化させることで、空間的な音響効果を実現する技術である。音源がプレイヤーから遠ざかると音量が減少し、音源が左右に移動すると左右のスピーカーの音量バランスが変化する。これにより、プレイヤーは音から音源の位置を把握できる。距離減衰は、音源からの距離に応じて音量が減少する効果である。減衰の程度は、距離減衰曲線により制御される。
実装例:効果音とBGMの基本制御
ステップ1:音声アセットの準備
使用する音声ファイルをUnreal Engine 5にインポートする。コンテンツブラウザで右クリックし、Import to...を選択する。WAVまたはOGG形式の音声ファイルを選択してインポートすると、Sound Waveアセットとして保存される。
ステップ2:効果音の再生実装
イベント(例:OnComponentHit)
↓
Play Sound at Location ノード
├ Sound 入力:効果音のSound Waveアセット
├ Location 入力:Get Actor Location ノード
└ Volume Multiplier 入力:0.8
Play Sound at Locationノードは、指定した位置で3D効果音を再生する。Sound入力には、再生する効果音のSound Waveアセットを接続する。Location入力には、音を再生する3D空間上の位置を指定する。Get Actor Locationノードを使用することで、アクターの現在位置で音を再生できる。Volume Multiplierは、音量の倍率を指定する。1.0が元の音量であり、0.8は元の音量の80%を意味する。
ステップ3:BGMの再生実装
Begin Play イベント
↓
Spawn Sound 2D ノード
├ Sound 入力:BGMのSound Waveアセット
├ Volume Multiplier 入力:0.5
└ Start Time 入力:0.0
Spawn Sound 2D ノードの戻り値(Audio Component)
↓
Set Looping ノード(Looping: True)
Spawn Sound 2Dノードは、位置に依存しない2D音声を再生し、Audio Componentへの参照を返す(Play Sound 2Dノードは戻り値を持たないため、後から制御するにはSpawn Sound 2Dノードを使用する)。Set Loopingノードは、このAudio Componentに対してループ再生を設定する。Looping入力をTrueに設定することで、音声が終了すると最初から再生される。
ステップ4:動作確認
Playモードでゲームを開始し、効果音を再生するイベント(例:オブジェクトの衝突)を発生させる。効果音が再生され、音源の位置に応じて左右のスピーカーの音量バランスが変化することを確認する。カメラを移動させ、音源から遠ざかると音量が減少することを確認する。BGMは、Playモードでゲームを開始すると同時に再生され、ループ再生されることを確認する。
よくある問題と解決方法
音が再生されない場合、以下の点を確認する。再生ノードのSound入力に正しいSound Waveアセットが接続されているか、Volume Multiplierが0.0に設定されていないか、Sound Waveアセットの詳細パネルでVolumeプロパティが0.0に設定されていないかを確認する。3D音響が機能しない場合は、Play Sound at Locationノードを使用しているかを確認する(Spawn Sound 2DおよびPlay Sound 2Dは3D音響を適用しない)。BGMがループしない場合は、Set Loopingノードが正しく接続されているかを確認する。
5. スプライト表示の基本
テクスチャマッピング
テクスチャマッピングは、2D画像を3D物体の表面に貼り付ける技術である。3Dモデルの各頂点には、テクスチャ上の対応位置を示すUV座標が割り当てられる。レンダリング時には、このUV座標に基づいてテクスチャから色情報を取得し、3Dモデルの表面に適用する。ミップマップは、同じテクスチャを異なる解像度で複数用意する技術である。カメラからの距離に応じて適切な解像度のテクスチャを使用することで、描画品質と処理効率を両立できる。
UV座標系
UV座標系は、テクスチャ上の位置を表現するための2次元座標系である。座標の範囲は(0,0)から(1,1)であり、この正規化された座標系により、テクスチャの解像度に依存しない記述が可能となる。Unreal Engine 5では、左上が(0,0)、右上が(1,0)、左下が(0,1)、右下が(1,1)となる。テクスチャの境界における処理方法には、リピート、クランプ、ミラーなどがある。リピートは、UV座標が1.0を超えた場合に0.0に戻り、テクスチャを繰り返す方式である。クランプは、UV座標が1.0を超えた場合に1.0に固定し、端のピクセルを引き延ばす方式である。
アルファブレンディング
アルファブレンディングは、透明度による重ね合わせ処理である。各ピクセルは、赤、緑、青の色情報に加えて、アルファ値と呼ばれる透明度情報を持つ。アルファ値が1.0の場合は完全に不透明、0.0の場合は完全に透明となる。前景の色をCf、背景の色をCb、前景のアルファ値をαとすると、合成後の色Cは C = α × Cf + (1 - α) × Cb で計算される。合成モードには、通常合成、加算合成、乗算合成などがある。
実装例:2D画像のスプライト表示
ステップ1:スプライトアセットの準備
表示する画像をUnreal Engine 5にインポートする。コンテンツブラウザで右クリックし、Import to...を選択する。PNG形式の画像ファイルを選択してインポートする。透明部分を持つ画像の場合、PNGのアルファチャンネルが自動的に認識される。インポートされた画像を右クリックし、Sprite Actions > Create Spriteを選択することで、Paper Spriteアセットが作成される(Paper SpriteはPaper 2Dプラグインの機能であり、利用前にプラグインを有効化する必要がある)。
ステップ2:ブループリントの構成
アクターのブループリントのConstruction Scriptにおいて、以下の順序でノードを接続する。
Construction Script イベント
↓
Add Paper Sprite Component ノード
↓
変数に保存(Sprite Component)
Sprite Component 変数
↓
Set Sprite ノード
└ New Sprite 入力:作成したPaper Spriteアセット
Sprite Component 変数
↓
Set Relative Location ノード
└ New Location 入力:X=0, Y=0, Z=100
Sprite Component 変数
↓
Set Relative Scale 3D ノード
└ New Scale 3D 入力:X=1, Y=1, Z=1
Add Paper Sprite Componentノードは、アクターに新しいPaper Spriteコンポーネントを追加する。このコンポーネントは2D画像を3D空間に表示するための専用コンポーネントである。Set Spriteノードは、表示するスプライトアセットを設定する。Set Relative Locationノードは、アクターに対する相対的な位置を設定する。Z値を100に設定することで、スプライトはアクターの中心から100cm(1m)上に配置される。Set Relative Scale 3Dノードは、スプライトのスケールを設定する。
ステップ3:動作確認
作成したアクターをレベルに配置し、Playモードでゲームを開始する。スプライトが指定した位置に表示されることを確認する。透明部分を持つスプライトの場合、背景が透けて見えることを確認する。カメラを移動させ、スプライトが3D空間に正しく配置されていることを確認する。
よくある問題と解決方法
スプライトが表示されない場合、以下の点を確認する。Set SpriteノードのNew Sprite入力に正しいPaper Spriteアセットが接続されているか、スプライトのスケールが極端に小さい、または大きくないか、スプライトがカメラの視錐台の外に配置されていないかを確認する。透明部分が正しく表示されない場合は、マテリアルのBlend ModeがTranslucentに設定されているかを確認する。また、使用している画像ファイルにアルファチャンネルが含まれているかを確認する。
6. パーティクル制御の基本
パーティクルシステム
パーティクルシステムは、多数の小さな粒子による視覚効果を生成する仕組みである。各粒子は独立した演算により動き、全体として炎、煙、爆発などの視覚効果を表現する。Unreal Engine 5では、Niagaraシステムを使用する。NiagaraシステムはGPU上での処理に対応しており、多数の粒子を同時に処理できる。パーティクルシステムは、エミッター、パーティクル、レンダラーという3つの主要な要素から構成される。
エミッターとパーティクル
エミッターは、パーティクルを生成する装置である。放出角度、放出速度、放出頻度などのパラメータを持つ。放出角度は、粒子が放出される方向の範囲を決定する。放出速度は、粒子の初速度を決定する。放出頻度は、単位時間あたりに生成される粒子の数を決定する。パーティクルは、位置、速度、寿命、色、サイズなどの属性を持つ。位置と速度は時間とともに変化する。寿命は、粒子が存在する時間であり、寿命が尽きると粒子は消滅する。色とサイズは、時間とともに変化させることで、多様な視覚効果を実現できる。
実装例:パーティクルシステムの基本設定
ステップ1:Niagaraシステムの作成
Niagaraシステムを作成する。コンテンツブラウザで右クリックし、FX > Niagara Systemを選択する。テンプレートから適切なものを選択するか、空のシステムを作成する。Niagaraエディタが開いたら、Emitterを追加し、Spawn Rate(放出頻度)、Lifetime(寿命)、Initial Velocity(初速度)などのパラメータを設定する。
ステップ2:ブループリントでの配置と制御
ブループリントのイベントグラフにおいて、以下の順序でノードを接続する。
イベント(例:OnComponentHit)
↓
Spawn System at Location ノード
├ System Template 入力:作成したNiagaraシステム
├ Location 入力:Get Actor Location ノード
├ Rotation 入力:(0, 0, 0)
├ Scale 入力:(1, 1, 1)
└ Auto Destroy 入力:True
Spawn System at Location ノードの戻り値
↓
変数に保存(Niagara Component)
Spawn System at Locationノードは、指定した位置にNiagaraシステムを生成する。System Template入力には、作成したNiagaraシステムアセットを指定する。Location入力には、エフェクトを表示する3D空間上の位置を指定する。Rotation入力は、エフェクトの向きを指定する((0, 0, 0)は回転なしを意味する)。Scale入力は、エフェクトのスケールを指定する((1, 1, 1)は元のサイズを意味する)。Auto Destroy入力をTrueに設定すると、エフェクトの再生が終了した時点でコンポーネントが破棄される。
ステップ3:エフェクトの制御
生成したNiagaraコンポーネントに対して、以下の制御を行う。
Niagara Component 変数
↓
Activate ノード(エフェクトを開始)
Niagara Component 変数
↓
Deactivate ノード(エフェクトを停止)
Niagara Component 変数
↓
Set Niagara Variable Float ノード
├ In Variable Name 入力:パラメータ名(例:"User.SpawnRate")
└ In Value 入力:新しい値(例:100.0)
Activateノードは、停止しているエフェクトを再開する。Deactivateノードは、再生中のエフェクトを停止する。停止後も、既に生成された粒子は寿命が尽きるまで存在する。Set Niagara Variable Floatノードは、Niagaraシステムに定義されたUser Parameter(User. 名前空間のパラメータ)を実行時に変更する。これにより、実行時にエフェクトの特性を調整できる。
ステップ4:パラメータの公開(Niagaraシステム側の設定)
ブループリントから制御可能なパラメータを作成するには、Niagaraエディタで以下の設定を行う。Parametersパネルで「User Parameters」カテゴリに新しい変数を追加し、型(Floatなど)と名前を設定する。User Parametersに追加された変数は、自動的に「User.変数名」という名前で外部に公開される。これにより、ブループリントからSet Niagara Variable Floatノードでこのパラメータを変更できる。
ステップ5:動作確認
Playモードでゲームを開始し、エフェクトを生成するイベント(例:ボタンクリック)を発生させる。指定した位置にパーティクルエフェクトが表示されることを確認する。パーティクルが設定した寿命の後に消滅すること、およびAuto Destroy入力をTrueに設定した場合にNiagaraコンポーネントが破棄されることを確認する。User Parameterを変更した場合は、Set Niagara Variable Floatノードの実行後にエフェクトの挙動が変化することを確認する。
よくある問題と解決方法
パーティクルが表示されない場合、以下の点を確認する。Spawn System at LocationノードのSystem Template入力に正しいNiagaraシステムアセットが接続されているか、Niagaraシステムのエミッターが有効化されているか、Scale入力が極端に小さい値に設定されていないかを確認する。Niagaraシステムをエディタ上でプレビューし、単体で正しく動作するかをあらかじめ確認することも有効である。User Parameterの変更がエフェクトに反映されない場合は、変数名が「User.」プレフィックスを含む正しい名称で指定されているかを確認する。
7. GUI制御の基本
UMGとWidget Blueprint
Unreal Engine 5では、UMG(Unreal Motion Graphics)と呼ばれるシステムを用いてGUIを構築する。GUIの構成単位はWidget Blueprintであり、画面に表示される要素(ボタン、テキスト、画像など)を視覚的に配置して作成する。Widget Blueprintは、デザイナータブとグラフタブの2つの編集画面を持つ。デザイナータブでは要素の配置とプロパティ設定を行い、グラフタブではイベント処理を記述する。
レイアウトとアンカー
UMGでは、要素の配置にCanvas Panelなどのレイアウト用パネルを使用する。Canvas Panel上に配置された要素はアンカーを持ち、画面サイズが変化した場合の追従方法を制御する。アンカーは、要素が画面のどの位置を基準として配置されるかを指定する。画面中央を基準とする場合、アンカーを中央に設定することで、解像度に依存しない配置が実現される。Vertical BoxやHorizontal Boxなどのレイアウトパネルを使用することで、要素の自動整列も可能である。
実装例:メニュー画面の作成と表示
ステップ1:Widget Blueprintの作成
コンテンツブラウザで右クリックし、User Interface > Widget Blueprintを選択する。親クラスとしてUser Widgetを指定し、名前を「WBP_MainMenu」とする。Widget Blueprintを開き、デザイナータブで以下の要素を配置する。Canvas Panelをルートとして配置し、その上にButton(名前:StartButton)とText Block(Buttonの子として配置、内容:「Start」)を配置する。同様に、ExitButton(内容:「Exit」)も配置する。
ステップ2:ボタンイベントの実装
デザイナータブでStartButtonを選択し、詳細パネルのEvents > On Clickedの「+」ボタンをクリックする。グラフタブに自動的にOnClicked (StartButton)イベントが追加される。同様に、ExitButtonに対してもOn Clickedイベントを追加する。グラフタブにおいて、以下の順序でノードを接続する。
OnClicked (StartButton) イベント
↓
Open Level (by Name) ノード(Level Name: "GameLevel")
OnClicked (ExitButton) イベント
↓
Quit Game ノード
OnClickedイベントは、対応するボタンがクリックされた際に発火する。Open Level (by Name)ノードは、指定した名前のレベルを開く。Level Name入力には、遷移先のレベル名を文字列で指定する。Quit Gameノードは、ゲームを終了する。
ステップ3:Widgetの表示
Widget Blueprintを画面に表示するには、レベルブループリントまたは適切なアクターのブループリントで以下の処理を行う。
Begin Play イベント
↓
Create Widget ノード(Class: WBP_MainMenu)
↓
変数に保存(Menu Widget)
↓
Add to Viewport ノード(Target: Menu Widget)
↓
Get Player Controller ノード
↓
Set Input Mode UI Only ノード(In Widget to Focus: Menu Widget)
↓
Set Show Mouse Cursor ノード(Show Mouse Cursor: True)
Create Widgetノードは、指定したクラスのWidget Blueprintのインスタンスを生成する。Add to Viewportノードは、生成したWidgetを画面に表示する。Set Input Mode UI Onlyノードは、入力をUIに対してのみ受け付ける状態に切り替える。Set Show Mouse Cursorノードは、マウスカーソルを画面に表示する。
ステップ4:動作確認
Playモードでゲームを開始し、メニュー画面が表示されることを確認する。StartButtonをクリックすると、指定したレベルに遷移する。ExitButtonをクリックすると、ゲームが終了する。マウスカーソルが表示され、ボタンの上にカーソルを置いた際にハイライト状態に変化することを確認する。
よくある問題と解決方法
Widgetが表示されない場合、以下の点を確認する。Create WidgetノードのClass入力に正しいWidget Blueprintクラスが指定されているか、Add to Viewportノードが実行されているかを確認する。ボタンクリックに反応しない場合は、Set Input Mode UI OnlyノードまたはSet Input Mode Game and UIノードによりUIへの入力が有効化されているか、Set Show Mouse Cursorノードによりマウスカーソルが表示されているかを確認する。Open Level (by Name)ノードでレベル遷移が発生しない場合は、Level Name入力に指定した文字列が実際のレベルファイル名と一致しているかを確認する。
8. シーン遷移の基本
レベルとシーン遷移
Unreal Engine 5におけるシーンは、レベル(Level)と呼ばれる単位で管理される。各レベルには、地形、配置されたアクター、ライティング設定などが含まれる。シーン遷移とは、現在のレベルから別のレベルに切り替える処理を指す。レベルの切り替え時には、現在のレベル上のアクターが破棄され、遷移先のレベルがロードされる。
レベル間のデータ保持
レベル遷移時には、Actor上の変数は破棄される。レベル間でデータを保持するには、Game Instanceを使用する。Game Instanceはゲームの起動から終了まで存続するオブジェクトであり、レベル遷移の影響を受けない。プレイヤーのスコア、所持アイテム、設定情報などをGame Instanceに保存することで、レベル間でデータを引き継ぐことができる。
実装例:レベル遷移とデータ保持
ステップ1:Game Instanceクラスの作成
コンテンツブラウザで右クリックし、Blueprint Class > Game Instanceを選択する。名前を「BP_GameInstance」とする。作成したGame Instanceを開き、以下の変数を追加する。PlayerScore(型:Integer、初期値:0)、PlayerName(型:String、初期値:"")を追加する。これらの変数はレベル遷移の影響を受けず、ゲーム終了まで保持される。
ステップ2:プロジェクト設定でのGame Instance登録
Edit > Project Settingsを開き、Project > Mapsを選択する。Game Instance Class項目に作成したBP_GameInstanceを指定する。この設定により、ゲーム起動時にBP_GameInstanceのインスタンスが自動的に生成される。
ステップ3:データの保存と読み込み
レベル内のアクターのブループリントにおいて、Game Instanceにデータを保存する処理を実装する。
イベント(例:スコア加算時)
↓
Get Game Instance ノード
↓
Cast To BP_GameInstance ノード
↓
Set Player Score ノード(New Value: 加算後のスコア)
Get Game Instanceノードは、現在のGame Instanceへの参照を取得する。Cast To BP_GameInstanceノードは、取得した参照を作成したGame Instanceクラスに変換する。Set Player Scoreノードは、Game Instance内のPlayerScore変数を更新する。データを読み込む場合も同様にGet Game InstanceとCast To BP_GameInstanceを経由してアクセスする。
ステップ4:レベル遷移の実装
レベル遷移を発生させるイベント(例:ゴール地点との衝突)に対して、以下の処理を実装する。
イベント(例:OnComponentBeginOverlap)
↓
Open Level (by Name) ノード(Level Name: "Level02")
Open Level (by Name)ノードは、指定したレベル名のレベルに遷移する。遷移先のレベルがロードされる際、現在のレベル上のすべてのアクターは破棄される。Game Instanceに保存されたデータは破棄されないため、遷移先のレベルでも参照できる。
ステップ5:遷移先レベルでのデータ参照
遷移先レベルのアクターにおいて、保存されたデータを参照する。
Begin Play イベント
↓
Get Game Instance ノード
↓
Cast To BP_GameInstance ノード
↓
Get Player Score ノード
↓
Print String ノード(In String: PlayerScoreの値)
この実装により、遷移先のレベルでも前のレベルで保存したスコアを参照できる。
ステップ6:動作確認
Playモードでゲームを開始する。最初のレベルでスコアを加算し、ゴール地点に到達してレベル遷移を発生させる。遷移先のレベルで、Print Stringノードによりスコアが正しく表示されることを確認する。スコアが0と表示される場合は、Game Instanceにデータが保存されていない可能性があるため、保存処理が正しく実行されているかを確認する。
よくある問題と解決方法
レベル遷移が発生しない場合、以下の点を確認する。Open Level (by Name)ノードのLevel Name入力に指定した文字列が実際のレベルファイル名と一致しているか、遷移先のレベルがプロジェクトのMaps & Modes設定でパッケージ対象に含まれているかを確認する。Game Instanceのデータが保持されない場合、プロジェクト設定のGame Instance Classに作成したBP_GameInstanceが指定されているかを確認する。Cast To BP_GameInstanceが失敗する場合は、Get Game Instanceの戻り値が正しいGame Instanceクラスのインスタンスであるかを確認する。