UE4の勉強記録

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

UE5の勉強 -映像作品としてのLandscapeを作成する-

1. 今週の予定

1.1 今週の予定

以下の内容を勉強します。

<Landscapeの作成>

先週勉強したTutorialの続きを実装します。

Niagaraの勉強>

先週、作成したアニメ調の炎の実装を最適化します。

<Materialの勉強>

Ben Cloward先生のAdvanced Material Seriesの勉強をします。

<Gaeaの勉強>

Earth and Space Sciences XのLecture 9の残りを勉強します。

GaeaのTutorialの作成の続きをやります。

<Houdiniの勉強>

Free Time Coder氏のUnreal PCG Tutorial [1]の続きを勉強します。

<UEFNの勉強>

インベーダーゲームを作成します。

<DirectX12の勉強>

DirectX 12の魔導書」と「Direct3D 12 ゲームグラフィック実践ガイド」の勉強をやります。

2.Landscapeの作成

2.1 Unreal Engine 5.1Beginner Tutorial - UE5 Starter Course 2023 [2]の続きを実装する

<Corridor>

以下の様に壁を作成しました。

使用したStatic MeshはTutorialは同じです。

更に以下の様に柱を追加して見た目を調整しました。

屋根と鉄橋を追加しました。

<Watching Tower>

以下の様に作成しました。

Group化して他の場所にも配置しました。

Watching Towerの影もしっかり写っています。

Pipeを追加しました。

壁が光って見える程光を反射しているのにPipeは真っ黒です。

変ですね。

トタン板も配置しました。

<Piping System>

Pipingを作成します。

以下のAssetをMegaScanからDownloadしました。

以下の様に作成しました。

Group化します。

Group化した後にDuplicateしました。

Pipeの足元はどうすれば良いのか分かりません。

見たら以下の様に足元つけるAssetがありました。

高さが微妙に違っています。

うーん。

もう一回作成し直します。

以下の様になりました。

Pipeはどうやって配置すれば良いのか分かりませんね。

取りあえずこれでOKとします。

Fire hydrantを追加します。

Safetyを追加します。

Tableを追加しました。

掃除する機械も配置しました。

梯子とwheelbarrowを追加しました。

他の建築機材も追加しました。

もう時間が無くなってしまいました。

今週はここまでとします。

3.Niagaraの勉強

今週は、先週作成したアニメ調の炎の実装を最適化します。

3.1 Materialの最適化

ここでは黒以外の炎の色とそれぞれの色のサイズをParameter化してMaterial Instanceから指定出来るようにします。

まず炎の一番外側の黒い部分です。

以下の赤線で囲った部分で黒い炎のサイズをMaterial Instanceから指定する事が出来るようにしました。

炎の中心の色の部分です。

Fire Inside Colorノードが炎を色を指定するためのParameterになります。

Fire Inside Size MinとFire Inside Size Maxが内側の炎のSizeを指定するためのParameterになります。

最後の炎の外側の部分です。

ここでは色の指定をParticle Colorノードでしています。

これをどうするのが最適なのかまだ分かりません。

当然NiagaraでParticleの色を操作したい場合は、Particle Colorノードを使用すべきですが、今回は全部の色をMaterial Instanceから操作しても良い気もしています。

その場合、NiagaraのModuleから色を指定したらどうなるんでしたっけ。

憶えていません。

取りあえずはParticle Colorノードはこのままにしておきます。

次に炎の真ん中のSizeをFire Outside Size MinノードとFire Outside Size Maxノードで指定しています。

本来ならFire Outside Size Maxノードの値とFire Inside Size Minノードの値は同じにしないといけません。

もし差があるとその部分が重なったり、隙間が空いたりします。

でも今回はこの2つのParameterは同じにしました。

最後に炎の外縁を決める実装です。

この値はParameterにはしませんでした。

もしParameterにするなら、この値は以下のBlack Size Minと同じ値にする必要があります。

取りあえずこれで試してみます。

Material Instanceを生成しました。

このMaterial InstanceをNiagaraのSprite Renderer ModuleのMaterialにセットしました。

以下の様になっています。

まず色を変えてみます。

黄色くしました。

結果です。

炎の中心が黄色くなりました。

今度は炎の黒い部分を増やしてみます。

Black Size MaxとFire Outside Size Minの値を0.2から0.3に変更しました。

結果です。

黒い部分が大きくなりました。

しかしこのParameterの設定方法は分かりにくいです。

一端、Default値に戻します。

今度は、内側の炎を大きくします。

結果です。

大きくなっています。

一応、想定していた操作は全部出来るようになりました。

<境界をOverlapさせてみる>

Orangeと赤の境界をOverlapさせてみます。

Fire Inside Size Minの値とFire Outside Size Maxの値を以下の様にしました。

結果です。

うーん。

Orangeの部分が増えている気がしますね。

色を変えて確認します。

緑色にしました。

結果です。

あれ?

緑色になりませんね。

うーん。

分かりました。

多分これが原因です。

赤い色の部分を指定している実装です。

こんな形状をしています。

今度はOrangeの部分の形状です。

以下の形状になります。

うーん。

これは被っていますね。

Smooth Stepの機能を理解していなかったですね。

公式のMath Material Expressions [3]のSmooth Stepの説明を読みます。

うーん。

これを読む限り私の解釈は合っていますね。

よく分からんので外側の炎の形状から内側の炎の形状を引く事にしました。

これならどうやっても炎の形状が被る事はありません。

結果です。

内側が緑の炎を作成しました。

色が重なっていないので緑の炎は緑になっています。

うーん。

この場合だと、内側が外側の炎にOverlapした場合は必ず内側の炎の色になりますね。

そして内側と外側の炎に隙間が有る場合は外側の炎の色になります。

ので以下の2つで炎のSizeをControl出来るようにしました。

Fire Inside Sizeの値を大きくします。

0.5から0.7に大きくしました。

結果です。

内側の炎が小さくなりました。

次にFire Inside Sizeの値を小さくします。

結果です。

内側の炎が大きくなりました。

うーん。

逆の方が分かり易いですね。

今度はFire Outside Sizeの値を変更します。

大きくしました。

結果です。

黒い部分が大きくなりました。

赤い部分が小さくなったとも言えます。

Fire Inside Sizeの値と同じにします。

結果です。

赤い部分が無くなりました。

うーん。

これカッコよくない?

中の炎を白くしてみます。

うーん。

もう少し筆で書いたような感じが欲しいですね。

3.2 Material Instanceの最適化を行うべきかそれともこの黒い炎をもっとかっこよくすべきか?

最初はMaterialの実装が出来ない人でもアニメ調の炎の色や形状の調整が出来るMaterial Instanceの作成を使用と思っていましたが、それよりもこの黒い炎をもっとカッコよくした方が良い気がして来ました。

Materialの実装が出来ない人がアニメ調のMaterialの調整が出来るようなInstanceの作成をしてたとしても、私には何の得もないです。

この黒い炎をもっと格好良くして芸術性の高いEffectにするのは私の功績になります。

もし新しいGameを作成するとしてもこのEffectを使用すればArtの立場からもっと尖った存在になってそれだけで高評価されるかもしれません。

こっちを優先する事にします。

今週のNiagaraの勉強はここまでとします。

来週は黒い炎のEffectをもっと格好良くする事にします。

4.Materialの勉強

今週はBen Cloward先生のBricks and Stucco Shader - Advanced Materials - Episode 17 [4]を勉強します。

4.1 Bricks and Stucco Shader - Advanced Materials - Episode 17 [4]を勉強する

まず軽く見ます。

Stuccoの意味が分かりません。

調べたら漆喰の事だそうです。

Quixel Bridgeから以下のSurfaceをDownloadします。

Downloadの設定です。

DownloadしたTextureはPhotoshopを使用して以下の様にまとめます。

一枚目はDiffuseです。

二枚目はNormal Mapです。

三枚目はMask Textureで

RはAmbient Occlusion、

BはHeight Mapです。

うーん。

DownloadしたTextureにHeight Mapはありません。

どのTextureがHeight Mapになっているんでしょうか?

BにはRoughnessが入っています。

StuccoのTextureも同じ構成です。

次にUEにImportしたTextureの設定を確認します。

まずDiffuseのTextureです。

SRGBにCheckがついています。

Normal Mapです。

Flip Green ChannelをOffにしています。

いや逆でした。

このParameterがEnableしている事を確認しているだけでした。

新しいMaterialを作成しました。

名前はBrick With Stuccoにしています。

このMaterialを開いて以下の様に先程のTextureをそのままImportしました。

BrickのそれぞれのTextureを以下のInputに繋ぎました。

PreviewField of Viewを50.0にセットしています。

結果です。

Stuccoも同様に接続して結果をPreviewで確認しています。

Stuccoの方はScaleを調整します。

今度はこの2つのTextureをBlendします。

当然、Lerpノードを使用します。

LerpのMaskには以下の実装を使用します。

結果です。

何だこれはと言う感じですが、Maskはここから改良するそうです。

まず以下の実装を足します。

そしてLerpノードを追加してHeight MapとBlendします。

Maskには以下のNodeの結果を使用します。

結果です。

TutorialではLerpの後でSaturateノードを追加しています。

Height MapのDataをBlendに使用する事で以下の様な本物感が増したBlendになりましたが、StuccoのTransparencyが残っています。

今度はこれを消すそうです。

以下の実装を追加します。

LerpノードのInputにNegativeの値や1以上の値を指定しているんですが、このLogicはよく分かりません。

実装する時に調べます。

Lerpノードの結果を見ると以下に示した様に2色になっています。

2つのDataは要らないのでComponent Maskノードを使用してRの値だけ抽出します。

結果をSaturateノードに接続します。

結果です。

何とStuccoのTransparencyが消えました。

Stuccoだけの部分が非常に平で現実感が薄いです。今度はこれを直します。

StuccoのNormalだけを使用している所を以下の実装に変更しました。

結果です。

あんまり差が無いですね。

LerpノードのAlphaの値を0.8に変更しました。

今度は、本当にSubtleですがStuccoに凹凸が生じました。

最後にBrickとStuccoの境界をもっと曖昧にします。

まず以下の実装を追加します。

この実装を作成している時にBen Cloward先生、Saturateノードの位置を間違えたと、Saturateノードの位置を一寸だけ変更しました。

変更後の位置は上図の通りです。

この結果を以下の実装のLerpのAlphaに繋ぎます。

そしてこの結果をBase Color用のLerpのAに繋ぎます。

結果です。

BrickとStuccoがBlendしている箇所が確認出来るようになりました。

これで完成です。

しかしTutorialはここでは終わりません。

何故なら以下の実装の部分を変更する事で色々なMaskを実装出来るからです。

例を見せてくれるそうです。

以下の実装を追加します。

Saturateノードの結果をMultiplyノードのBに繋ぎます。

結果です。

Stuccoの位置が時間によって移動します。

次の例です。

TexCoord[0]の値をそのまま使用する代わりにNoiseを使用します。

結果です。

こっちはかなりRealです。

これでUEのTutorialは終わりです。

最後に今回のTutorialではTextureの最適化はしなかったことについて述べています。

これは実装する時はやるべきかもしれません。

この後、Unityのやり方について説明していますが、そこはSkipします。

はい。

今週のMaterialの勉強はここまでです。

実装は来週やる事にします。

5.Gaeaの勉強

今週もGeologyの勉強とTutorialの作成の2つをやっていきます。

5.1 Geologyの勉強

5.1.1 Geology 9 (Soil) [5]の勉強の続き

先週、Soil Textureまで勉強したのでその後の勉強をします。

<Soil Taxonomy>

そう、これ今週は土のTaxonomyを勉強するんでした。

<<Entisol>>

もう初っ端からWordの辞書に存在してない用語です。

この土は他のどのSoilのTypeにも属さないようです。

WikiのEntisol [6]の説明では

と書かれています。

Lectureの説明だと全てのSoilの元になる土でこの土に環境がどんな影響を与えるかによってそれぞれのSoilのTypeに変化していくんだそうです。

<<Gelisol>>

最初の例ですが、非常に寒い状態でPermafrostな状態にいるとGelisolになるそうです。

Permafrostがどんな状態なのか分かりません。

Googleで検索したら以下の結果が表示されました。

これはある種の土の名称のようで、状態を表す言葉ではないですね。

という事はEntisolが非常に寒い状態にあるとGelisolになって、GelisolはPermafrostとも言います。

が正しい理解という事ですね。

更に以下のSlideで詳しく説明されていますが、Weatheringの影響が最も少ないSoilだそうです。

このLectureの説明によるとWeatheringの影響は温度が高くなる程激しくなります。

2023-07-23のBlogで勉強したように、特に常に水が凍っている氷点下ではChemical Weatheringはほとんど発生しません。

<<Oxisols>>

Gelisolの真逆で、温かい気候の存在してWeatheringの影響を最も激しく受けたSoilをOxisolsと言うそうです。

Tropical Forestの土壌で、FeやAlがOxideしているそうです。

ClaysがLow Activityである意味は分かりませんね。

Lectureではこの辺はあんまり気にしないで良い。と言っているのでまだ私が習ってない分野の話なのかもしれません。

<<Mollisols>>

Weatheringからの影響が丁度、中間なのがMollisolsだそうです。

<<Alfisols>>

Alfisolsも同じだそうです。

そうなるとAlfisolsとMollisolsの違いが分からないですね。

この図の解説を見る限りではAlfisolsの方がAcidを多く含んでる感じがしますが、そうするとChemical Weatheringが同程度進んでいるとは考えられないですね。

<<Global Soil Regions>>

このまま全部の種類のSoilの解説をするのかと思ったら、次のSlideに移動してしまいました。

地球上のそれぞれの土の配置を示している図です。

前のSlideで解説されたSoilが地球上のどこに配置されているのかを示しています。

当然、Gellisolは北極に近い、寒い箇所です。

逆にOxisolは赤道付近の非常に暑い所に多いです。これも納得です。

Alfisolsは以下の色で表されています。

Mollisolsは以下の色で表されています。

地図で確認すると以下に示した様に隣り合って存在しているみたいです。

これ見ると世界で肥沃な土地って限られているのがよく分かりますね。

ユーラシア大陸アメリカ大陸のカナダ、USそしてメキシコのあたりだけです。

そう言えば、英語でユーラシア大陸っていったらアジア大陸(Asia Continent)だろって直された記憶があります。

英語ではAsia Continentって言うんでしょうか?

調べます。

WikiAnimated, colour-coded map showing the various continents. Depending on the convention and model, some continents may be consolidated or subdivided. [7]に分かり易い図で説明されていました。

大陸の分割方法は色々あって以下の様に7つの大陸に分割する場合はいわゆるユーラシア大陸はEurope大陸とAsia大陸になるみたいです。

以下の様に6つの大陸に分割する場合はEurasia大陸になっています。

ユーラシア大陸ってEurasia Continentって書くんですね。EuroとAsiaを足してEurasiaと言うのか。

Eurasiaの発音をYouglishで調べるとユーエイジアかエーエイジアって聞こえますね。

ユーラシア大陸って聞くと全くアジアに関係なく聞こえますが、実はアジア大陸が訛っていただけだったんですね。

成程。

長年の疑問も解けました。

しかし世界における肥沃な土地ってこんだけしかないんですね。

と思ったら以下の南アメリカの一部にもありました。

これってどの国なんでしょうか?

Brazilでした。

成程。

因みに日本は以下のような色で塗られていました。

良く見えませんが、

近畿地方の一部がAlfisolsみたいですね。残念ながらMollisolsは無いようです。

東北の一部はGellisolの色をしているように見えますね。

次のSlideです。

ここではTaxonomyにおける6つの分類を紹介しています。

生物の種、属とか目の土Versionという事です。

こういうのは英語だけとか日本語だけの方が一々訳すより圧倒的に覚えやすいです。

Order次がSuborderです。

こんなの直ぐに覚えてしまいます。

その次がGeate Groupでその次がSub Groupです。

OrderがあってGroupが有る訳です。

その次がFamilyで最後がSeriesです。

今、勉強しているSoilの種類はHorizonに関係しているのでOrdersに含まれる分類でしょうね。

次のSlideです。

人間の活動が土に与える影響についてです。

ここで人間のCarelessな活動がSoilにとんでもないDamageを与える場合がある事について語っています。

この話が何というか凄い偽善的で、人間がその土地からどれだけ農作物を得る事が出来る事がそのSoilが有効に活用されている基準になっています。

そんなの土からしたら全く関係ない話なのに、そういうのを基準にSoilがDamageを受けているとか言うだけじゃなくてその土地に住んでいる人間を非難するのは科学ではなく政治です。

まあそんな感じのSlideなので適当に聞いておきます。

<The Impact of Human Activity on Soil>

これで終わりかと思ったら次のSlideも同じ話でした。

こっちは熱帯雨林の話です。

まず以下に示した様に土の色がOrangeなんです。

これはあまり有機物やMineralが含まれていない土で農業には適さないそうです。

これは先程勉強したOxisolsだからだそうです。

それでこの熱帯雨林をCleaningするともう木が生えなくなって、草地になるか最悪砂漠化してしまうそうです。

この講義をしているHawaii大の教授も、最低の土地の利用方法と怒っています。

しかしこれをBrazil人が聞いたら「一番土地を汚しているアメリカ人に言われたくないわ。」と激怒するのは間違いないです。

アメリカ人だって自分達の好きなように土地を改良して自分好みにしているだけで、そのやり方が効率が良いのかどうかとかは、どんな基準に沿って判断するかにかかっているので一概は言えないです。

例えばUSとBrazilを比較して元々アメリカ大陸に住んでいたNativeな人種が生き残っているのかをその土地を有効活用している基準としたらBrazilの方がUSよりかなりSoilを有効活用していると言えます。

それをアメリカ人だけの基準でBrazil人を批判している訳です。

本当にアメリカ人って勝手だなとは思いました。

次のSlideです。

Human Activityが原因でErosionが起きている事を示しいます。

また偽善的な話かと思ったらこっちの話は結構深くて面白かったです。

熱帯雨林を切り開いてその上に小麦やトウモロコシなんかを栽培したそうです。

そしたらそれらの農作物では雨からの水を保持する事が出来なくて土が全部流されてしまったそうです。

当然、農業も実行不可能になってしまったそうです。

こっちの話はよく分かります。

大規模農業をやるために熱帯雨林を伐採した訳です。

となるとBusiness上の観点からも熱帯雨林を潰す以上の成果を出す必要がある訳で、それは一元的に評価出来るしすべき内容になります。

しかしその結果は数年で農地はボロボロになって穀物の生産が不可能な砂漠になってしまいました。

多分ですが、焼き畑的に更に熱帯雨林を開拓して行っているんでしょう。

これはHawaii大の教授が激怒するのも納得出来ます。

<Weathering and Ore Deposits>

このSlideではBauxiteについて説明しています。

Depositsという言葉が出て来ていますね。

沈殿物と言う意味です。

何とAluminum(アルミニウム)を得るためのもっとも経済的に効率的な方法が、このBauxiteから抽出する方法だそうです。

実際に我々が使用しているAluminumはここから集められたものだそうです。

私はAluminumは海の水を電気分解して作成しているとずっと思っていました。

うーん。

でもこれは確認案件ですね。

後で確認します。

次のSlideです。

Pyriteの意味が分かりません。

Googleったら以下の解説が出て来ました。

Fool‘s Goldの事でした。

以上でした。

5.1.2 Geology 9 (Soil) [5]を勉強した感想 

かなり面白かったです。

Geologyは地球全体を一つの塊とみなして分類、評価する学問である事を再確認しました。

Soilの週類を分類している世界地図を見るのは、今の国の発展の観点からいろいろ考察出来て非常に面白かったです。

Brazilの熱帯雨林を開拓して畑を作成する事に対して、先進国が抗議したら、Brazilがお前らだけ裕福な暮らししている癖に何言っているだと激怒した話は聞いた事があります。

その話には更に追加があって、怒ったBrazil人が熱帯雨林に火をつけて大規模な山火事を起こしたそうです。

その結果、地球の平均温度が一寸上がったらしいです。

今回のLectureを聞くと先進国がBrazilにすべきだったのは抗議じゃなくて講義だったと思います。

まあ、そんな世界情勢の話まで繋がっている今回のGeologyのLectureは面白かったです。

5.2 GaeaのTutorialの作成

先週はTemplateの実装について検証しましたが、よく考えるとGaeaで今一理解していないのがBuildの設定方法です。

今週はこれについてまとめます。

5.2.1 今までのBlogにまとめたBuildの方法を確認する

まずはこれからやって行きます。

Buildで検索を掛けたら他のBuildの結果も引っかかって来てGaeaのBuildの記録が見つかりません。

仕方ないのでPng8で検索してみました。

そしたら以下の2つのBlogが検索に引っかかりました。

2022-07-25のBlog

ここではKlaus氏のUnreal Engine 5 : How to Create a MASSIVE Open World Landscape (100 km2 map) - UE5 Tutorial [8]を勉強しています。

ここでは実際に作成したTerrainの高さを調べる方法が紹介されていました。

結果も示しています。

これは後で試してみます。

後、こんな事を述べている箇所がありました。

これって勘違いして書いている可能性があります。

これも後で確認します。

2022-09-12のBlog

ここではKlaus氏の How To Create An Open World Snow Landscape | Unreal Engine 5 Tutorial [9]を勉強しています。

Buildの設定方法については特に記録に残す事は言っていません。

Height MapはPng、それ以外のMaskはpng8でExportするとか

それ以外の設定は以下の様にするとしか書いていません。

最初のMethodは無料版を使用しているのでNormal Buildしか使用出来ません。

次のResolutionも無料版でUEに使用出来る最大の値は1009です。

ColorSpaceはよく分かりません。

Rangeですが、これはHeight Mapの高さを指定してるはずです。

Normalizedを選択するとこのTerrainの一番高い箇所が1にセットされると考えています。

Baked CacheがStrictになっています。

Gaeaを開いてBaked Cacheを確認したら以下の様に書かれていました。

要はそれぞれのNodeで計算した結果をそのまま使用するかどうかを聞いている訳です。

すでに正しいResolutionで計算してある場合はStrictで良い訳です。

5.2.2 自分で考えてみる

Blogを探してもらちが明かないので自分で検証します。

分からないのは以下の部分の設定です。

Scaleの値が5000になっています。

5000mという事でしょうか?

ExportするHeight MapのPixelは1009です。

5000m÷1009 Pixel =4.95540138751m/pixelになります。

しかしGaeaにはReal Scaleが4.883m/pxと書かれています。

微妙に値が違いますね。

Scaleの値を1009mに変更してみました。

UEではLandscapeのSizeを100倍にして使用するのが普通です。

Unreal Unitがdefaultでは1cmなので、100倍にすると1mになります。つまり1pixelが1mになります。

ここでは0.985m/pxとなっています。

つまりそれが誤差ということなんでしょう。

今度は高さについて調べます。

2022-07-25のBlogに書かれていた方法を試してみます。

以下の実装を組みました。

CombineのParameterを以下の様にしました。

ここでRatioの値をどうすればいいのかについては書いていませんね。

Unreal Engine 5 : How to Create a MASSIVE Open World Landscape (100 km2 map) - UE5 Tutorial [8]を見て確認します。

以下の様に設定していました。

Constantノードの方の値ですが、%でしか表示しません。

14%でMountainが消えます。

13%の結果です。

DefaultのHeightが2600mなので

その14%である364mがこの山の高さという事でしょうか?

Unreal Engine 5 : How to Create a MASSIVE Open World Landscape (100 km2 map) - UE5 Tutorial [8]を見ていたらなんとmで入力していました。

試してみます。

365mと打ったら14%になりました。

成程。

高さの設定も理解出来ました。

RangeをNormalizedでExportしているので

365mが255になっているはずです。

うーん。

UE側の設定方法が分かりません。

これは来週調べる事にします。

今週のGaeaの勉強はここまでとします。

6.Houdiniの勉強

今週もHoudiniの勉強は少しだけお休みしてFree Time Coder氏のUnreal PCG Tutorial [1]を勉強します。

今週は先週勉強したUnreal 5.2 Preview PCG Tutorial - Part 5 - Custom PCG Actor and Attributes [6]の実装をします。

6.1 Unreal 5.2 Preview PCG Tutorial - Part 5 - Custom PCG Actor and Attributes [6]の実装

せっかくなんでUE5.3で試してみます。

Landscapeを途中まで作成したんですが、色々試したい事をやっていたら、時間が無くなってしまいました。

にもかかわらず、Tilingの問題とか

不思議なLineが現れる問題とかが起きてしまっています。

今回はUE5.3は諦めてUE5.2でやります。

まず以下のPCG Graphを作成します。

Tutorialでこの実装を開いている箇所がありました。

以下の様になっていました。

これならすぐに作成できます。

以下の様にそっくりに作成しました。

Level上に配置します。

あれ?

Pointが表示されません。

うーん。

一寸理由が分かりません。

復習するか。

2023-05-15のBlogからPCGの勉強を始めています。

このBlogから読み直します。

はい。

原因が分かりました。

InputノードのLandscapeの出力を繋げています。

Inの出力じゃなかったです。

直しました。

結果です。

今度はPointがしっかり表示されるようになりました。

次にBPをActor Classから作成します。

名前はTutorialと同じBP_PcgActorにしました。

このBPを開いてPCGをComponentとして追加しました。

更に先程作成したPCGをGraphにセットします。

このBP_PcgActorをLevel上に配置します。

Tutorialだと何も起きなかったですが、灰色のBoxが表示されています。

これってPCGのPointかもしれません。

うーん。

UE5.2になって使用が変わったんでしょうか?

よく分からないのでBox Collisionを追加します。

そしてBox CollisionのBox Extentの値を32から2000に変更します。

これって単純にScaleからSizeを大きくするのとどう違うんでしょうね。

以下に示した様にBox Collisionが巨大化しました。

Level上の結果です。

きれいなPointsが表示されています。

Box Extentの代わりにScaleの値を大きくしてみました。

結果です。

変らないですね。

次は2個目のBox Collisionを追加してみました。

結果です。

2つのBox両方にPointsが生成されています。

これも出来ました。

今度はStatic Mesh Componentを使用してPointの発生場所を指定します。

Sphereを追加しました。

TutorialではBoxの下にSphereを追加していましたが、多分関係ないでしょう。

以下の様な親子関係でSphereを追加しました。

結果です。

Sphereの周りにPointが発生しているのが確認出来ます。

Sphereを見えなくします。

結果です。

Sphereの中でもPointsが生成されているのが確認出来ました。

今度はこのBPのVariableをPCG内のGraphで使用します。

BPに以下のVariableを追加しました。

TypeはFloatで名前はTestScaleです。

このVariableをPCG内で呼び出します。

まずProperty To Param Dataノードを追加します。

ないです。

でも多分、Get Actor Propertyがそれでしょう。

Get Actor Propertyノードを追加しました。

Propertiesの設定は以下の様にします。

そしてTransform Pointsノードを追加してそのScale MinとScale MaxにGet Actor Propertyノードの結果を追加しました。

テストします。

サイズが変わりません。

DebugがSurface Samplerノードについたままでした。

DebugをTransform Pointsノードに移動させます。

もう一回テストします。

TestScaleが1の時です。

TestScaleを2にしました。

TestScaleを0.5にしました。

うん。

出来ていますね。

今週のPCGの勉強はここまでにします。

7.UEFNの勉強

7.1 Invader Gameの生成

今週は敵を追加してみます。

Guard Spawnerを配置しました。

以下の様に設定を変更しました。

これで敵が生成されて攻撃してくるはずです。

Player Spawnerを城の中に移動しました。

今度はPlayerに武器を持たせます。

Item Granterを追加します。

以下の様に設定します。

これでPlayerがSpawnしたらAssault Rifleを持っているはずです。

ここまでで一回Testします。

銃は持っていて打つことも出来ますが敵が生成されていません。

ひょっとすると海に落ちてしまったのかもしれません。

Guard Spawnerを以下の様に配置し直しました。

もう一回テストします。

今度は敵が生成されました。

豆粒みたく小さいので以下の様にGuard Spawnerを城に近づけました。

これでテストします。

敵を倒している間に弾が無くなってしまいました。

Guard Spawnerの設定を変更して生成される敵の数を4人までにします。

これで敵は4人だけ生成されるはずです。

テストします。

敵を倒す前に弾切れになってしまいました。

もう一回挑戦します。

又死にました。

結構難しいです。

何回か繰り返してやっと勝てるようになりました。

でもそんなに楽しくないですね。

壁が直ぐに破壊されるのと壁が破壊されると隠れる場所が全く無くなってしまうのが、つまらなくなっている可能性がありますね。

Towerを変えてみます。

なんとGameをPlayしている途中で建築が出来る事が判明しました。

これがあるとなんでも出来るようになってしまいます。

その結果、面白味が半減するのかそれとも増すのかが分かりません。

何とか敵を全部倒す事は出来ましたが、汗びっしょりになりました。

7.2 Playした感想

まあ、想像していたのとは大分かけ離れてたGameになってしまっています。

まず敵がTowerを破壊しに来ません。

後、銃で大量に打って来ます。

私の最初のイメージでは整列したエイリアンが数にものを言わせてTowerに近づいてくるImageです。

そもそも今の設定ではTowerに近づくようにもなっていません。

Guard Spawnerの周りをグルグルパトロールしています。

Towerも徐々に破壊される感じがよかったんですが、壁一面が一気に破壊されPlayerを守るものが一気に無くなってしまいます。

後、勝利条件を設定する必要があります。

エイリアンを全部倒したら勝利になるような実装を作成する必要があります。

これはEnd Game Deviceの設定を弄ったら何とかなりそうです。

Playerを破壊したら敵の勝利になります。

この破壊するのですが、銃で撃つのではなくてエイリアンがPlayerに触れるとPlayerが破壊出来るようにしたいです。

課題を以下にまとめ直します。

  • エイリアンがTowerを破壊しに近づいてくる
  • エイリアンは整列して近づいてくる
  • 銃はあまり使用しない
  • Towerは徐々に破壊される
  • エイリアンを全部倒したら勝利
  • エイリアンがPlayerに触ったら負け
  • 建築は出来ないようにする?

取りあえずはこんな感じでした。

先週考えた設定は以下のようなものだったので少しは進捗しています。

7.3 UEFNのTutorialを探す

今の知識ではどのようにこれを作成すれば良いのか不明なので、参考になるTutorialを探す事にします。

UEFN Tutorial [10]にEasily Make Anything Follow Your Player UEFN/Creative 2.0があります。

これを勉強したらTowerを追いかけるInvaderを作成する事は出来そうです。

UEFNでは来週からこのTutorialの勉強をする事にします。

後、どんな形でも今年の12月までにはMapを公開したいです。

のでそのためにどんな事をする必要があるのかも調査しておきます。

これなんかどうでしょうか?

後、以下のTutorialがGameを一から作成しています。

結構参考になりそうです。

後は公式のTutorialも確認しておきます。

公式のUEFNのGet Started [11]です。

この中のTutorialを勉強するのもありかもしれません。

なんか半年前から変わってないですね。

UEFNを開いたときに出て来るBoxにもTutorialの紹介が有った気がします。

確認します。

これですね。

よく分からないですがこれはTutorialでは無いみたいですね。

まだどのTutorialが決めてなのかは分かりませんね。

8.DirectX12の勉強

久しぶりにDirectX 12の勉強が出来ます。

8.1 「DirectX 12の魔導書」の勉強

8.1.1 先週までの作業の確認

前に勉強したのは2023-07-23の週ですね。

この週のBlogを読み直すと「3.3.6 Swap Chainを動作させるの「Render TargetのClear」」を勉強しています。

実装までしたのかは覚えていません。

確認します。

実装までしていました。

8.1.2 「ためておいた命令を実行する」を勉強する

では次の節である「ためておいた命令を実行する」を勉強します。

まず教科書を読みます。

大体理解しました。以下にまとめます。

ID3D12CommandQueue::ExecuteCommandLists()で貯めておいた命令を実装します。

ただしこの実行をする前にID3D12GraphicsCommandList::Close()でCommand Listを閉じる必要があります。

Sample Codeで確認します。

ID3D12GraphicsCommandList::Close()でCommand Listを閉じています。

ID3D12CommandQueue::ExecuteCommandLists()でCommand Listにある命令を実行しています。

うーん。

こいつは何をしているんでしょうか?

公式のID3D12CommandQueue::ExecuteCommandLists method (d3d12.h)[12]で確認します。

これしか書いていません。

これは教科書でも説明していました。

_cmdListは以下に示した様に

ID3D12GraphicsCommandListであってID3D12GraphicsCommandListの配列ではないです。のでこのように書き直しているんでしょうか?

_cmdListのままぶち込んでも同じ結果になる気がしますがどうなんでしょう?

Direct3D 12 ゲームグラフィック実践ガイド」ではどうやって実装しているんでしょうか?

同じ方法で実装しているんでしょうか?

これは「Direct3D 12 ゲームグラフィック実践ガイド」でID3D12CommandQueue::ExecuteCommandLists()を勉強する時に確認します。

8.1.3 「ためておいた命令を実行する」を実装する

それでは実装します。

Command ListをCloseします。

Command Listに貯まっていた命令を実行します。

これで完成です。

と思ったら教科書ではこの後でCommand ListをClearしていました。

うーん。

これは来週やる事にします。

8.2「Direct3D 12 ゲームグラフィック実践ガイド」の勉強

8.2.1 先週の勉強の復習

2023-07-23のBlogを読むと「2.3.5 Render Target Viewの作成」を読んでいます。

以下に示した様にMulti-Textureについて述べています。

こんなの勉強したかな?

もう一回教科書を読み直します。

Multi-Texture でなくMulti-Samplingでした。

これをする事によりAnti- Aliasingが無くなるそうです。

うーん。思い出して来ました。

後の話は大体覚えています。

今週はここで勉強した内容を実装していきます。

8.2.2 「2.3.5 Render Target Viewの作成」の実装

まずディスクリプタヒープの設定を実装します。

これは「DirectX 12の魔導書」でもやっていたはずです。

確認します。

以下の様に実装していました。

指定の順番は違いますがやっている事は同じですね。

FrameCountの値を確認します。

2でした。

つまりこの部分は全く同じ設定になっています。

次の実装部分です。

Descriptor Heapを生成しています。

この部分も「DirectX 12の魔導書」の実装と比較してみます。

DirectX 12の魔導書」ではrtvHeapsをID3D12DescriptorHeapから作成しています。

Direct3D 12 ゲームグラフィック実践ガイド」ではm_pHeapRTVはどこで作成したんでしょうか?

確認します。

Header fileの以下の箇所で宣言していました。

そしてSource file内のConstructorでInitializer Listを使用して初期化を行っています。

初期化のやり方に関してはこっちの方がSmartな感じがします。

この後教科書ではCreateDescriptorHeap()関数のそれぞれのParameterについて詳しい解説が書かれています。

この関数に関しては2023-05-01のBlogで詳しく調査しています。

今更勉強し直す必要はないでしょう。

次は「レンダーターゲットビューの生成」に入ります。

いきなり以下のCodeを追加しました。

Render Target Viewを生成しているのは最後の最後です。

うーん。

思っていたよりかなり複雑です。

この実装の内容は来週検証する事にします。

9.まとめと感想

今週はそれなりに進みました。

YouTubeの動画作成に時間を取られてしまってあんまりUEの勉強に時間を費やす事は出来ませんが、コツコツやって行こうと思います。

10.参照(Reference)

[1] FreetimeCoder [FreetimeCoder]. (n.d.). Unreal PCG Tutorial. YouTube. https://www.youtube.com/playlist?list=PLA03OHAaHgYpo0enf8p-2oEpja3grLOKZ

[2] Magnet VFX. (2023, April 2). Unreal Engine 5.1Beginner Tutorial - UE5 Starter Course 2023 #unrealengine5 #megascans [Video]. YouTube. https://www.youtube.com/watch?v=OCgn40aWVuU

[3] Math Material expressions. (n.d.). https://docs.unrealengine.com/5.0/en-US/math-material-expressions-in-unreal-engine/

[4] Ben Cloward. (2023, March 2). Bricks and Stucco Shader - Advanced Materials - Episode 17 [Video]. YouTube. https://www.youtube.com/watch?v=o5-242LPHE0

[5] Earth and Space Sciences X. (2015, October 30). Geology 9 (Soil) [Video]. YouTube. https://www.youtube.com/watch?v=0VzbhTP0ujI

[6] Wikipedia contributors. (2023). Entisol. Wikipedia. https://en.wikipedia.org/wiki/Entisol

[7] Wikipedia contributors. (2023b). Continent. Wikipedia. https://en.wikipedia.org/wiki/Continent#/media/File:Continental_models-Australia.gif

[8] Klaus. (2022b, March 24). Unreal Engine 5 : How to Create a MASSIVE Open World Landscape (100 km2 map) - UE5 Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=JNNizdQ4JvY

[9] Klaus. (2022, July 6). How To Create An Open World Snow Landscape | Unreal Engine 5 Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=ej2b-zWoYiM

[10] UEFN Tutorials. (n.d.). YouTube. https://www.youtube.com/playlist?list=PLIeMHs6z62bcnLOXzGhokz_rkvuRSRZFe

[11] Get started. (n.d.). Epic Developer Community. https://dev.epicgames.com/documentation/en-us/uefn/starting-out-in-unreal-editor-for-fortnite

[12] Stevewhims. (2021, October 13). ID3D12CommandQueue::ExecuteCommandLists (d3d12.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12-id3d12commandqueue-executecommandlists