Unreal Engineの入門

2022-07-07

今までもUnreal Engineを使えるようになりたいと思っていたけど、Matrix Awakensのデモ動画 を見てちょっとこれは凄すぎて次元が違う、使えるようにならないと取り残されると危機感を持った。

使用バージョン: Unreal Engine 5.0.2

参考にした動画

Your First Game in UE5 | Tech Talk | State of Unreal 2022 - YouTube を参考にした。

今まで、プロジェクトを「Blank」で作成しても「実行」でFPSカメラ操作ができるのはなぜか? まっさらな状態にしたい!と思ってたところを解説してくれていたのがよかった (要はデフォルトのGameModeがそうなってるから)。

注意点としては、素材が入ったZipファイルをダウンロード方法がわからず、動作するプロジェクトしか落とせなかった。 仕方がないので動作するプロジェクトを起動しておいて、コンテンツブラウザ(コンテンツドロワー)から対象のファイルを選択して右クリック>アセットアクション>エクスポートしたものをインポートで対処した。

以下、内容メモ。

プロジェクト作成

UE5を起動してプロジェクトの作成。

  • ゲーム>Blankを選択。
  • ブループリント(C++ではなく)
  • スターターコンテンツはオフ
  • レイトレーシングもオフ

しかし起動すると地面や空・雲が表示されているので、メニューのファイル>新規レベル…>空のレベルでまっさらな状態から始める。

  • シーンとかワールドとかマップのようなことをUnreal Engineでは「レベル」という

ライティング

  • メニュー>ウィンドウ>環境ライトミキサーでウィンドウを開き(メニューが日本語だと並び順が違うので注意)以下を作成
    • 大気ライト0(ディレクショナルライト)
    • スカイライト
    • Sky Atmosphere
    • ボリュメトリッククラウド
    • ハイトフォグ
  • メニュー>編集>プロジェクト設定…>エンジン>レンダリングの、
    • Global Illumination>ダイナミックグローバルイルミネーションメソッド:Lumen
    • 反射>反射メソッド:Lumen
    • となっていることを確認
  • アウトライナーに追加されるDirectionalLight0を選択して、Ctrl+Lを押してCtrlを残したままにすると、マウスで方向をいじれる
  • SkyLightを選択して、詳細パネルの「Real Time Capture」をオンにすると完全にリアルタイムになる、とか

最初のアセット

  • スタティックメッシュ(.fbx形式)をインポート、するとマテリアルも生成される
  • マテリアルの編集:ノードベース
    • テクスチャ(放線マップ、ラフネス)
    • UV、頂点カラー
  • コンテンツブラウザからスタティックメッシュをドラッグしてレベル上に配置

ブループリント

  • スタティックメッシュを直接配置した場合、プロパティを個別に設定する必要がある。その設定をまとめたい場合にブループリントが使える
  • コンテンツブラウザの「+追加」ボタン、または右クリックで新規アセットを作成>ブループリントクラスを選ぶと「親クラスを選択」ウィンドウが表示されるので、Actorを選んで命名する
    • Actorが「レベルに配置できるオブジェクト」という意味っぽ
    • ブループリントに対しては BP_〜 という命名が一般的っぽ
    • ロジックも書ける

ランドスケープ

  • 丘のような高低のある地面を、ランドスコープで作成できる
  • レイヤーを追加して、塗り分けられる(砂と草)

  • Foliage の Landscape Grass Typeを作成し、スタティックメッシュや密度を設定
  • マテリアルの LandscapeGrassOutput ノードに設定する
  • LandscapeLayerSample で結ぶ

  • ハイポリゴンだけどNaniteなら大丈夫!
  • 頂点のUVじゃなくワールド座標でマッピング、法線を見て水平方向と垂直方向でブレンド
  • オブジェクトを直接配置するのではなく、Static Mesh Foliage でペイントして大量に配置
    • コリジョンもあり

この贅沢さで普通に動くのが驚きだ…。

フォリッジ(草木)

  • 草や木も、岩と同様にFoliageでペイント

ゲームプレイフレームワーク

  • 実行するとFPS操作できるのはデフォルトで設定されているから
    • メニュー>編集>プロジェクト設定…>プロジェクト>マップ&モード>Default Modes に GameModeBase が設定されている
  • ブループリントクラスの作成で「Game Mode Base」「Character」「Player Controller」を作成
    • Unreal Engineでは、
      • Actor がレベルに配置できるベースクラス
      • Pawn がActorを継承して、入力を処理できるクラス
      • Character がPawnを継承して、歩き回れる処理が実装されているクラス
    • Pawn にはスケルトンメッシュなどを追加して、「見た目」を扱う(体)
    • Player Controller で入力に応じでどう行動させるかを制御する(脳)
    • Game Mode Base の Classes>Player Controller Class, Default Pawn Class に設定する
    • レベルに「Player Start」を配置して開始位置を設定する
      • Endキーで地面に接地できる

カメラ

  • Pawnに追加
  • SpringArmを挟んで、少し俯瞰した位置から映すことができる

動作

  • プレイヤーコントローラ
  • ブループリントの Print String で実行されているか確認できる

入力

  • メニュー>編集>プロジェクト設定>エンジン>インプット>バインディング>アクションマッピングに名前と入力ボタンを追加で設定する
  • その名前で XXXXInput としてブループリントから参照できる
  • 変数に入れて押されている間の処理を実行できる

キャラクタセットアップ

  • スケルタルメッシュ
  • マテリアルの顔テクスチャUV切替に FlipBook ノードが使える

キャラクタ動作

  • Character Movementコンポーネントの「Orient Rotation To Movement」で移動方向に向くようになる
  • カメラは回らないで欲しい場合には、SpringArmコンポーネントのトランスフォームの回転タイプを相対から絶対回転に変更する
  • 登れる角度、最高速度、地面の摩擦、減速度

アニメーション

  • アニメーションの.fbxインポートでスケルトンを指定し、Import Meshのチェックは外す
  • アニメーションBPを作成し、BP_Bot(Character)のMeshのAnim Classに設定
    • ステートマシンでアイドルと歩き/走りの状態遷移
    • BlendSpeed1D を作成し、歩きと走りをブレンド
      • ブレンドしても足が滑らないように、水平軸解析をLocomotion、Analysis Propertiesに足のボーンを設定する

AIコントローラ

  • ブループリントクラスの AIController で作成
  • NavMeshで動ける範囲を定義して移動先を設定して動く

オーブのスポーンと収集

  • スペースバーでオーブをスポーンし、AIが向かうようにする

相互作用するコンポーネント

  • 踏めるスイッチと開く扉を作成
  • アニメーションのリバース再生可能
  • ブループリントクラスのActor Componentを作成してスイッチに追加、カスタムイベントで状態をセット
  • 扉側で変数からGet Component by Classで取得、イベントをバインドして開閉
  • レベル上の扉の変数にスイッチを関連付ける

エフェクト、サウンド、カメラシェイク

  • Niagara:パーティクルエフェクト
  • MetaSound(プラグインを追加する):ホワイトノイズなどから音を生成できる
    • 歩き/走りアニメーションに合わせて発生させる
  • CameraShakeBase:カメラを揺らす

動画を見終えて

  • 写実的なシーンなら比較的簡単に作れそうでよい
  • 知らないと実現するのに苦労しそうな機能がたくさんあるので慣れが必要そうだけど、まあおいおい
  • ビジュアルスクリプティングという意味でのブループリント?と、「ブループリントクラス」というものが混乱させられる (ブループリント入門 | Unreal Engine ドキュメントを見てもまだよくわからない…)
  • 座標系はZ+が上方向、X+が前方向の左手系(Y+は右になる)
  • 1.0 = 1cmというスケールが基準