UE4の勉強記録

UE4の勉強の記録です。個人用です。

「Unreal Engine4.xを使用してRPGを作成する」の足りない部分を作成する。レベルデザインをする

<前文>

f:id:kazuhironagai77:20191027202819p:plain

最近、YouTubeオイラーの等式についての動画を見て、それが結構面白かったので、今週は、オイラーの等式に関しての私の個人的な意見を書こうと思います。

f:id:kazuhironagai77:20191027202849p:plain

f:id:kazuhironagai77:20191027202917p:plain

こう書くのはどうなんでしょう。美しさをかなり失っていると思うんです。

0! (0の階乗)が1って納得出来ますか。私はその事を全然知らなくて、0!はずっと0だと思っていました。ある時、物理化学の問題を解いていて、0!を0として計算していたらどうしても答えが合わない。0! が1なら答えが合う。となった時、調べて見たんです。そしたら0!は1だったんです。でも0!が1とは納得は出来なかったです。だって1は普通の数字じゃないですか。こういう何か特別な時に出てくる数は何か神秘的な数字なはずでしょう。πとか0みたいな。それでずっと0!が1って心に引っかかっていたんです。そしたらオイラーの等式

f:id:kazuhironagai77:20191027203034p:plain

と書いてある教科書に出会ったんです。これみて、やっぱり1も特別な数字なのかもしれない。と思ったんです。結構感動したので、この事を凄い優秀と噂のある先輩のプログラマーにある時、話したんです。そしたらその先輩が、そら俺たちプログラマーに取っては0と1は特別でしょう。って。

うん。やっぱりオイラーの等式

f:id:kazuhironagai77:20191027203103p:plain

こう書くのが美しいですね。

それでは勉強を始めていきます。

<本文>

今回は、レベルデザインをします。レベルデザインは全く勉強した事がありません。した事がないので基本からの勉強になります。後、私はデザイナーではないので基本だけ勉強して、適当に作成します。

まず、Fast Travel Within A single Level and Multiple Levels - (UE4)を勉強します。この動画前々から見たかったのですが、忙しくて見る暇がありませんでした。私が今回作成したいレベルは、いわゆるオープンフィールドではなく、5つ位の別々のフィールドがあり、それぞれのフィールドにまた別のレベルで町があるような感じです。この動画を勉強したらそれが実現出来そうなので、まず見てみます。

ブレインストーミング

どこまで勉強するのか?

  1. レベルデザインの基本を勉強する。
  2. 別のレベルに移行する際に気を付ける事を学ぶ。
  3. UE4C++で書いた方が良い事があるのかどうかを調べる。

これ位は、今回やりたいと思います。

1. レベルデザインの基本を勉強する。

まず、1のレベルデザインの基本ですが、ネットでチュートリアルを探してみます。

f:id:kazuhironagai77:20191027203328p:plain

https://www.youtube.com/playlist?list=PLL0cLF8gjBpo3EUz0KAwdZrDYr6FzfLGG

22番目まであって結構長いですね。ただ内容は本当の初心者向けみたいですね。

公式のサイトにもありました。

f:id:kazuhironagai77:20191027203414p:plain

https://docs.unrealengine.com/en-US/Engine/QuickStart/index.html

これはずっと昔、UE4を初めてダウンロードした時に勉強した記憶があります。本当に基本の基本しか教えていなかったと思いますが、復習には丁度いいかもしれません。それに町の中の建物のデザインにそのまま使用出来る気がします。

f:id:kazuhironagai77:20191027203512p:plain

https://docs.unrealengine.com/en-US/Resources/ContentExamples/LevelDesign/index.html

こんなページも見つかりました。レベルデザインのワークフローを説明しているページみたいです。

日本語の教科書も、もう一度復習すべきでしょうね。

と言っても私が持っている日本語のUE4の教科書でレベルデザインに関係してそうなのは、

  • Unreal Engine4で極めるゲーム開発
  • 見てわかるUnreal Engine4ゲーム制作超入門
  • Unreal Engine4マテリアルデザイン入門

の三冊だけですが。

まず、「Unreal Engine4で極めるゲーム開発」ですが、

  • 6章3節  BSPでレベルをデザインする
  • 8章2節 初めてのレベルストリーム
  • Appendix B Construction Script

を読み直します。この本を買ったのはUE4を初めてダウンロードした時でした。あの時は全く意味を理解しないで暗中模索の中、ひたすらこの本に書かれていた事を実行していました。のであんまり覚えていません。ですが、付属のビデオが分かり易かったのは今でも覚えています。今見ると、かなり高度な内容も含まれている様に思えます。勉強し直すには丁度いい時期なのかもしれません。

次に、「見てわかるUnreal Engine4ゲーム制作超入門」ですが、

この本は、Unreal Engine4で極めるゲーム開発と一緒に買った本ですが、当時、全然勉強しなかったです。理由は下らないのですが、当時のepic game社の日本語版のランチャーを開くとお勧め書籍が出てくるのですが、何故かこの本だけ紹介されていなくて、何となく不安になってこの本での勉強を止めてしまいました。

今見直すと、

  • 2章2節 レベルを構成する部品について
  • 4章1節 ランドスケープを作ろう
  • 4章2節 ペイントツールとフォリッジツール

の部分がレベルデザインと関係していそうですね。読み直します。後、アクターについてまるまる1章使って解説していたりして、今、読んだら結構面白そうです。

最後の「Unreal Engine4マテリアルデザイン入門」ですが、これは全部必要と言えば必要ですが、内容が専門的すぎるので、今回はパスします。

2. 別のレベルに移行する際に気を付ける事を学ぶ。

次に2の「別のレベルに移行する際に気を付ける事を学ぶ。」ですが、これは、Fast Travel Within A single Level and Multiple Levels - (UE4)を勉強すれば大丈夫と思っています。多分、別なレベルに移行するために必要な事は全て教えてくれるでしょう。

私が今知っている事は精々、ゲームモードのデータは消滅するのでゲームインスタンスに全部のデータを保存しないといけないと言う事くらいです。

3. UE4C++で書いた方が良い事があるのかどうかを調べる。

もう調べ方すら分からないですね。何かブループリントに書き込む事が有れば、それをUE4C++で書く事ぐらいですかね。ひょっとすると別のレベルに移行する時に、必要になるかも知れませんね。

そう言えば、Unreal Engine 4 Scripting with C++ Cookbookでランドスケープの何かをUE4C++で作成しましたね。それを見てみます。

Chapter 12: Working with UE4 APIs

  • Landscape API – Landscape generation with Perlin noise
  • Foliage API – Adding trees procedurally to your level
  • Landscape and Foliage API – Map generation using Landscape and Foliage APIs

が関係していますね。必要になるかは不明ですが、読み返すぐらいはしておきますか。

Fast Travel Within A single Level and Multiple Levels - (UE4)を勉強する>

Fast Travel Within A single Level and Multiple Levels - (UE4)

兎に角、このチュートリアルをやらないと話が始まらないので、やって行きます。

このチュートリアルのために新しいプロジェクトを作成しました。バージョンは4.23.1でプロジェクト名はLeveLTestです。(と思ったら間違えてLevetTestと打ってしまいました。まあ問題ないでしょう。このまま行きます。)チュートリアルではどんなテンプレートを選択したのかは明確には説明されていませんが、画像からThirdPersonが選ばれたのは間違いありません。BlueprintでThirdPersonを選びました。

f:id:kazuhironagai77:20191027203757p:plain

作ってから気が付いたのですが、チュートリアルではStarterContentを含んでいました。以下にチュートリアルからのスクリーンショットを示します。今回は、多分の沢山のスクリーンショットチュートリアルから取る必要があると考えられます。チュートリアルから撮影したイメージは、以下のように水色の外枠で表示する事にします。

f:id:kazuhironagai77:20191027203818p:plain

Add newからAdd feature or content packを選択してStarterContentを選択し追加しました。

f:id:kazuhironagai77:20191027203838p:plain

最初に、以下に示すテキスチャ―を使用しますと、しかしどこから手に入れる事が出来るのでしょうか?

f:id:kazuhironagai77:20191027203859p:plain

最初の2つのボタンは自分で作成したと言っています。最後の地図はWorld of Warcraftから拝借したと言っていますので、ネットで探してみます。

ボタンの方は自作する必要があるみたいですが、画像のサイズが分かりません。使用する段階で作成する事にします。

1.2つのenumを作成する

f:id:kazuhironagai77:20191027203929p:plain

まず、一つ目のenumの名前をMapとします。以下に示すようにEnumeratorを指定します。

f:id:kazuhironagai77:20191027203956p:plain

2つ目のenumはZoneと名付けます。中身は後で作成します。

f:id:kazuhironagai77:20191027204015p:plain

2.3つのマップを作成する。

ThirdPersonExampleMapを複製する事で3つのマップを作成します。

まず、ThirdPersonExampleMap の名前をmap1に変更します。

f:id:kazuhironagai77:20191027204044p:plain

そして、壁を全部消し、LandScapeを追加します。

f:id:kazuhironagai77:20191027204113p:plain

赤く表示されているメッセージを消すために、Skylightをダイナミックに変更します。そのためには、Skylightとlight sourceをMovableに変更します。

f:id:kazuhironagai77:20191027204135p:plain

消えました。スゴイですね。初めてこんな方法があると知りました。

Landscape MaterialにM_Ground_Grassを選択します。

f:id:kazuhironagai77:20191027204204p:plain

ここからMap1を複製してMap2とMap3を作成します。

f:id:kazuhironagai77:20191027204225p:plain

Map2のLandScape MaterialをSandstoneに変更します。

f:id:kazuhironagai77:20191027204300p:plain

同様にMap3のLandScape MaterialをM_Rock_Slateに変えます。

f:id:kazuhironagai77:20191027204325p:plain

3.WayPointアクターを作成する。

ここまで、で40分のチュートリアルの内、3分しか経っていません。流石に今回は編集しないといけないかもしれません。

アクタークラスのブループリントを作成します。名前をWayPointと名付けます。

f:id:kazuhironagai77:20191027204352p:plain

一々記録していくととんでもなく長くなってしまうので、結果だけ記録します。

Cylinder, cube, arrow, そしてtextを使用して以下に示す形を作成しました。

f:id:kazuhironagai77:20191027204426p:plain

更に、以下に示すコードをConstruction Scriptに追加しました。

f:id:kazuhironagai77:20191027204444p:plain

ブループリントのConstruction Scriptとは、C++におけるConstructorのようなものと考えてますが、今一分かっていません。もう一度復習が必要です。

f:id:kazuhironagai77:20191027204502p:plain

Map1内の適当な位置に配置します。

4.GameInstanceを作成する。

f:id:kazuhironagai77:20191027204529p:plain

作成しました。更に以下に示すように変数を2つ追加しました。

f:id:kazuhironagai77:20191027204548p:plain

更にzoneのenumeratorを定義しました。

f:id:kazuhironagai77:20191027204607p:plain

4.地図を表示する。

まず、Widgetブループリントを作成しました。

f:id:kazuhironagai77:20191027204633p:plain

ネットからダウンロードした地図とボタンを貼り付けました。ボタンは自作しました。

f:id:kazuhironagai77:20191027204651p:plain

ThirdPersonCharacterのブループリントに以下に示すコードを追加しました。

f:id:kazuhironagai77:20191027204712p:plain

いつものwidgetを表示させるヤツですね。

テストします。

f:id:kazuhironagai77:20191027204729p:plain

普通に表示されましたね。

このチュートリアルでは、地図を消してもマウスが一時的に表示されるのを止めるために以下の関数を使用していました。

f:id:kazuhironagai77:20191027204752p:plain

f:id:kazuhironagai77:20191027204801p:plain

ふーん。となりました。この関数について勉強が必要ですね。

5.GameInstanceにカスタムイベントを2つ作成する。

f:id:kazuhironagai77:20191027204832p:plain

一つ目のイベントはChangeMapです。インプットの値によって、違うマップを開きます。

f:id:kazuhironagai77:20191027204920p:plain

次のイベントは、ChangeZoneです。Zoneを変えます。Change Zoneマクロが使用されています。

f:id:kazuhironagai77:20191027205006p:plain

Change Zoneマクロの内部は上記のようになっています。

C++でもマクロはあまり使用しないので、はっきりは言えないですが、これなら関数で作成したほうが良いような気がします。ちょっとC++のマクロを勉強し直してはっきり言えるようにします。

6.MapWDのボタンに機能を追加する。

f:id:kazuhironagai77:20191027205051p:plain

付け加えたコードはこれだけです。ChangeMapはマクロで以下に示した通りです。

f:id:kazuhironagai77:20191027205122p:plain

またマクロで作成しています。

7.マイナーなミスを直す。

f:id:kazuhironagai77:20191027205152p:plain

マップを閉じた時に上記のコードが呼ばれるはずですが、テレポートした時は、マップが自動的に閉じてしまうために上記のコードが呼ばれません。それを直します。

f:id:kazuhironagai77:20191027205310p:plain

上記に示したように、カスタムイベントでresetを追加します。

MapWDのマクロであるChangeMapに以下に示すコードを追加します。

f:id:kazuhironagai77:20191027205357p:plain

はい。

残りはmap2 とmap3で今までの手順を繰り返すだけなので結果だけ示します。

f:id:kazuhironagai77:20191027205502p:plain

f:id:kazuhironagai77:20191027205510p:plain

好きな所にワープ出来る様になりました。

Fast Travel Within A single Level and Multiple Levels - (UE4)の考察>

もうこれを追加するだけでいいです。いいですが、その他のチュートリアルも一応チェックはしときます。

しかし、その前に考察はしないといけません。やった勉強が無駄になってしまいます。

このチュートリアルで、考察しなければならない課題は3つあります。

  1. 2つ以上のStatic Mesh Componentを使用してアクターの形を作成する事について
  2. SetInputModeGameAndUI()BP関数とSetInputModeGameOnly()BP関数について
  3. BP内で関数を作成するかのようにマクロを使用する事について

それではやっていきましょう。

1.2つ以上のStatic Mesh Componentを使用してアクターの形を作成する事について

あまりアクタークラスについて良く知らないと言えばそうですし、ブループリントを中心に扱う人にとっては当然なのかもしれませんが、結構驚きました。

以下に示したのは、Starterkitに付属のBlueprint_CeilingLightですが、Static Mesh Componentは一つしかありません。

f:id:kazuhironagai77:20191027205652p:plain

f:id:kazuhironagai77:20191027205659p:plain

私が知っているアクターの作成方法はこれだけでした。

この方法を使用すれば、パーツのみをBlenderで作成してそれの組み合わせて色々なアクターが作成出来ますね。正し、全てのアクターに採用されていない所を見ると、長所だけでなく短所もあるのかもしれません。

UEC++からアクターを作成した場合は、どのような影響があるのでしょうか。

以下のように、今まで一回だけ変数の宣言をしていた事を何回もするようになるのでしょうか?

f:id:kazuhironagai77:20191027205754p:plain

うん。まだ分かりませんね。

2.SetInputModeGameAndUI()BP関数とSetInputModeGameOnly()BP関数について

WTF Is? Controller: Set Input Mode in Unreal Engine 4 ( UE4 )を見ました。正直このサイトさえ見れば完璧に理解出来ると思ったのですが、思ったより全然複雑でした。

f:id:kazuhironagai77:20191027205829p:plain

まず、上記の図を使用してキーボードやマウスからのインプットがどのようにゲーム内に伝わるのかを説明しているのですが、この図初めてみた。と言うか、如何なるUE4のワークフローも今まで見た事ないです。どっかにUE4のワークフローを教えるサイトとかがあるのでしょうか?と大変不安になりました。

それは、ともかくとしても、

  • SetInputModeGameAndUI: ゲーム内とUIの両方がコントロールできる。
  • SetInputModeGameOnly: ゲーム内だけコントロールできる。
  • SetInputModeUIOnly: UIだけコントロールできる。

ぐらいの事だと推測していたのですが、そして大体はそれは正しいのですが、色々使用するに当たって細かい点に注意しないといけないみたいです。

その細かい点の説明が良く分からないです。

例えば、コメント欄に、

f:id:kazuhironagai77:20191027205918p:plain

みたいな質問がありましたが、Setting the input mode to Game Only but setup a system so that the Player…の所から何を言っているのかもう分からないですね。

結論は、これらのBP関数を使ってみます。それで、問題にぶち当たったらもう一度、勉強し直す事にします。

3.BP内で関数を作成するかのようにマクロを使用する事について

これだけは、ちょっと心配なんですが。

まず、C++のマクロに関して復習します。(このサイトを参考にしました。)

まずマクロを使用しない方が良い理由は

  1. スコープがない。
  2. テキストを変換しているだけ。

でした。

一つだけテストしたいと思います。

f:id:kazuhironagai77:20191027210004p:plain

https://www.fluentcpp.com/2019/05/14/3-types-of-macros-that-improve-c-code/より引用

f:id:kazuhironagai77:20191027210026p:plain

間違ったマクロの使用方法としてこのサイトで紹介されている例です。これをブループリントで作成してみます。

もしC++と同じ結果がブループリントでも得られれば、C++のマクロを理解せずにブループリントでマクロを使用する事は危険と判断出来ます。

f:id:kazuhironagai77:20191027210045p:plain

つ、作れない…。

C++における間違ったマクロの使用方法を再現するためには、そもそも++xをパラメーターの値としてパスする必要があるのですが、それのやり方すら分からないですね。

私がブループリントのマクロに疎いからだけかもしれませんが、単純にC++との比較は出来ないみたいです。これはビジュアルプログラミングの利点のような気がします。もう少し使いこなせるようにならないと利点も問題点もはっきりとは言えないですが。

ブループリントというか、ビジュアルプログラミングそのものを軽く見てましたね。C++というか普通のプログラミングにはない強みがあるように思えます。これも勉強が必要ですね。

<勉強の結果>

1.https://www.youtube.com/playlist?list=PLL0cLF8gjBpo3EUz0KAwdZrDYr6FzfLGG

今回は、1.5倍速で視聴するだけにしました。

内容は、

  • ジオメトリーの作成
  • ランドスケープの作成
  • ライトについてとその配置
  • マテリアルについて
  • ポストプロセスについて
  • パーティクルシステムについて
  • 音の使用方法

などでした。

初心者向けに作成されていますが、手を抜かないで、丁寧な説明が印象的でした。ブループリントはランドスケープの作成時のランドスケープ用のマテリアルを作成した時に一回使用しただけで、ほぼ0でした。

この作者のチュートリアルは初めて見たのですが、かなり良いと思いました。

2.https://docs.unrealengine.com/en-US/Engine/QuickStart/index.html

うー。何でこんな初心者中の初心者のチュートリアルをやるはめに。しかし、やらない事には、先に進めません。ここは恥を忍んで勉強します。

f:id:kazuhironagai77:20191027210154p:plain

うーん。下手くそですが、一応操作の基本は復習出来ました。

まず、レベル内に絶対必要なアクターの種類の確認が出来ました。

  • Directional light
  • Atmospheric fog
  • Player Start
  • Lightmass Importance Mass

Lightmass Importance Massなんて懐かしい。もう使い方を忘れてしまいました。光の反射を最初に計算しとくのでしたっけ?やっぱりもう一度勉強する必要がありましたね。

3.https://docs.unrealengine.com/en-US/Resources/ContentExamples/LevelDesign/index.html

これって何かのサンプルの説明ですかね。探したらありました。

f:id:kazuhironagai77:20191027210236p:plain

これの説明だそうです。

f:id:kazuhironagai77:20191027210255p:plain

最初の階のサンプルでもかなりきれいですね。正直これで十分です。

f:id:kazuhironagai77:20191027210316p:plain

と思っていたら、全部brushで作成されていました。

f:id:kazuhironagai77:20191027210340p:plain

2層目のサンプルは

f:id:kazuhironagai77:20191027210418p:plain

staticMeshActorに変えたんですね。

勿論brushはstaticMeshActorに変えないといけないと思いますが、それ以外はどうなんでしょうね。より写実的になる事が、ゲームとして面白い事かどうかが重要ですよね。うーん。

3層目は光を加え、4層目は更に細かい変更を追加したそうですが、ここでは省きます。

以下の2つは、軽く読むだけにします。

4.「Unreal Engine4で極めるゲーム開発」

  • 6章3節  BSPでレベルをデザインする
  • 8章2節 初めてのレベルストリーム
  • Appendix B Construction Script

いきなりConstruction Scriptの話が出て来ました。しかもそこでは沢山のstatic mesh componentを使用してアクターを作成する話が出ています。この教科書を勉強した時は、本当の初心者だったので、深い意味は分かりませんでしたが、今読むと結構、勉強になる話が書かれています。ただし、大きなゲーム会社での話が中心で、一人でゲームを作成する場合は参考にならない話が多いとも思いました。後、UE4C++の話がないのは片手落ちな気がします。絶対読んでおかないといけない本ですが、この本を読めば全て足りる本ではない。というのがもう一度読み直してみた時の感想です。

レベルデザインに関してですが、6章から8章まで全部重要な話でした。ただレベルデザインとして説明するのではなくゲームの作成のための技術として所々で説明されているので、ちょっとまとめづらいです。のでここではまとめません。

5.「見てわかるUnreal Engine4ゲーム制作超入門」

  • 2章2節 レベルを構成する部品について
  • 4章1節 ランドスケープを作ろう
  • 4章2節 ペイントツールとフォリッジツール

こっちは、UE4エディターの操作方法を説明するのが目的の本の構成になっています。それ故か、結構分かり易かったです。ただ題名に書かれているように超入門レベルで、それ以上の内容はないですね。アクターが書かれている章を読んだのですが、アクターが何であるかの説明ではなくアクタークラスの作成方法が説明されていました。

<勉強のまとめと感想>

日本のUE4の教科書はデザイナー向けに書かれているのにブループリントのプログラミングを完全にこなす事を要求しているように見えますね。これってどうなんでしょうね。効率悪いと思うんですが。やっぱりそういう点でもなるだけプログラミングはUE4C++で書いた方が良いと思いました。

今回、レベルデザインの勉強をして感じたのは、バイリンガルで良かった。と言う事です。日本語の教科書だけでは質はともかく量が全く足りていないと思います。特に英語圏では、アメリカと英国+ヨーロッパだけでなく、インド系の非常に質の高いチュートリアルまで見れるのは、感動モノでした。

本当はレベルの実装までやる予定だったのですが、時間的に無理でした。レベルの実装は来週やります。