UnityユーザーのためのUEブループリント入門
コードとビジュアル両方のスクリプトを比較してゲームエンジンを学びます

1. 基本操作

基本操作では以下の順番で説明します。
  • 準備
  • エディタ
  • Cubeの構成
  • 視点を動かしてみる
  • アクタ(GameObject)の操作とショートカット
  • アクタ(GameObject)の作成
はじめに、いきなりですが言葉の定義としての、オブジェクト指向の"インスタンス"について触れてみたいと思います。いろいろな説はありますが、とりあえずサイト「「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典」の説明を引用します。
インスタンス(英:instance)とは

「オブジェクト指向で出てくる概念のひとつ」

であり

「設計図(クラス)を具現化した『実体』のこと」

です。
  • クラス:設計図
  • インスタンス:実際に作った物
  • オブジェクト:モノ(クラスとかインスタンスとかをふんわりと表現したもの)
🔗 参考リンク
「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
インスタンス
ゲームエンジンの世界に置き換えると
  • クラス:設計図
  • インスタンス:シーンまたはレベル上に置かれたもの
  • オブジェクト:クラスをインスタンス化したもの。オブジェクト=インスタンスと捉えてもOK。
キャラクター、アイテム、環境オブジェクトなど、すべてがゲーム内のオブジェクトです。UnityのGameObjectやUEのUObjectは、クラス(設計図)に基づいて作られます。Unityの"GameObject"やUEの"UObject"のように、ゲーム開発において、「オブジェクト」とはゲーム内の物体を指すことが多いです。
コンポーネントも部品を設計しているクラスなので、コンポーネントクラスと表現することもできますが、ここではクラスと分けるためにコンポーネントで表現を統一します。
UnityユーザーがUEブループリントをはじめるにあたって、ゲームエンジン上でオブジェクトをどう扱っているのかについて、その違いを抑えておきましょう。
UnityがC#でプログラムソースを書く、UEブループリントはエディタで作るというイメージがあります。これをオブジェクト指向の継承という観点から整理すると以下の図のようになります。UnityがC#で書いているのはTransform以外のコンポーネントです。GameObjectを継承するPrefabはエディタ上でつくります(もちろん、スクリプト上でInstantiateを呼んでPrefabをつくる方法もありますが、呼ぶ元となるPrefabはエディタ上でつくる必要があります)。
一方UEブループリントはエディタ上で全て完結します。
この構造をふまえたうえで、その違いをみていきましょう。

1. Unityの基本操作

著者が利用している環境は以下のとおりです。
  • Windows11
  • Unity2023.2.12f1
準備
UnityHubで新規プロジェクトを作成します。Universal 3Dを選択します。
しばらくするとプロジェクトが作成されます。

1.1 エディタ

Sceneビュー
🔗 参考リンク
Unityドキュメンテーション
シーンビュー
Gameビュー
🔗 参考リンク
Unityドキュメンテーション
ゲームビュー
Hierarchyウィンドウ
🔗 参考リンク
Unityドキュメンテーション
Hierarchyウィンドウ
Inspectorウィンドウ
🔗 参考リンク
Unityドキュメンテーション
Inspectorウィンドウ
Projectウィンドウ
🔗 参考リンク
Unityドキュメンテーション
Projectウィンドウ
Consoleウィンドウ
Cubeを置く
Cubeを置くには、Hierarchyで右クリックしてから3D Object > Cubeを選択します。
Hierarchyでゲームオブジェクトをダブルクリックするとフォーカスされます。

1.2 Cubeの構成

Cubeは、もともとのEmpty GameObjectに対して様々なコンポーネントに追加することによって実現しています。
Transformコンポーネント
Cubeの位置、回転、大きさを決めています。
Meshfilterコンポーネント
Cubeに関する3Dモデルの形状、頂点位置、法線、UVマッピングなどのグラフィックスデータを読み込んでいます。

MeshRendererコンポーネント

MeshFilterが保持するMeshデータを使用して、Cubeをシーン内に表示します。
BoxColliderコンポーネント
Cubeに当たり判定を持たせることができます。
Materialコンポーネント
Cubeの色合いを決めています。

1.3 視点を動かしてみる

視点の操作はマウスの操作になりますので、以下のようにまとめておきます。
  • Sceneビューの操作
  • 右ドラッグ > 視点を回転
  • 中ドラッグ(ホイール押し込み) > 視点を平行移動
  • マウスホイール回転 > 視点を前進後退
Unityはカメラが映したものをゲームビューに表示します。
ゲームビューで映っているものが実際のゲーム画面に表示されます。

1.4 GameObjectの操作と編集

GameObjectの操作はマウスとキーボードの操作になりますので、以下のようにまとめておきます。
  • 中ドラッグでY-Z平面を視点移動します。
  • Alt(Option)+右ドラッグ > ホイール回転と同じX軸のズームです
  • Alt(Option)+左ドラッグ > 視点回転(右ドラッグとは違います)
  • ショートカットキー > Q
  • ショートカットキー > W
  • ショートカットキー > E
  • ショートカットキー > R
2次元的にとらえた場合の移動、回転、拡大縮小についてのショートカットです。
  • ショートカットキー > T
  • ショートカットキー > Y
右クリックしたゲームオブジェクトに対する操作でGameObjectの編集ができます。
  • Cut 切り取り
  • Copy コピー
  • Paste 貼り付け
  • Rename 名前変更
  • Duplicate 複製
  • Delete シーンから削除

1.5 GameObjectの作成

Create EmptyはHierarchyで右クリックで選択します。
空のGameObjectを作成します。
空のGameObjectであってもTransformは必ずついてきます。

1. UEブループリントの基本操作

これから説明していくにあたってUnityで操作していたものとの違いについて言葉を定義します。
著者が利用している環境は以下のとおりです。
  • Windows11
  • UE4.27.2
📝 メモ
UE5は近日中に対応を予定してます。
準備
Select or Create New ProjectはGamesを選択してNextボタンを押します。
Select Templateは、Blankを選択して、Nextボタンを押します。
Project Settingsは、左の列の二番目で、パフォーマンスは、Scalable 3D or 2Dを選択、適当に名前を付けてCreate Projectボタンを押します。
エディタ画面が表示されれば準備完了です。

1.1 エディタ

エディタについての情報は、Epic公式サイトのUnity引っ越しガイドに記載されていますので、まずは公式の情報をご確認頂ければと思います。
🔗 参考リンク
Unreal Engineデベロッパードキュメント
Unity から Unreal Engine への乗り換えガイド
ここでは、これからUnityと比較して説明するにあたっての用語整理のために簡単に説明します。
レベル
Unityで言う"シーン"を、UEでは"レベル"と言います。EpicのUnity引っ越しガイドではシーンのことをUEではビューポートと説明していますが、正確にはUnityのシーンビューのことをUEではビューポートと言います。
🔗 参考リンク
Unreal Engineデベロッパードキュメント
エディタ ビューポート(Sceneビュー)
(ゲームビュー)
最初にプロジェクトを作成したときは、UnityのHierarhyにあったMain Cameraがありません。しかしUEのエディタでPlayすると切り替わってカメラが設置されたように見えるのは、デフォルトでプレイヤーの開始位置をPlayer Startの位置と向きにするように設定されているからです。
プレイヤーの開始位置を任意の位置に設定することもできます。以下のリンクにてその方法が紹介されています。最初のうちはあまり気にしなくてよいでしょう。
🔗 参考リンク
Unreal Engineデベロッパードキュメント
PIE で Player Start を無視する
Cameraコンポーネントを追加したPawnブループリントクラスを作成してレベル上に配置すると、小さい画面でカメラが映した画像が表示されます。Pawnについては別の機会で説明しますので、ここではまだ理解しなくても大丈夫です。
ワールドアウトライナ
🔗 参考リンク
Unreal Engineデベロッパードキュメント
ワールド アウトライナー
詳細パネル
🔗 参考リンク
Unreal Engineデベロッパードキュメント
詳細パネル(Inspectorウィンドウ)
コンテンツブラウザ
アセットを置くところです。
🔗 参考リンク
Unreal Engineデベロッパードキュメント
アーティスト向けクイックスタート コンテンツブラウザ(Projectウィンドウ)
コンソール
UnityでデバッグのためにPlayを実行するときは、Debug.Logを使いますが、UE BPではPring Stringノードを使います。例えば以下のようなブループリントを作成します。
実行するとレベルが表示されているウィンドウの左上に表示されます。
表示されますが、デバッグなどで実行の記録を追うときには不便なので、UnityのConsoleウィンドウと同じように表示させるようにします。
エディタ > Window > Developer Tools > Output Logをオンにします。
OutputLogウィンドウが表示されます。

Place Actors

レベル上に配置するあらかじめ定められた目的を持ったアクタの一覧です。例えばCubeの型をしたアクタや、Lightなどです。

その他エディタ

ブループリントエディタ

マテリアルエディタ

UIデザイナ

ペルソナエディタ

ペルソナエディタは紹介のみで以降は登場しません。
Cubeを置く
UnityではHierarchyまたはScene上からメニューでCubeを配置していましたが、UEでは、Cubeをレベル上に置く方法はいくつかあります。一番簡単な方法は、Place Actorsからドラッグ&ドロップで配置します。Cubeを選択した状態でFキーを押すとフォーカスされます。
以下のサイトは引っ越しガイドや公式サイトを読むと納得できる、参考というか作者と同じ気持ちを持っている方がいてとてもわかる記事です。
🔗 参考リンク
俺に解るように説明する "Unreal.Engine.4" 入門+
レベル、シーン、マップ、ワールド、、、、う~ん

1.2 Cubeの構成

コンテンツブラウザで作成されるアクタは、Unityで頻繁に使用するEmpty GameObjectをプレハブ化したものと同じものと考えてよいです。GameObjectは初めからGameObject自体がTransform情報を持っていますが、ActorクラスはDefaultSceneRootコンポーネントがTransform情報(=Transformプロパティ)を持っています。
PlaceActorsからドラッグドロップでレベルに置いたCubeは、Cubeのメッシュがあらかじめ用意されているStaticMeshコンポーネントが追加されたStaticMeshActorクラスとしてレベル上に配置されます。StaticMeshコンポーネントが持つ、Transform情報から大きさを、StaticMesh情報から形状、Materials情報から色合いなどを取得してレベル上に配置しています。
以下の図はあとの「アクタの作成」で基底クラスについて説明する際に使用する図ですが、StaticMeshコンポーネントもDefaultSceneRootコンポーネントも、同じSceneコンポーネントを継承しています。
Transformプロパティ
Cubeの位置、回転、大きさに加え、動作可能か否かを決めています。Unityで言うところのTransformコンポーネントにあたります。
動作可能の可否は、Play時の処理の負荷に影響します。例えば動作可能にすると、ライティング処理がかかるため負荷がかかり、動作不可にするとライティング処理がベイクされる分負荷軽減されます。
StaticMeshプロパティ
CubeのStaticMeshがセットされています。Cubeの形状、頂点位置、UVマップの読み込みと、レベル上に表示しています
Collisionプロパティ
Cubeの当たり判定を持っています。
Materialsプロパティ
Cubeの色合いを決めるMaterialがセットされています。
Physicsプロパティ
Unityの場合は物理演算をするときはPhysicsコンポーネントを追加していましたが、UEの場合は既にプロパティとして用意されており、有効化することで使用できます。
PlaceActorsからドラッグドロップでレベルに置いてCubeを作成する以外にも、新規にActorクラスにStaticMeshコンポーネントを追加してCubeのメッシュ情報を持たせることでCubeを作成することができます。新規にActorクラスを作成するのは「アクタの作成」で説明します。

1.3 視点を動かしてみる

視点の操作はマウスやキーボードの操作になりますので、以下のようにまとめておきます。
ビューポートの視点操作(カメラではありません)
  • 右クリック + マウス移動 > 視点を回転
  • 右クリック + WSキー > 視点を前進後退
  • 右クリック + ADキー > 視点を左右平行移動
  • マウスホイール押しながらマウス移動 > 視点を上下左右移動
  • Ctrl + マウス移動 > 視点を軸固定移動、ただし上下前後には動かない
🔗 参考リンク
UnrealEngine5の教科書 [ゲーム開発入門編,第一巻]
ビューポートのカメラ操作 [UE5入門 #3-4]

1.4 アクタの操作と編集

アクタの操作はマウスとキーボードの操作になりますので、以下のようにまとめておきます。
  • Shift + ドラッグ > アクタを中心に移動
  • Alt + ドラッグ > 複製
  • ショートカットキー > W 移動
  • ショートカットキー > E 回転
  • ショートカットキー > R 拡大
  • ショートカットキー > F フォーカス
Unityと同じくアクタの編集も可能です。
  • Copy コピー
  • Paste 貼り付け
  • Rename 名前変更
  • Duplicate 複製
  • Delete 削除

1.5 アクタの作成

アクタを作成する前に、アクタを作成するために必要なブループリントを説明します。ブループリントとは、変数、コンポーネント、それらをどう動かすかを記述したイベントグラフを含んだ"設計図"です。ブループリントの種類は大きくブループリントクラスとレベルブループリントの二種類があります。
ブループリントクラスは、主にアクタを作成する時に使用する、アクタの振る舞いを決める設計図です。レベルブループリントとは、レベルに関する設計図です。ブループリントクラスにはないレベルブループリント独自の機能があります。
「15.ブループリントクラス」で説明しますが、ブループリントクラスは、Unityに例えるならばヒエラルキーにゲームオブジェクトを作成してから、ヒエラルキーまたはシーンからプロジェクトに置いたプレハブと同じです。(UE5極める本P207)

アクタ以外の、例えばPlayerControllerやBlueprint Interface、GameModeをつくるときもブループリントクラスを使って設計します。
以下よりUnityでゲームオブジェクトを作るように、ブループリントクラスでアクタを作成するための説明をします。
最初にブループリントクラスを作成するときは、何を親クラスにするかを聞かれます。
アクタのことをActorと表記したりしますが、カタカナと英語は同じ意味です。~クラスと表記する場合は英語で表記することにしてます。親クラスの候補として挙げられているこれらのクラスで、全てActorクラスを継承しています。PawnクラスはActorクラスを継承し、CharacterクラスはPawnクラスを継承しています。"基底"とは、親のまた親を辿った大元のクラスのことで、Actorクラスをベースとしているものです。継承関係を基に作成したものが下図になります。
これらは、説明で出てくるクラスとコンポーネントをピックアップしたもので、他にもたくさんあります。
その他いろいろとは、Actorを継承したクラスは他にもたくさんあります。確認方法は、キーワードで"Actor"と検索すると確認できます。
📝 メモ
※Actorクラスを継承しているのはUObjectクラスです。なのでUEにおける基底クラスはActorではなくObjectですが、UE BPで作成するときは気にしなくてもよいのでここでは基底クラスはActorクラスとしています
StaticMeshActorやSkeltalMeshActorを親クラスに選びたいときは、検索枠からキーワードを入力すると出てきます。ここで出てきたStaticMeshとSkeltalMeshについて簡単に説明すると、3Dモデルを作成するときにボーンが入っている(Skeltal)かいない(Static)かで判別します。ボーンとは骨または骨格を指し、ボーンの動きに基づいて3Dモデルのメッシュに動きを与えてアニメーションポーズをとることができます。UEは描画処理の効率化を図るためにSkeltalMeshとStaticMeshに使い分けています。
UnityではGameObjectがデフォルトでTransformコンポーネントを持っているように、UEでレベル上に配置するアクタを作成するときは、以下の図のようにTransformプロパティのあるSceneコンポーネントを基底とする何らかのSceneコンポーネントを持つ必要があります。
イメージ図としては以下のようにできるかなと思います。
DefaultSceneRootコンポーネントはTransformプロパティをもつこと以外は何も機能をもたないSceneコンポーネントを継承したコンポーネントです。
📝 メモ
※ 継承関係を上記で図示しようとして調べたときに、DefaultSceneRootコンポーネントは何を基底にして継承しているかを見つけることができませんでしたが、おそらくSceneコンポーネントかその子のコンポーネントを継承していると推測できます。
次に、前の「Cubeの構成」で紹介しました、Cubeで使用したStaticMeshブループリントクラスの詳細パネルを見てみます。StaticMeshクラスのブループリントクラスで使用しているStaticMeshコンポーネントは、Transformプロパティの他に、StaticMeshプロパティ、Materialsプロパティ、Collisionプロパティがあります。Unityではシーン上の位置、形状、材質、当たり判定それぞれの情報をコンポーネントで実装していますが、UEでは1つのコンポーネントの各プロパティから実装していることがわかります。
ActorブループリントクラスとStaticMeshActorブループリントクラスの構成を比較しますと、StaticMeshActorブループリントクラスで使用するStaticMeshコンポーネントは、StaticMeshプロパティ、Materialsプロパティ、Collisionプロパティが追加されていることがわかります。
他のクラスの構成も見てみます。

Pawnクラス

ActorクラスとPawnクラスの違いは、プレイヤーとして操作できるクラスがPawnです。PlayerControllerは、「Pawnと、Pawnを操作する人プレーヤー間のインターフェース」です。PlayerControllerはActorクラスではなく、Pawnクラス、またはCharactoerクラスの場合に基本的に人プレイヤーの意思を表します。PawnとPlayerContollerの関係をフレームワークとして図示します。UEブループリントのフレームワークについては別の機会で説明したいと思います。さらに人間がプレイヤーとして操作するPlayerControllerとAIがプレイヤーや敵、味方になって操作するAIControllerがあります。図内ではわかりやすく自キャラと敵キャラに分けてますが、AIContollerが味方キャラとして振る舞うこともできます。PlayerControllerとPawnの関係を結びつけるにはGameModeというもので設定する必要がありますが、こちらも別の機会で説明したいと思います。
PawnとPlayerControllerの関係をイメージすると以下の図のようになります。
🔗 参考リンク
俺に解るように説明する "Unreal.Engine.4" 入門+
クラス"Class"って、プロパティが違うアクタ"Actor"ってこと?
🔗 参考リンク
Unreal Engineデベロッパードキュメント
PlayerController

Characterクラス

Characterクラスを使うと、PlayerControllerを使ってプレイヤーの操作をすることができるとともに、CharacterMovementコンポーネントを使ってプレイヤーにいろいろな動きを与えることができます。プレイヤーに歩かせたいという場合は以下のイメージ図のようになります。
Characterブループリントクラスで使用しているコンポーネントでCharacterMovementコンポーネントを使用していますが、これはアクタを移動させるコンポーネントで、Movementコンポーネントの一つになります。Movementコンポーネントにも種類があります。CharacterやPawnでなくても使えます。
以下のコンポーネントのうち、Projectile MovementコンポーネントとInterp To Movementコンポーネントは、第5章の実践編で具体的な使い方を紹介します。
Movementコンポーネントは、AI ControllerまたはPlayer Controllerがないと動きません。
  • Projectile Movement
  • Rotating Movement
  • Interp To Movement
  • Character Movement

SkeltalMesh

SkeltalMeshのアセットの構成は以下の図になります。
Actorを親クラスにしない他の親クラス
PlayerControllerクラスは、Controllerクラスを継承し、ControllerクラスはActorクラスを継承しています。
参考までに公式からアクタの種類を紹介しているサイトを紹介します。
🔗 参考リンク
Unreal Engineデベロッパードキュメント
一般的なアクタの種類
かなり前置きが長くなりましたが、これからブループリントクラスからアクタを作成します。
エディタから、Add/Importボタンを押します。
ブループリントクラスをクリックします。
Actorボタンをクリックします。
適当に名前を決めます。名前はここではデフォルトのNewBlueprintにしておきます。同じフォルダ内で名前が重複しているとエラーになります。現在のContentフォルダ内で名前が重複しないようにしましょう。
作成したら、NewBlueprintをコンテンツブラウザからビューポートにドラッグ&ドロップしてレベル上に置きます。
ワールドアウトライナに作成したNewBlueprintが表示されていることを確認します。
コンテンツブラウザからNewBlueprintをダブルクリックして、ブループリントクラスエディタを開きます。
ComponentsパネルのNewBlueprint(self)を選択すると、親クラスがActorになっていること、DefaultSceneRootが追加されていることがわかります。
DefaultSceneRootコンポーネントを選択すると、英語で「コピー、名前の変更、削除はできないこと、他のSceneコンポーネントと置き換えることは可能」という説明が記載されています。
コンテンツブラウザにあるアセットのうち、スタティックメッシュ、スケルタルメッシュ、パーティクルシステム、サウンドキュー等のみについては、ドラッグ&ドロップしてコンポーネントとして直接追加することができます(逆引き p.66)。