UE4の勉強記録

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

UE5の勉強 -LandscapeのみのGameを作成する-

1.今週の予定

<LandscapeのみのGameを作成する>

木や岩そして草を配置してLandscapeが本物っぽくなるのか確認します。

Niagaraの勉強>

CGHOW氏のTutorialのどれかをやります。

<Materialの勉強>

Ben Cloward先生のAdvanced Materialの続きをやります。

<戦闘システムの続きを作成する>

効果音の追加の続きを行います。

<Gaeaの勉強>

Data GroupのNodeの検証の続きを行います。

<Houdiniの勉強>

FOUNDATIONS | OVERVIEW [1]の続きを勉強します。

<Volumetric Cloudの勉強>

動画の作成の続きをやります。

DirectXの勉強>

 C++ DirectX 12 Game Engine - [S01E03] - Creating A Game Engine [2]のAn Application Interfaceを勉強します。

2.LandscapeのみのGameを作成する

もうFoliageで試したい事は全部しました。

今度は岩や木や草をLandscapeに配置して本物っぽいEnvironmentを作成してみます。

2.1 本物っぽいEnvironmentを作成する

今週は以下のPositionから見た場合のみを考慮して

Foliageを追加します。

まず以下に示した

FT_BlackAlder_Field_03_PPを追加しました。

ZのOffsetの調整が必要です。

木と草を一杯並べていたらUEがCrashしてしまいました。

Foliageといえども無制限に増やしたら駄目みたいです。

Foliageで試す前に一本の木だけで試してみます。

これは良い感じです。

草もかなり大きいですね。

さっき見たくUEがCrashすると困るので試しに

FT_Wild_Grass_vlkhcbxia_Var1_lod1だけFoliageで配置してみました。

数は2万本位です。

何とこの草Naniteじゃなかったです。

Naniteにしました。

暇な時に見ていたTutorialでShader Complexityで適切なMaterialを使用しているか確認出来るとありました。

そういえばShader Complexityなんて機能すっかり忘れていました。

試しに見てみます。

うげ。

真っ赤じゃないですか。

この問題については来週検討します。

NaniteにしてFoliageでGrass Layerに配置してみます。

こんな感じです。

約3万本配置しました。

Naniteにするとこんな感じです。

こんな感じです。

もう少しばらつきがあっても良い気がします。

あれ。

またGPUがCrashしてしまいました。

この数のFoliageに対応出来ないの?

Foliageの数を約6000にして確認します。

GPUの専用のMemoryが一杯になっていますね。

色々見たんですがどうやって改善すれば良いのかは分かりません。

Memoryが32GBなんですが64GBに増設した方が良いんでしょうか?

あ。

Foliageする距離を指定すれば良いんだ。

別に草なんてPlayerの前方10mだけ生成されれば十分です。

調べたらやり方はすぐに判明しました。

Foliageの以下のParameterで指定するだけでした。

4000位にしてみます。

結果です。

4000だと40m先までだと思ったんですが、もっと先まで草がSpawnしています。

Playした時にCulling Distanceが効いてないみたいです。

理由は分かりませんがCast Shadowを一回切ったら効くようになりました。

その後はCast ShadowをEnableしても普通に効いています。

何だったんでしょうか?

こんな感じになりました。

これならもっと沢山配置しても問題ないでしょう。

試してみます。

結果です。

まず草の影は草が消えていても残っています。

Maxの設定が1000ですが、さすがに1000だとCameraから10m先までしかSpawnしないので尻切れ感があります。

Maxの設定を2000にしてみます。

後、影は消します。

結果です。

うーん。草が白い。

Cast ShadowをEnableしてみます。

木は草よりは遠くから見えるので

Culling DistanceのMaxは10,000にしました。

先週、Virtual Textureを追加したRockも追加してみます。

Rockを17万個配置したら

PCが結構重くなりました。

正直、ここはNaniteが全部、吸収してくれると思っていたのでなんか期待外れです。

ひょっとするとFoliageを生成するのに時間が掛かっているのかもしれません。

ここは逆にCulling DistanceのMaxを10,000にしてみます。

こんな感じです。

やっぱりかなり遅いです。

後、何故か木の上に岩が生成されている箇所がありました。

やっぱりかなり遅くなっています。

FPSを見てみます。

大体110前後だったのが

一瞬だけ19前後に落ちます。

対策を考えます。

Density/1Kuuの値を200から100に落としました。

まだ一瞬だけFPSが19前後に落ちますね。

Landscapeを見たらDensity/1Kuuの値が100でも

こんな感じです。

半分の50でも十分かもしれません。

50だとFPSが落ちる事はないですね。

Landscapeはこんな感じです。

いや、これは50にしたからじゃなくてさっき有った

を消したからかもしれません。

100に戻して試してみます。

一瞬だけ詰まる箇所があります。

FPSは変化しないんですが、画面が一瞬だけ止まる感じです。

Boxをそのあたりに配置しました。

このあたりを通ると必ず画面が一瞬だけ止まる感じがします。

これを消したからかもしれません。

試してみます。

関係なかったです。

今度は

も消してみます。

駄目でした。

純粋にこのRockが問題みたいです。

Rockも外してみました。

全く問題なくなりました。

やっぱりRockの量が問題だったみたいです。

いやこれはよく分からんです。

だってUE5のデモなんかStatic Meshだけで作成しています。

Naniteを使用しているにも拘らず、FPSが落ちるほどの負担になるって事態そのものが意味不明です。

Vally of the AncientのProjectをもう一回見る事にします。

2.2 Vally of the Ancientを見る

ここで確認する事は以下の事です。

  • 使用しているStatic Meshについて
  • FPS
  • Cullingは使用しているのか
  • Shader Complexity

FPS

FPSはのっけから60しか出ていません。

<使用しているStatic Meshについて>

なんとStatic Meshを直接使用しているんじゃなくてBP内でStatic Meshを組み合わせていました。

使用しているMaterialはかなり複雑です。

<Shader Complexity>

Shader Complexityです。

緑色です。

これは正直以外でした。

場所を変えたら真っ赤です。

何で空が真っ赤なんでしょうか?

以下に示したBP_CloudMask_Objectを大量に使用しているからみたいです。

<Cullingは使用しているのか>

Foliage自体を使用していません。

うーん。

よく分からん。

<Vally of the Ancientを見たまとめ>

これ見て思ったのは、本当にGameに使用出来るのか?って事です。

このデモは実際は映像として見せているだけでGameとして動かしてはいません。

このデモが公開された時、NaniteとWorld Partitionを使用したらこのデモの映像のLevelの内容のGameがすぐに作成出来ると、少なくとも私は思いました。

それが正しいのかどうかがよく分からないです。

まずFPSは60前後です。

そもそも私のPCの性能はGaming PCの平均からいったらかなり良い方なはずです。

それでも60前後しかFPSが出ないとなると、このデモの映像のLevelでGameを作成するのは無理となります。

ただしFPSが60なのは固定されているからかもしれません。

次にStatic Meshです。

これがよく分からないのはかなり複雑なMaterialを使用しているにもかかわらず、Shader Complexityが緑色です。

どうやって実装したんでしょう。

これが可能だから沢山のStatic Meshを配置するだけでLevelを作成出来たんだと思います。Naniteだけではこのデモの映像は無理だったんじゃないのかな。と疑っています。

最後にFoliageです。

これ使ってないんです。

Foliageを敢えて使用しない理由があるんでしょうか?

ある気がします。

Foliageでは使用出来ない何かを使ってこの巨大で緻密なLevelの作成を可能にしているのかもしれません。

と思いました。

今回、学んだのは、一寸見た目が劣っていたとしてもそれが本当に劣っているのかどうかは実際の所はよく分からないという事です。

例えば、ものすごく美麗なCGをGameの実況画面の動画として挙げていたとしても、それを再現しているPCが300万円位するやつかもしれないって事です。

今の私の持っているPCの条件の中で最適を見つける必要があります。

2.3 Landscapeの作成の続きに戻る

あ、そうだった。

今週は全体をFoliageでPaintするのが目的じゃなかったです。

ある特定の場所から見た風景を本物そっくりに作成するのが目的でした。そういう意味では別にFoliageを使用する必要も無かったです。

風を以下の場所に変更しました。

最初の場所は砂浜が大半を占めていて、木や草の追加しようがないからです。

以下の様に木や草を追加していきます。

そうだった。

今週やろうとしていたのは、これでPrototypeを作成する事でした。

ここで出来たPrototypeを元にFoliageにどんなStatic Meshを使用するのかを決定するんでした。

すっかり忘れてしまって別な事をやっていました。

以下の赤丸の所に何か欲しいです。

花を追加してみました。

こんな感じです。

これはあれだ。

絵を描くのと一緒だ。

頭を使うんじゃなくて、頭を休めながら作業するタイプの仕事だ。

YouTubeでも聞きながらやる事にします。

少しずつですがマシになって来ました。

背後に木を追加しました。

奥の風景は木だけを追加すれば良いみたいです。

Exponential Height Fogの設定を変更して奥行を不透明にしました。

これは大分良い感じになりました。

実際のPlay画面です。

Screenshotを取る前に一回Crashしました。

Volumetric Cloudを交換しました。

Fogの色を変更したいです。

調べたけど分かりません。

Sky Atmosphereにある

Rayleigh Scatteringの色を変更したら

以下の様になりました。

Exponential Height Fogの

Fog Densityの値をMaxにすると

こんな感じになりました。

Sky Atmosphereの

Rayleigh Scatteringの色を変えました。

結果です。

毒々しい感じが出て来ました。

もう一寸、手間暇を掛ける必要があります。

来週、やる事にします。

2.4 今週のまとめと来週の予定

今週はPCの限界を突破してしまったという、予測してなかった事態が起きました。

私はNaniteさえ使用したら10万個位のFoliageは軽々扱えると思っていたので、この結果は非常にDisappointです。

Foliageに使用するStatic Meshの質にも気を配る必要があるのかもしれません。

Vally of the Ancientを見ると砂漠の地面を全てStatic Meshで形成していてその数はおそらく数万はあると思われますが、普通に動いています。

ただしこの地面の作成に使用されている岩のStatic MeshはFoliageは使用されておらず、人力で配置したのなら尋常ならざる労力が必要でしょうし、自動生成で配置されたのならどうやったのか不明です。

更にVally of the Ancientの地面のShader Complexityは、

緑色です。

この後で、カメラをある場所に固定し、その位置から見えるLevelの風景の改善を行いました。

この風景が

こうなりました。

まだ途中ですが、かなり雰囲気が出て来ました。

この風景を作成する過程で、以下の知見を得る事が出来ました。

  • Sky AtmosphereにあるRayleigh Scatteringの色を変えるとExponential Height Fogの色が変わる。

今週の作業を行っている間で、以下の新しい問題が出て来ました。

これらの問題は来週、検討します。

GPU Crashed>

このD3D DeviceがRemovedされたと言うCommentが気になります。

このCommentについて調べます。

<FoliageにおけるStatic Meshの数>

FoliageでStatic Meshは何個まで配置出来るのか?について調べます。

勿論、Static Meshの質に影響されるのは承知しています。

ただ目安がほしいだけです。

<Shader Complexity>

Shader Complexityについても調べます。この機能、すっかりある事を忘れていました。

  • Shader Complexityそのもの
  • Landscapeが赤くなる理由
  • なんでVally of Ancientの地面は緑なのか?

について調べます。

<風景の作成の続き>

今週、途中まで作成した風景の続きを作成します。

3.Niagaraの勉強

今週はCGHOW氏のNoise to Stylized Trail in UE5 Niagara Tutorial [3]を勉強します。

3.1 Noise to Stylized Trail in UE5 Niagara Tutorial [3]を勉強する

まず全部を見ます。

見ました。

使用するNoiseのTextureをPhotoshopで作成しています。

ここで紹介されているTilingを消すための方法が興味深いです。

GIMPでも同様の事が出来るはずです。

試してみます。

TutorialのほとんどがMaterialの作成です。

Niagaraは一寸しか使用していません。

Ribbonを引っ張って上記のEffectを表示しています。

これは2021-07-04のBlogで私がRibbonの仕組みを理解仕様としてEffectを引っ張った時と同じです。

これです。

これ確かに見た目は綺麗なんですが、実際のEffectとして使用するとなると、どうすれば良いのか分からないんです。

おそらく剣の先にEffectをAttachさせて移動させるとかになると思うんですが、それどうやるんでしょうか?

そこが分かりません。

CGHOW氏のTutorialも実際にこのEffectを何かにつなげて引っ張る所までは作成していませんでした。

それではTutorialの内容を以下にまとめます。

<Textureの作成>

単にNoiseを作成しているだけですが、この中でTitlingを消すための方法がかなり興味深いです。

LandscapeでもTextureそのものの質がTilingにもっとも影響を及ぼします。

このやり方でTextureそのもののTilingが消せないかは常に検討すべきだと思います。

まずTextureのSizeです。

FilterからRenderを選択し更にCouldを選択します。

こんなImageです。

真ん中に見える線みないなのはどうやって表示しているんでしょう。

これは無くても問題ない気もするので気にしないで先に進みます。

Ctrl+SでこのLineの表示を消しました。

Blurを少しだけ追加するそうです。

FilterからBlurを選択しGaussian Blurを選択します。

以下のBoxで調整します。

結果です。

FilterからOtherを選択してMinimumを選択します。

これは何のためにやるんでしょうか?

こっちもGaussian Barと同じようなBoxが表示されました。

結果です。

Cell状のImageになりましたね。

もう一回Blurを追加します。

これでStylizedなLineが得られるといっています。

この英語圏の人がStylizedと言う表現を使う場合は注意が必要です。

Stylizedと言う表現は基本的には写実的でないものは全て含みます。

日本のアニメ風のRenderingをStylizedと言うと勘違いしていると、想像していたのと全然違う結果になって、唖然とする事になります。

ここからこのTextureのTilingを消していきます。

まずFilterからOtherを選択してOffsetを選択します。

すると以下のBoxが表示されるので

OKを押します。

結果です。

これはImageが移動したんでしょうか?

そうみたいですね。

兎に角、これでTilingの影響が確認出来ます。

そして以下のToolを選択し

Smudgeってどんな機能なんでしょう?

調べたんですけどあんまりよく分からないです。指でこすった感じなんですかね。

こういうNoise系はこれでも良いですけど、砂利なんかの写真だと、こういうぼやかしは無理ですね。

でも逆に言えばNoise系のTextureならこの方法でSeamlessに出来るわけです。

これを2,3回繰り返します。

結果です。

これでSeamlessなNoiseのTextureは完成です。

<Materialの作成>

ここからMaterialの作成になります。

StylizedなImageをこのTextureからMaterial内で作成するそうです。

ImportしたTextureからMaterialを作成しました。

Mainノードの以下の設定を変更します。

Blend ModeはTranslucentにします。

Shading ModelはUnlitです。

そして最後にTwo SlidedをEnableにします。

Pannerノードを追加します。

以下のように

Textureが左から右に流れるようになりました。

以下の実装で

こんなMaskを作成します。

このMaskと先程のTextureをPanningした結果と合成します。

更にその合成した結果に色を追加します。

今、Photographic関連のSiteを見たらPanningという手法について以下の解説が書かれていました。

この解説が面白いので記録に残しておきます。

非常に早く移動している物体でも写真に撮ると止まって見えます。

写真だから当たり前です。

でも速く移動している感を出したいんです。

その時に採用するのが背景のPanningなんだそうです。

ふーん。です。

確かに背景がPanningしているとその物体が高速で移動している感じがしますね。

また話がそれました。

結果です。

PanningしたTextureにMaskをかけた結果をOpacityに繋ぐと

以下の結果になります。

薄い。

濃くするためにPowerのExpの値を1.5に下げます。

更に2を掛けて濃さを2倍にします。

結果です。

今度はここにLineを追加するそうです。

以下の実装で

こんなMaskを作成します。

更に以下の実装を追加する事で

白黒を逆転します。

このMaskの実装部分の

TexCoord[0]の代わりにTexture SampleのRの値を使用します。

これはPanningしているTextureにLineを追加するのが目的なので当然ですね。

結果です。

一応白くなっていますが、線と言える程ではないですね。

Powerノードの代わりにStepノードを使用します。

なんと。

そういえば前のStylizedしたEffectを作成した時もStepノードを使用していました。

Stepノードの機能に関しては2023-02-13のBlogでまとめています。

このNodeは公式のDocumentがないんです。

なんでなんでしょうね。

結果です。

白黒を逆転させて

今までの結果に足すと、

以下の様になります。

こんな結果が欲しい訳じゃないです。

LineのMaskを改良します。

まずSubtractノードの前の値に2を掛けます。

これは元々のPanningしているNoiseが弱いのでそのImageを濃くするためだそうです。

でも掛けたらもっと薄くなる気がします。

次にStepノードのXの値を0.01に下げます。

結果です。

え、なんで中が黒くなるの?

あ、

のお陰だ。

結果です。

LerpノードのAlphaにこのMaskを繋げる事でLineに色を追加します。

ここで以下の実装を追加しています。

Maskの結果とPanningしているTextureの結果を足しています。

これの目的が分かりません。

???

です。

結果を見ます。

うーん。

線の色が明るくなった?

実装追加前です。

うーん。

Codeを見て考えたんですが、見ただけじゃ分からんです。

実装する時にこの部分は考える事にします。

微調整した結果です。

うーん。

CGHOW氏はStylizedと言っていますが、どの辺がStylized何でしょう?

最初に作成した以下のMaskを改良します。

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

結果です。

これを使用した結果ですがあんまり変っていません。

Tutorialではこの後、別なNoiseを使用したり、Textureに2を掛けたりして微調整していますが、ほとんど変化が無いのでここでMaterialの作成の記録は終わりにします。

Niagaraの作成>

いつもの様にFountainを追加したNiagara Systemを作成します。

Render SectionにあるSprite Renderer Moduleを消して代わりにRibbon Renderer Moduleを追加します。

当然、このRibbon Renderer ModuleのMaterialには

先程作成したMaterialをセットします。

要らないModuleを全部消します。

Particle Spawn SectionにあるInitialize Particle ModuleのRibbon Widthの値を50にします。

この状態でLevel上にNSを配置して引っ張ると

絵が綺麗に出ません。

それは

Particle Spawn SectionにあるInitialize Particle ModuleのLifetimeがRandomだからです。

うーん。

私はこれと同じようなEffectを作成した事があるので、この辺の設定は知ってるはずなんですが、

全く覚えていません。

自分で作った時にこの値を一定にした記憶とか全くないです。

結果です。

これは綺麗に伸びています。

ここでMaterialは伸ばされるのでMaterial内での伸びを無くします。

以下の部分の設定を弄って

以下の様にしました。

結果です。

ここでTutorialでは、何かが気に入らなくて直すんですが、

何処がオカシイのか言ってくれません。

Render SectionにあるRibbon Renderer ModuleのFacing ModeをCustomに変更しました。

更にParticle Spawn SectionにあるInitialize Particle ModuleのRibbon Facing ModeをDirect Setに変更します。

Ribbon Facing Vectorの値を1, 0, 0に変更します。

この辺の設定が何を指定しているのか全く分かりません。

実装した時に検証します。

結果です。

うーん。

差が分からん。

CGHOW氏もこれはあんまり良くないね。と言っています。

一寸でもマシにするために改良します。

まずParticle Update SectionにScale Ribbon Width Moduleを追加します。

更にMaterialの実装から線を太くしたりしました。

更に改良して以下の様になりました。

この辺は値を弄っているだけなので記録はSkipします。

以上です。

3.2 Noise to Stylized Trail in UE5 Niagara Tutorial [3]を勉強した感想

TextureをSeamlessにする方法はまあ、Noiseだから通用するって感じですね。

やっぱりSilver Bulletは何処にも無いと言うのが本当の所でしょうね。

Materialの作成方法で、勉強になったのはMaskの作成です。

Textureに枠のようなMaskをTexCoord[0]から作成する方法とか、昔はすごい勉強したんですがやり方をすっかり忘れてしまいました。

こういうのでもBingに質問したら教えてくれんでしょうか?
試してみます。

全然駄目でした。

まず、BPが表示出来ません。

次にMaterial内の実装が滅茶苦茶でした。

TexCoord[0]ノードをTexture Sampleノードに繋いでMaterialをつないで、とか全く意味不明な回答をして来ました。

まあ、逆に言うとBingのChatで回答出来る内容しか知らなかったら専門家には成れない訳でまあ、安心したと言えなくもないです。

最後のNiagaraの実装ですが、これはまあ普通の実装です。唯一知らない部分はRibbonのFacing Modeの部分でした。

後、これ見て思ったのが、私が2年前に試したEffectの方がはっきり言って綺麗です。

それで思ったのが黒の美しさです。

暗いところでは黒は周囲との境が分からんから価値が無い色なんです。でも逆に明るい所では白い色が周囲との境が無くなって価値が無い色になってしまうんです。

そして一般的に言ってEffectは白いんです。

来週、実装する時は少し我流に改良する事にします。

4.Materialの勉強

4.1 今まで作成したRockのShader Complexityを確認する

まあ、想像していましたが氷のMaterialは非常に重いですね。

先週、作成したドっから見ても氷のMaterialですが、実際のGameに使用するには無理かもしれないですね。

4.2 Metal Shader - Advanced Materials - Episode 7 [4]を勉強する

先週は、Ben Cloward先生の2年前に作成した氷のTutorialを勉強すると言いましたが、なんか氷の勉強をしても益がすくなそうな気がしています。

のでAdvanced MaterialのTutorialの勉強の続きをやる事にしました。

今週はMetal Shader - Advanced Materials - Episode 7 [4]を勉強する事にしました。

まず軽く全部見ます。

UEの部分だけ見ました。

このTutorialは全体的にUnityを使用して解説しています。

UEは最後に実装方法と少しだけその実装の解説がされているだけでした。

以下に実装を示します。

はっきり言ってこの中で重要なのは以下に示したLerpのBの要素の実装だけです。

それ以外の部分はUEのMaterialがやってくれていて金属のParameterを指定するだけで金属そっくりな質感を持つMaterialを作成してくれます。

金属そっくりな質感を出すための設定を以下にまとめます。

まずBase Colorですが銅を表すので以下の値を使用するそうです。

Tutorialによるとどの金属がRGBのどの色によって表示出来るのかは全部解明されていて、Netで調べたらすぐに出てくるそうです。

その色にAmbient Occlusionを掛けます。

正しそのまま掛けると暗くなりすぎるので、0.5以下の値は0.5に補正して掛けます。

そのための実装は以下の様にしています。

次にMetallicやRoughnessの値を指定します。

それで以下の部分の実装についてです。

まずFresnelノードの結果です。

結果です。

NormalにNormal Textureを使用している所を除けば普通のFresnelです。

その結果に以下の計算を追加します。

その結果です。

三重のFresnelが出来ました。

その結果をUV値としてTexture Sampleノードにパスします。

このTexture SampleノードにセットされているTextureは以下の様になっています。

結果です。

ここであの金属の表面にうっすらと見られる虹色の模様を再現しています。

これは金属だけじゃなくて油の泡とかにも活用出来そうです。

この結果を先程の銅のBase ColorとLerpノードで混合します。

結果です。

うーん。

これだけだとまだ金属感はないですね。

終結果です。

うん。どっからみても金属です。

4.3 Metal Shader - Advanced Materials - Episode 7 [4]を実装する

今週は勉強だけして終わりにする予定だったんですが、あまりに量が少ないので実装もやる事にしました。

Materialの基礎の部分だけ作成しました。

Previewの結果です。

この時点でかなり良い感じです。

Level上に岩を配置して確認します。

え、ナニコレ?

あ、岩のScalingのせい?

Scalingを戻しましたが変わりません。

Ambient Occlusionが無いからかもしれません。

Ambient Occlusionの値をBase Colorに掛けてみます。

Previewの結果です。

こっちはどっから見ても銅の塊です。

Level上での結果です。

うーん。前よりはマシかもしれないけど。

何でPreviewの画像とこんなに違うんでしょうか?

Directional Lightの角度を弄ってみました。

一寸は金属っぽくなりました。

Tutorialの解説通りにAmbient Occlusionの値をLerpでClampしました。

結果です。

まずPreviewの方です。

正直、してもしなくても良い感じです。

98点か100点かの違いです。

うーん。

48点か50点って感じです。

それでは今日のMainのFresnelの部分を実装しますか。

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

この実装の結果をPreviewに示します。

はい。ほぼほぼTutorialと同じ結果です。

は。

これに繋ぐTexture SampleノードのTextureがありません。

こういうやつです。

作りました。

高さが1Pixelしかないので色が表示されませんが、出来ているはずです。

Texture Sampleノードを追加します。

結果です。

何か紫の部分が多い気がしますが、即席で作成したTextureなので紫の部分がおおきかったのかもしれません。

その辺は仕方ないです。

Lerpで繋いでBase Colorに追加しました。

Previewの結果です。

ほとんど変化がありません。

Level上に配置した岩の場合です。

これも同じです。

ひょっとしてRockのサイズが大きいからかと思いサイズを0.5倍にしてみました。

ほとんど変わらないです。

まあ、空が明るいからかもしれません。

暗くしてみました。

うーん。

まあ金属である事は間違いないです。

後は、まあRoughnessとかの影響もあるかもしれません。

実装しました。

Previewの結果です。

Previewはいつでも良いのでLevelを見ます。

あれ、そこそこよくなっています。

近づいてみます。

いやこれはかなり良い感じです。

これなら合格でしょう。

最後にShader Complexityも確認しておきます。

これは全く問題ないです。

以上です。

今週のMaterialの勉強はこれで終わりです。

5.戦闘システムの続きを作成する

5.1 先週追加した効果音の確認

GameをPlayして全部の効果音を確認しました。

完璧とは言い難いですが、効果音はついています。

炎の魔法の効果音だけは違う感じがします。

これだけは変更したいです。

そのためにはもう少し音源が必要です。

音源を探します。

Mixkitから以下の音源をDownloadしました。

Fireの魔法の効果音を変更します。

しました。

テストします。

上手くScreenshotは撮れなかったですが、大分、マシになりました。

5.2 亡霊族の攻撃に効果音を追加する

以下の3つのMonsterの攻撃に効果音を追加します。

まずは亡霊呪術師の氷攻撃に効果音を追加します。

妖精族の氷攻撃よりは激しい効果音にする必要があります。

しかし同じ氷攻撃なので似たような効果音が欲しいです。

妖精族の氷攻撃には

魔法魂さんの氷05が使用されています。

安直ですが、その上の氷06を試してみます。

追加しました。

試してみます。

Animation Sequenceで聞く限りでは、かなり良いです。

次は、亡霊戦士の雷攻撃の効果音を追加します。

亡霊戦士の雷攻撃のAnimation Sequenceを確認します。

かなり激しいAnimationです。

これも妖精戦士の雷攻撃より激しい効果音にする必要があります。

妖精戦士の雷攻撃の効果音には魔王魂さんの雷01が使用されています。

魔王魂さんの雷05を使用する事にします。

一寸長いですが、迫力が凄いです。

試す価値あります。

追加しました。

少しAnimationと効果音がずれています。

もしこれで合わなく感じるなら、効果音を編集して短くします。

最後に、亡霊魔人の炎攻撃の効果音を追加します。

先程炎の効果音をDownloadしたMixkitにもっとすごい効果音がありました。

一寸長いですがこれで試してみます。

Previewで聞く限りではかなり良いです。

実際のGame Playで試してみます。

W_OpponentSummonDecide Widget

Stage 1で対戦相手の魔術師が召喚するMonsterの設定を変更します。

これで亡霊族のMonsterが召喚されるはずです。

テストします。

亡霊魔人がいないので炎攻撃の効果音が聞けなかったです。

雷攻撃はまあ普通って感じでした。

特別驚く感じではないです。

氷攻撃はかなり合っています。

炎攻撃も確認しました。

これはかなり良いです。

10点満点で表現すると

  • 炎攻撃:10/10
  • 氷攻撃:8/10
  • 雷攻撃:6/10

って感じです。

雷攻撃を調整します。

まず音の発生するFrameをAnimationのFrameと同じにしました。

更に音の大きさも

少しだけ大きくしました。

テストします。

物凄く良くなりました。

大迫力です。

これで亡霊族の攻撃の効果音はOKです。

次は亡霊族が攻撃された時の効果音を追加します。

5.3 亡霊族が攻撃された時の効果音を追加する

何と亡霊族のDamageのAnimation Sequenceは元々のAnimation Sequenceを直接使用していました。

これに加工してしますと、元のDataがどうなっていたのか分からなくなってしまいます。

Duplicateして作成したAnim_Hit_meに音源を追加します。

しました。

同様に他の2つの亡霊族のMonsterのDamage Animationを追加します。

Soundを追加しました。

最後の亡霊族のAnimation Sequenceです。

全部の亡霊族のDameを受けた時のAnimation Sequenceを入れ替えました。

テストします。

今回はたまたまMonsterが全部別な種類で召喚されました。

ので一回でテスト出来ました。

全部、Damageの音が入っていました。

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

5.4 亡霊族が死んだ時の効果音を追加する

妖精族が死んだときの音ですが、かわいい音なんです。

亡霊族が死んだ時には合いません。

代わりの音を探したんですが見つかりません。

取りあえずは同じ音で実装します。

しました。

テストします。

思ったよりは悪くなかったです。

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

最後にW_OpponentSummonDecide Widget

Stage1の設定をも度に戻して

Saveします。

確認のために一回Playしました。

Stage2で負けてしまいました。

5.5 音源の編集方法を勉強する

今回は音源の長さを編集する必要はなかったですが、やり方だけ勉強しておきます。

DaVinci Resolveで編集します。

今回は単に短くしただけです。

これをWavでExportしたいですがその方法が分かりません。

調べたらすぐに出て来ました。

DaVinci Resolve: How to export audio only [5]にやり方が紹介されています。

Deliverを選択します。

Audio Onlyを選択します。

File nameやLocationを入力します。

Audioを選択します。

FormatにWaveを選択します。

Bit Depthは16でもいいそうです。

プロレベルの品質が欲しい時でも24 Bitで充分だそうです。

Output Track1にAll Timeline Tracksを選択します。

Add to Render Queueを選択します。

Save先を聞いてくるので指定します。

右上にRender Queueが出来ています。

最後にRender AllをClickして終わりだそうです。

試してみます。

DeliverをClickします。

Audio OnlyをClickします。

File NameとLocationをセットします。

ここはそのままです。

更に以下の設定をします。

Bit Depthは一応24にしておきました。

Add to Render Queueを押します。

Render Queueが表示されました。

Render Allを押しました。

うん。

出来たのか?

うんともすんとも言いません。

確認します。

出来ているみたいですね。

聞いてみます。

出来ていました。

これは簡単でした。

これで音源が長すぎた場合、短くする方法も判明しました。

6.GDC 2023の発表を見る

今週は「戦闘システムの続きを作成する」のが思っていたよりも早く終わってしまったのでGDC 2023の発表でも見る事にします。

この中で絶対見る必要があるのはCreating Realistic Landscapes in Unreal Engine with Houdiniですね。

今、流行りのProceduralなEnvironmentの生成方法についての解説でしょうね。

で、話は変わりますが、

私のPCだとNaniteを使用してもFoliageで草を生やすと草の数が10万とかでもEditorがCrashしてしまう事です。

これって別にどんな生成方法でやっても同じだと思うんですよ。

この問題ってどうやって解決しているんでしょうか?

それを知りたいですね。

デモの映像を見ると使用しているStatic Meshの数は10万ぐらいは軽くいってそうです。でもSmoothに動いている訳です。

この映像がDemo用で特別に最新のPCにMemoryも最大にしていたとしても、Consumerには同じ性能を期待する事は不可能な訳です。

今のPC Gamerが最も使用しているGPUはSwitchと同程度だそうです。その基準に合わせてGameを作成する必要がある訳で、そのLevelのPCでもGameとして製品化した時に普通に動くんでしょうか?

で、私が思うのはそれってやっぱり無理なんじゃね。

それでやっぱりこれからのUEの主戦場はGame作成ではなくCG映像になると思う訳です。

映像だけ抽出するならそのPCだけ超高性能だったらいい訳ですから

FortniteのEnvironmentでWater Systemを使用している。とくに川を生成するやつ。

が使用されています。

これがFortnite内でGameを作成するUEFNみたいです。

あれ。

もう終わってしまいました。

あ、これは最初の講演でした。The State of Unrealというやつです。

残りは時間があるときに見る事にします。

7.ProceduralなEnvironmentの作成方法について

GDCの動画を見ていて、そんな事よりもっとProceduralなEnvironmentの作成方法について教えてくれよ。と思っていたらYouTubeのお勧めに以下の動画がありました。

Save hours! Procedural Foliage in Unreal Engine 5 - Photoreal Landscape Tutorial [6]

これが私が知りたい事を教えている動画かどうかわかりませんが、一寸興味を惹かれたので見る事にしました。

そしたらいわゆるUE5におけるProcedural FoliageについてのTutorialで、まあかなり興味深かったです。

のでこの内容を一応まとめておく事にします。

まずこの方法でFoliageを生成すると巨大なOpen Worldの作成が容易だと説明しています。

これがまず最初の怪しい点で、本当に巨大なOpen Worldがこの方法で生成出来るなら、中堅のUE5で主力のGameを開発している会社がこぞって使用するはずです。所が全然そんな話は聞きません。

ので私はこれって映像として見せる分には凄いんですが、実際にGameとして採用すると結構超えないといけない壁があるんじゃないかと疑っています。

まあ勉強した後でそういう事は考える事にしましょう。

まずEditor Preferenceを開きます。

Experimentalを選択します。

あれ?

Procedural FoliageってExperimentalなの?

ここでProcedural FoliageにCheckを入れます。

FoliageからProcedural Foliage Spawnerを選択します。

こんなのが出来ました。

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

ここのFoliage Typeに追加するためにFoliage Typeを作成します。

Static Mesh Foliageを作成します。

以下の様になりました。

Mega ScanからDownloadした場合は、Foliage Assetが付属で付いてくると言っていますが、何の事か分かりません。

ここから紹介する手法はMega Scan以外でDownloadした場合だそうです。

作成したStatic Mesh Foliageを開くと以下の様になっています。

MeshにMega ScanからDownloadしたStatic Meshをセットしています。

このStatic MeshがNaniteなのかどうかは不明です。

とりあえずはこれでStatic Mesh Foliageの設定は完成のようです。

この後でProcedural Foliage Spawnerに戻って

Foliage Type Objectに今作成したStatic Mesh Foliageをセットします。

これでSpawnerの方も完成のようです。

Procedural Foliage SpawnerをLevel上に配置します。

このProcedural Foliage SpawnerのVolume内に草を生成するみたいです。

Volumeを大きくしました。

そしてこのObjectを選択してDetailの設定から以下の項目を探します。

Load Unloaded AreaをClickします。

するとResimulateがClick出来るようになるのでClickします。

すると以下の様にGrassが生成されます。

うーん。

成程ね。

今度はこの草の生成する条件を編集します。

SMF_grassを開いています。

ここで生成する草の条件を設定するそうです。

これってStatic Mesh Foliageの方ですね。

ProceduralにあるCollision、Clustering、Growthの項目を編集するそうです。

TutorialではCollisionのサイズがToo Bigなので100から1に変更します。と言っています。

が、何がToo Bigなのかよく分かりません。草とCollisionするって事でしょうか?

それとも草と草との距離が最低でも100あるという事なんでしょうか?

100って1mでしょう。

うーん。

まあToo Bigと言えばそうかもしれません。

ここで大切なのはこの値を変化してもLevel上に反映されないという事です。

Procedural Foliage SpawnerのResimulateを押す必要があります。

以下のような結果になりました。

あ、

このTutorialの5分の所まで勉強したんですが、時間が無くなってしまいました。

残りは来週勉強する事にします。

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

8.Gaeaの勉強

ProceduralなEnvironmentの生成とか、Landscapeを使用しないEnvironmentalな生成とか、HoudiniによるLandscapeの生成とか、色々言う人達はいますが、それらの生成方法だってSilver Bulletじゃない事が段々判明してきました。

更に言うと製品版のGameに必要とされる質を維持出来るのかどうかは、最新の技術よりももう何年も使用されている枯渇した技術を如何に使用するかに掛かっています。

ので私のGaeaの勉強成果はこれから黄金に化ける可能性も出て来ました。

やっぱりキラキラした所だけ追いかけないで地道に勉強してきて良かったです。

ので今週の地道にGaeaの勉強をやって行きます。

8.1 Data Groupにある残りのNodeの機能を調査する

UEのLayerをどれだけRealに出来るのかを決定するのがMaskですので、そのMaskを作成するためのData GroupのNodeの機能を理解するのは非常に重要です。

ので先週、調査しきれなかった残りのNodeの機能もここで調べる事にします。

<RockMap>

Defaultの結果です。

うーん。

これって何を抽出しているんでしょうか?

Cursorを乗せると現れる解説です。

あー。成程。

Rockの部分を白くする訳だ。

だからこんな点々なんだ。

一寸、近づいてみます。

これ逆じゃね?

Parameter見たらInvertになっています。

外します。

うーん。

白い部分が岩になる訳です。

何とも言えない。

Parameterを弄ってみますか。

Coverageの値はDefaultのままでDensityの値だけ変えてみます。

Densityの値を100%にしました。

真っ白です。

でもこれInvertしたら

あれ、Invertってこんな感じになるの。

この状態で白黒逆転出来たらいいMaskになりますね。

ひょっとしてDensityの値を

にしたら逆になるとか?

ならなかったです。

色々弄ってみましたが、Densityの値が小さい程、白い部分が四角四角しています。

公式のDocumentであるRockMap [7]を見てみます。

なんのこっちゃ分かりません。

後、InvertがInverts the rockmapとなっていますが、単純に白黒を逆にしている訳じゃないです。

この説明は間違っています。

Coverageの値も変化させてみます。

Coverageの値を100%にしました。

結果です。

元のCoverageの値が33%の結果も以下に示しておきます。

Coverageの値を0%にしました。

また四角が現れました。

このNodeをMaskとして使用出来る場合があるなら、この四角がしっかりと消えている時だけでしょうね。

大体理解は出来ました。

<Sun Light>

です。

結果です。

うーん。

もっと白黒はっきりつけてほしい。ですね。

色々、Parameterを変更したんですが灰色ばっかしです。

<SurfTex>

です。

これはそもそも何をやっているのか不明です。

ふーん。別なMaskとCombineしろって書いています。

まずSwap単体の結果です。

これに以下の実装を追加しました。

Slopeの結果と混合した訳です。

結果です。

あれ?

めっちゃ良くない?

一応、CombineノードのParameter値も示しておきます。

Combineノードと混合するとかなり良い感じになりますね。

これは他のNodeでも試してみたいです。

<Velocity>

これは川のような部分が流れがあるからVelocityが高いから白くなっているんでしょうか?

如何に解説を示します。

Parameterを変化します。

うーん。

かなり綺麗。

試しに以下の実装をしてみました。

結果です。

うーん。

凄い。

これで一応、Data Groupの全てのNodeを検証しました。

8.2 Gaea Tutorial for Beginners #6 | Texturing our first terrain [8]の続きを見る

Andrea Cantelli氏のGaea Tutorial for Beginners #6 | Texturing our first terrain [8]の続きを見て次に何をするのか確認します。

色をTextureに追加していました。

これ自体はUEにExportする場合は必要ないですが、目でどんなTerrainになるのかを確認出来るのはMaskの作成にも役に立つのでまとめ直します。

色を追加するNodeは基本的には3つだけです。

  • SatMapsノード
  • Quick Colorノード
  • ClUTerノード

でもColor Groupを見ると以下のようなNodeが用意されています。

これらについても調査する必要があるかもしれません。

<SatMaps>

まずSatMapsノードの使用方法についてです。

以下の実装で試します。

この白い部分に雪山のような白と青の色付けを行います。

何これ?

私は白い部分にだけ色が付けたいんです。

これは使えないNodeかもしれません。

<Quick Colorノード>

Quick Colorノードです。

これは以下に示した様にParameterで2色を指定します。

Colorが白い部分、Color2が黒くMaskされた部分の色になります。

今の設定はColorが白、Color2が黒なのでMaskと同じ状態で色が塗られています。

む、これを上手く使用したら先程のSatMapsノードの色も調整出来ますね。

以下の様に実装して

Combineノードの設定を以下の様にします。

結果です。

最初の目的の山の高いところだけ青く塗る事が出来ました。

<ClUTerノード>

このNodeの使い方が分かりません。

何回か勉強したはずなんですが忘れてしまいました。

分かりました。

まず矢印を選択する必要がありました。矢印を選択すると色が指定出来るようになります。

これもSatMapsノードと同じで灰色がその間の色になります。

<3つの色のNodeを検証した感想>

あくまでも、Gaeaの色付けはUEで実際にLandscapeを作成する時の参考にするためです。

MaskとしてExportした時に灰色は下のLayerと混合した状態になります。

SatMapsノードやClUTerノードがする色付けの様に灰色の部分が2つの色の中間になる事は決してありません。

いや上手くCombineノードを使用したら出来るのかな?

うーん。

やり方によっては出来るかもしれませんが、まああんまり興味ありませんね。

8.3 Maskを作成して色付けしてみる

以下のTerrainにMaskを追加して色付けしてみます。

条件としてはMaskは最低7種類作成する。

候補は

  • 氷(青)
  • 砂漠
  • 緑2(光が当たる部分)

とします。

以下の6種類のNodeを組み合わせてこれらのMaskを作成します。

まず一番簡単な氷と雪の部分です。

Heightノードの設定を以下の様に変更ます。

結果です。

これに色を追加します。

ここはLayer用にExportした場合を考えて灰色は消しておくべきでした。

直します。

白じゃなくて青にしました。

今度は岩の部分を作成します。

岩は当然ですがRockMapノードを使用します。

と思ったら最初に選んだ6つのノードにRockMapは入ってなかったです。

追加しました。

Heightノードを使用して氷のMaskをした部分だけ対象外にしています。

緑の部分を指定します。

うーん。

このやり方だと結果がUEの時と変わってしまいますね。

一寸考えます。

以下の非常に簡単な例を考えました。

1個目のHeightノードです。

白と黒のみで構成されています。

最も低い位置から40%~100%の間が白くなっています。

Quick Colorノードを使用して白い部分を赤くします。

今度は2番目のHeightノードを作成します。

今度は0%から60%までを白くしました。

更にQuick Colorノードを使用して白い部分を緑にします。

この2つをCombineノードを使用して混合します。

結果です。

2つのMaskが重なった部分の色が混じって黄色になっています。

これがUEとGaeaの違う所で、UEでは後の色一色になります。

のでNodeを組み合わせてGaeaでもこの黄色の部分を緑にしたい訳です。

色々試したんですが、唯一UEと同じ結果にする事が出来た方法は以下に示した様に

予め2番目のMaskのInvertを一番目のMaskのMaskにセットしてしまう方法です。

この方法だと以下に示した様に

黄色が生成されないで後のMaskの色である緑で表されます。

これ以外の方法が思いつかないので今回はこれで作成します。

こういう時、Nodeは不便ですね。IfもOrもAndもありません。

2層以上の組み合わせは無理そうですね。

UEにExportして確認した方が早そうです。

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

9.Houdiniの勉強

今週はGDC 2023のCreating Realistic Landscapes in Unreal Engine with Houdiniを見ようとしたら、この動画はUPされません。

来週中にはUpされるかもしれませんが、兎に角今はUpされていません。

しょうがないので、今週もFOUNDATIONS | OVERVIEW [1]の続きを勉強します。

9.1 FOUNDATIONS | OVERVIEW [1]の続きを勉強する

Tool Workflowの続きを勉強します。

まずBox1を選択して

Axis Divisionの値を以下の様に変化させます。

当然、Box内のBoxの数は以下の様に変化しますが、

Bevelの位置は変化しません。

今度はPolybevel2ノードにPolyextrude1ノードを追加しました。

その間にGroup3ノードを追加しました。

Group NameをInput_groupに変更します。

なんかすごい事になっています。

Base GroupのCheckを外しました。

そして代わりにKeep by NormalsにCheckを入れます。

そしてDirectionに0, 1, 0をセットします。

結果です。

最後にAxis Divisionsの値を以下の様に変化させ

以下のような形状にしました。

9.2 FOUNDATIONS | OVERVIEW [1]を実装する

それでは実装してみます。

まずGridを追加します。

先週はNetwork PaneにGridノードを生成してGridを作成しました。

よく見るとToolbarにGridってあるんです。

こっちを配置してみます。

この方法でもGridを配置する事が出来ました。

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

この後、TutorialのようにColorノードを追加しました。

所がColorノードを選択すると

如何に示した様な選択が出来ません。

Tutorialを見ると、Colorノードが選択された状態でGridの升目を選択しています。

これどうやっているんでしょう。

出来ました。

これよく見ると分かるんですが、

Scene Viewで映されるのは青と紫の丸で表示されているNodeです。

ところが選択されているNodeはNodeの周りに黄色い枠がついているNodeなんです。

だから以下に示した場合だと、Scene ViewではColor1ノードの結果を表示していますが、

選択されているNodeはGrid1になります。

こういう状態でいる時は、Scene ViewからGridの升目を選択する事が出来なくなる訳です。

うーん。

成程。

今度は以下の手順でPoly Extrudeを追加します。

赤い線を引っ張って以下の様にしました。

Poly Extrudeノードの

ParameterであるDivide Intoの値をIndividual Elementsにセットします。

先週勉強した時は、これがどんな機能なのか不明でした。

調べます。

まずはCursorを重ねてみます。

ふざけてんのか!と言うくらいやる気のない調べ方なんですが、結構有効で費用対効果は抜群な時が多いです。

今回も以下のような情報が表示されました。

F1を押すともっとHelpが表示されるそうです。

試します。

以下のようなPoly Extrudeの情報が表示されました。

うーん。

こんな機能があったとは。

これはいちいちGoogleで検索する必要ないですね。

Tutorialの言っているようにInsetの値を変更します。

以下の様になりました。

この状態でDivide Intoの値を

Connected Componentsに戻しました。

すると以下の様になりました。

つまり、Divide IntoはそれぞれのPolygonに対して操作するのか、それともまとめたPolygonを一個の塊として操作するのかを決定するためのParameterだったという事です。

今度はGroupの値を以下の様に変化します。

両端にExtrudeが追加されました。

この辺の理屈は先週の勉強で既に理解しているので楽勝です。

次はGrid1を選択して

上図を見て下さい。

Grid1は選択していますが、Scene Viewに表示されているのはPoly Extrude1ノードの結果です。

Houdiniはこういう事が出来るわけです。

Grid1ノードのParameterであるRowsとColumnsの値を変化させます。

以下の結果になります。

それぞれのPolygonに番号が振られていて、今回の場合は

の番号を持つPolygonがExtrudeされているんです。

のでGridの升目が変わると、それぞれのPolygonの割り振られた番号も変わります。

ので別な位置がExtrudeする訳です。

たしかTutorialはこの事を説明するためのこの実験を行ったはずです。

そして升目の数を変える度にExtrudeするPolygonの番号を変更するのは大変なので、升目の番号が変わっても同じ位置のPolygonがExtrudeする方法を教えるそうです。

まずGroupノードをColor1ノードとPoly Extrude 1ノードの間に追加します。

Tutorialでは以下の様になっていますが、

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

Group1ノードのGroup Nameが

になっているので

のGroupを

Group1に変更しました。

結果です。

今度はTutorialと同じになりました。

Grid1ノードのRowsとColumnsの値も変更して

ExtrudeしているPolygonの数も揃えました。

Group1ノードのKeep in Bounding RegionsのEnableにCheckを入れ

Sizeを変形すると

以下のようなBoxが表示され、そのBox内のPolygonだけExtrudeされています。

これTutorialだと以下のような赤いBoxが表示されていて

しかも矢印を選択する事でBoxの大きさを変化させる事も出来るんです。

なんで私のは青いBoxが表示されているだけで、しかもScene Viewで操作する事は出来ないんでしょうか?

分かりました。

如何に示したScene Viewの左端にあるTool Barの

赤で囲ったIconをClickすると

Tutorialで示した様な赤いBoxが表示されます。

本当にこの方法ならGridのRowとColumnの数を変更しても同じ位置にあるPolygonがExtrudeされるのか確認します。

今度はGroup RangeノードをGroupノードの代わりに追加します。

そしてRange Filterの値を以下の様に変化しました。

結果です。

今度はGrid1ノードとColor1ノードをDuplicateしてGrid2ノードとColor2ノードを作成します。

これどうやってやるんだ。

先週のBlogを見てもやり方が書いてません。

分からんので取りあえずこの2つのNodeを選択した状態でCtrl+C、Ctrl+Vをしたら普通に出来ました。

Edgeを選択します。

以下に示した様に四角にEdgeを選択します。

またCを押してRadial Menuを選択して、今度はPoly Bevelを追加します。

今度はPoly BevelのParameterであるDistanceの値を変化させます。

結果です。

今度はBoxを追加します。

Colorノードを追加します。

TutorialではここでColor3ノードをColor2ノードから、Alt+DragでDuplicateしていました。

このやり方はUEと同じなんで、先週勉強した時は絶対に忘れないと思っていましたが、完全に忘れていました。

先週のBlogには以下の様に書いていますが、

ColorノードにはSizeのParameterは無いので、これはBoxノードの事です。

Box1ノードのSizeを

に変更しました。

更にAxis Divisionsの値も変更しました。

結果です。

Corner EdgeにだけBevelを追加します。

Axis Divisionsの値を変更します。

Groupノードを追加します。

Tutorialだと以下に示したようにPinkのTemplateを選択しているみたいです。

一応、選択しておきます。

Groupノードの設定です。

そして先程作成したPoly Bevel1ノードを繋ぐと

Errorになりました。

Errorの原因を見るとPoly Bevel1ノードのGroupの値が間違っていると言っています。

ので以下の様に直しました。

結果です。

Tutorialだとこの設定でCorner EdgeだけBevelが追加されるんですが、私のは全部のEdgeにBevelが追加されています。

色々調べたんですが原因が分かりません。

Group2ノードの

Base GroupのEnableのCheckを外したら

直りました。

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

残りは来週やる事にします。

10.Volumetric Cloudの勉強

今週はYouTubeの動画を作成するのに必要なマイクでも探そうと思っていたんですが、

GDC 2023の講演で

UEFNでFortniteの何かを作成するCreator達にFortniteで得られたNet Revenueの40%を還元するって言っていたんです。

これってもうMinecraftで家とか作ってる場合じゃないでしょう。

と言うかこれ、Minecraftで家とか作っている人達、全員移動するんじゃないじゃないでしょうか?

後、私はUEを使用したら簡単にGameが作成出来る。って言う今の雰囲気があんまり好きじゃないんです。

そりゃ、

  • 英語が日本語並みに出来て、
  • 大学の理系Levelの数学も得意、
  • そしてProgrammingは三度の飯より好きって人なら

って人にとってはそうかもしれません。

しかし、普通の人にとってはこの3つの条件を満たすのはかなり難しいし、それ故にUEを使用してのGameの制作もやっぱり難しいものなんです。

でもUEFNだったら普通の人でもがんばったらFortnite内で使用するGameの一部の作成が出来るかもしれません。

そしてここからが大事な話なんですが、

例えUEでGame制作出来たとしても、その先に何もないんです。

特に日本では。

欧米や中国(今は知りませんが数年前までの中国)は自国のGame産業を発展させるので官民一体となってSupportしています。

アメリカやEuropeではIndie Gameを作成するGame会社に数億円を無償で配ったりしています。それは政府の援助だったり大企業や大金持ちからの援助だったりします。

中国でもソフト関連の会社は税金を免除されるだけでなく、インフラPC付の事務所を無料で提供してくれていたらしいです。

日本はそういうのは全くないです。

最初は実績がないから駄目と言われ、死ぬ思いでGameを完成させて実績を作ると、やっぱり駄目と言われる。

頑張れば頑張っただけ無駄になるSystemが完成しているんです。

でもUEFNは違う訳です。

なんせ、Fortniteの利益の40%をCreatorに還元するって最初から決めているんですよ。

頑張ってGameを作成したらその分、金銭的な収入に直結する可能性が極めて高い訳です。

これYouTubeニコニコ動画の関係に似ていると思いませんか。

動画制作者からお金を取って動画を乗せて上げているんだと嘯いていたニコニコ動画と、動画制作者に報酬を払う事で天下取ったYouTube

第二のYouTubeの誕生かもしれません。

と言う訳で今週はこのUEFNについて調べる事にします。

だたし私は普段Gameを全くしません。

Fortniteも触ったことないです。

のでかなり間違った事を書くかもしれませんがそこはご了承下さい。

10.1 Fortnite Creative 2.0 Beginner Tutorial [9]を見る

Epic LauncherにFortniteとUnreal Editor For Fortniteが入っています。

まずこの2つをInstallします。

終わりました。

Unreal Editor For Fortniteを開始します。

何か承諾しろって出て来ました。

一々全部読んでられないので適当に読んでOKにしました。

UIが日本語設定になっています。

一端Editorを閉じます。

Fortnite Creative 2.0 Beginner Tutorial [9]を先に全部見る事にします。

まず軽く全部見ます。

途中まで見たんですが、UEと変わらないですね。

ここで知るべき内容は以下の2つです。

  • Programming初心者でもGameが作成出来るのか?
  • 何を作成したら製品として売る事が可能なのか?

公式のこのサイト[10]の方が詳しく解説してそうです。

読んでて気が付いたんですが、これって昨日や今日出来たものじゃないですね。

前からあって知ってる人には結構常識みたいですね。

これから読んでみます。

以下の3つで構成されているって書かれています。

上から順に難しくなっているみたいです。

<Fortnite Creative Toolset>

軽く読んだ感じではこれで島を作成出来るみたいです。後GameのRuleの作成も出来るのかな?

そしてここが重要なんですが、作成した島は販売する事が出来るみたいです。

どうやって販売するのかはまだ分かりません。

これ見ると島を作成するにはFortniteの仕組みを理解する必要があるみたいですね。Hubがどんな機能をGame内で担当しているのかよく分かりません。

Unreal Editor for Fortnite (UEFN)>

Unreal Editor for Fortnite (UEFN)についてです。

成程。

分かりました。

Unreal Editor for Fortnite (UEFN)を使用するとFortnite Creative Toolsetよりももっと細かい内容や自由にGameが作成出来るようになるそうです。

つまり順序として

  1. Fortniteで遊ぶ
  2. Fortnite Creative Toolsetで島やGameを作成する
  3. Unreal Editor for Fortnite (UEFN)を使用してもっと複雑な内容のGameを作成する

と言う順番になっていたんです。

この順番に勉強しないと、Unreal Editor for Fortnite (UEFN)が何をやっているのかが永遠に理解出来ない事態になる訳です。

Unreal Editor for Fortnite (UEFN)では(Fortnite Creative Toolsetでは出来ない)以下の事が出来ると書いています。

うーん。

大体理解出来て来ました。

UEFNを使用すると

Fortniteに直接、公開出来るとあります。

これって具体的にどういう事なんでしょう?

ここが一番知りたい所なんですが説明を聞いてもよく分かりません。

Fortniteを一回もPlayした事ない人にでも理解出来るような説明がどこかにないですかね。

この後はVerse Programming Languageの解説が続きます。

軽く読んだ感じだと、VerseはやっぱりProgramming初心者でも学べるように細心の注意を払って作成されたProgramming言語みたいです。

これは、教育と言う面から見た場合凄い良いと思います。

最初の疑問である「Programming初心者でもGameが作成出来るのか?」の解答ですが、完全にYesですね。

次の疑問である「何を作成したら製品として売る事が可能なのか?」ですがこれは島とかもそうかもしれませんが、完全にGameそのものみたいです。

以下の箇所で公開する方法について詳しい解説が載っているみたいです。

もう時間が無くなってしまったので今回の調査はここまでとしますが、来週もこの続きを勉強する事にします。

11.DirectXの勉強

11.1  C++ DirectX 12 Game Engine - [S01E03] - Creating A Game Engine [2]のAn Application Interfaceを実装する

先週勉強した C++ DirectX 12 Game Engine - [S01E03] - Creating A Game Engine [2]を実装します。

大体の流れを復習すると

  1. h FileとApplication.cpp FileをBlank Projectに作成します。
  2. InterfaceであるcppとIApplication.hをOlympus Engine Projectに作成します。

です。

まずApplication fileの作成から始めます。

まずView Modeを変更します。

Switch View Mode IconをClickして

Folder Viewを選択します。

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

Blank Project Folderを開きます。

ここにあるSource Folder内にApplication Fileを作成します。

Application.hを追加しました。

Spellingとか間違っていませんね。

Application.cppも作成します。

はい。

今度はこの作成した2つのFileをSolution Viewから紐づけます。

確かTutorialでは一端Private FilterにHeader FileとSource Fileを両方紐づけて、その後でHeader FileだけPublic Filterに移動していたはずです。

これも試してみます。

MouseでApplication.hを選択してそれをDrag and DropでPublic Filterに落としているだけです。

出来ました。

Application.cppの実装を行います。

取りあえずはこんだけです。

次にApplication.hの実装を行います。

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

全部自分で打つのは面倒なのでSample CodeからCopy and Pasteしました。

Sample Codeは

S01E03のApplication.hを使用しました。

がこのSample Code。Error表示しまくっています。

こっちは C++ DirectX 12 Game Engine - [S01E03] - Creating A Game Engine [2]の勉強が終わったら直す事にします。

Application.cppにHeader fileで宣言した関数の実装を追加します。

これClickしてErrorを直すとDefinitionをCpp Fileに追加しますか?と聞いてきます。

という事は

Definitionを追加しているんでしょうか?

残りの関数も追加しました。

今度はInterfaceの作成ですが、その前にこのInterfaceを使用するための説明が、

先週、よく分からんかった。と書いています。

先週この説明を聞いたときは、ApplicationはBlank Projectに作成してその元になるInterfaceはOlympus Engine Projectに作成する必要がある事にまだ気が付いていませんでした。

そういう訳で、今もう一回説明を聞いたら今度は理解出来るかもしれません。

もう一回だけ、このInterfaceを使用するための説明を聞いています。

はい。

今度は理解出来ました。

WinMain.cppがどうとか、Application Fileがどうとか、色々言っていますが、その辺はあんまり重要じゃなかったです。

ここで言っていた事は、どうやってApplication Fileを呼び出すのか、に尽きます。

毎回、Projectを実装した時にApplicationを呼び出しますが、呼び出すApplicationはそれぞれのProjectで違う訳です。

それを毎回、Programmingを組み直していたら大変です。

ので一回の実装でそれぞれのProjectで違うApplicationを勝手に呼び出してくれるようにしたい訳です。

それを可能にするにはInterfaceを作成する必要があります。

という内容の話でした。

つまり一般的なInterfaceの機能についての解説だったんです。

まあ、話の流れ的に言ってそんな感じの内容になるのは、先週の時点で予測はしていました。

ので理解出来なくてもそんなに重要じゃないだろうとも思っていました。

Application Fileの元になるInterfaceを作成します。

Folder Viewに戻り、今度はOlympus ProjectのFolderを開きます。

Olympus ProjectにはSource Folderしかないんですね。

心配になって来ました。

一応Tutorialの画像で確認しておきます。

以下にTutorialのFolder Viewを示します。

うーん。

あってます。

次はApplication用のInterfaceを作成するFolderを作成します。

Application用のInterfaceはPlatform毎に代わるそうです。

それで後から見た時に分かり易いようにPlatform Folderを作成し、その中に今回使用するWIN32用のFolderを作成します。

この分類って、間違ってない?

Platform Folderがあって、その次にWindow FolderとかApple FolderとかLinux FolderがあってそのWindow Folder内にWin32とかUWP Folderがあるのが正しい気がします。

うーん。

でもVisual StudioってMacLinuxでも動くんでしょうか?

Windowsしか動かないんならTutorialがやったようにPlatformの中にWin32とUWPしかない方が正しくなるのか。

分かりませんね。

次やります。

Interface用のFileを追加しました。

うーん。

Spellingはあっていますね。

更にWinEntry Header Fileを追加します。

あれ、

こんなFile追加したのか。

全く覚えていませんでした。

これでFolder Viewの変更は終わりです。今度はSolution Viewに戻ります。

Olympus ProjectのFilterは以下の様になっています。

まずこのSource FilterにあるPrivate FilterとPublic FilterにそれぞれPlatform Filterを追加します。更に追加したそれぞれのPlatform FilterにWIN32 Filterを追加します。

しました。

先程作成したFileを追加します。

Cpp fileはPrivate、H FileはPublicに追加します。

今度はIApplication.cppの実装をやります。

Tutorialが言ってる通りOlympus.hはInclude出来ません。

Olympus Engine ProjectのPropertiesを開き

C/C++のGeneralを開きます。

Additional Include DirectoriesにSource Folderを追加します。

これで合ってるはずです。

IAppilcation.cppの

Errorが消えました。

後、先週以下の様に書いていますが、

Folderでした。

このFource Fileから下のFolderを確認したらPlatform Folderがありました。のでFolderで間違いないです。

次はIApplication.hの実装をします。

Application.hの実装をそのままCopyしました。

InterfaceなのでVirtualと=0を追加します。

TutorialによるとConstructorには追加しないそうです。

うーん。

Interfaceの作成方法自体をもう一回復習します。

いろんなC++のInterfaceの作成方法についてのSiteを見ましたが、その例にConstructorがないです。

例えばGeek for GeekC++ Program to Create an Interface [11]では

以下に示したようなPureなVirtual Functionの書き方を示してくれていますが、

ここで紹介されている例は

でConstructorはどうしたら良いのかは不明です。

Geek for Geekは昔C++を勉強した時に沢山利用したSiteでその質と量がかなり良いです。

Geek for Geek に関してはC++界ではそれなりに有名な話があるんですが、知らない人が居るかも知れないのでここのその話を書いておきます。

ある日、Geek for Geek氏のサイトに書かれているC++の内容が間違っていると、イチャモン付けてきた人達がいました。

その人達は「お前の書いてる事は全部間違っている。Site全部消して勉強し直せ。」と怒りまくっていました。

その人達の言い分から推測すると、文句を言ってきた人達は、かなりのC++の専門家のようでした。

Geek for Geek氏はその人達の言い分をしっかり聞いた上で、C++の創設者(名前の発音がとても難しい人)が書いた本にはこのように解説してある。から私の解釈は正しいはずだ。と反論しました。

そしたらその人達は「お前の解釈は間違っている!やっぱりSite消して勉強し直せ。」と激怒しまくりました。

そしたらC++の創設者が、直接、Geek for Geek氏の解釈の方が正しい。とコメントしてきました。更にイチャモン付けてきた人達はC++を分かってない。と言い切ったんです。

そしたらこのイチャモン付けてきた人達が何と言ったかと言うと、C++の創設者が間違っているって言いだしました。

そして周りの人達が、いくらなんでもそれは無理があるだろう。と思っていると、文句を言ってきた人達はとんずらこいて逃げていきました。

話がそれました。

兎に角、C++におけるInterfaceの作成方法でConstructorはどうするのが一般的なのかが知りたいです。

見つけました。

Stack OverflowのC++ abstract base class constructors/destructors - general correctness [12]です。

つまりこのTutorialでやっているやり方が、C++における一般的なInterfaceの作成方法という事です。

はい。

解決しました。

続きをやります。

あれ?

先週のBlogではここで終わっています。

ConstructorがVirtualに出来ないのならDefinitionをSource Fileに追加する必要があるはずです。

Tutorialを見直します。

追加していました。

更にIApplication.cppにConstructorのDefinitionを追加しました。

これで完成です。

11.2 「DirectX 12の魔導書」の先週の勉強を復習する

Command ListとCommand Allocatorを実装しています。

そんだけです。

後、教科書の3.3.2のCommand ListとCommand Allocatorの役割を読み直したんですが、先週理解したつもりだったんのが少しだけ勘違いしている箇所がありました。

教科書ではCommand ListをInterfaceって紹介しています。

つまりその後にInterfaceを継承したClassかFunctionがあるはずなんです。

それが命令Objectなんです。

そしてその命令Objectを保持しているArrayかListみたいな役割をしているのが、Command Allocatorなんです。

ここは先週、勘違いして勉強していました。

11.3 「Direct3D 12 ゲームグラフィック実践ガイド」のCommand Queueの実装を復習する

今週はCommand Queueを作成する箇所を勉強する事にします。

先程、先週の勉強の内容を確認するためにVisual StudioのProjectを開いたらCommand ListとCommand Allocatorがどこにも書かれていない。

あれ?

っと見直したら「Direct3D 12 ゲームグラフィック実践ガイド」のProjectを間違えて開いていました。

その「Direct3D 12 ゲームグラフィック実践ガイド」のProjectの方なんですが、Command ListとCommand Allocator は実装してないのにCommand Queueは既に実装されていたんです。

で調べたら2023-03-06のBlogでCommand Queueの実装をしていました。

のでその復習からやる事にします。

まずD3D12_COMMAND_QUEUE_DESCを宣言しています。

その後で、D3D12_COMMAND_QUEUE_DESCの変数の値を指定しています。

これらの変数の機能も一応は調べてまとめてあります。

ただ今読み直すと、あんまり理解出来ているとは言い難いですね。

ここでもID3D12DeviceのMember Functionを使用していますね。

後、Parameterとして使用しているm_pQueueはID3D12CommandQueueのObjectだそうです。

以上です。

11.4「DirectX 12の魔導書」の「3.3.3 コマンドキュー」を勉強する

Direct3D 12 ゲームグラフィック実践ガイド」のCommand Queueで何を勉強したのかは大体判明したので、「DirectX 12の魔導書」の「3.3.3 コマンドキュー」を読む事にします。

読みました。

やっている内容は「Direct3D 12 ゲームグラフィック実践ガイド」のCommand Queueと全く同じです。

まずID3D12CommandQueueのObjectを宣言します。

次にD3D12_COMMAND_QUEUE_DESCのStructを宣言しています。

そしてD3D12_COMMAND_QUEUE_DESCの変数の値を指定します。

最後にID3D12DeviceのMember FunctionであるCreateCommandQueue()関数を使用して完成です。

これで完成です。

後、ResultのReturn ValueがS_OKで有る事を確認して下さい。と最後に書いてあります。

11.5「DirectX 12の魔導書」の「3.3.3 コマンドキュー」を実装する

それでは実装します。

ID3D12CommandQueue型のObjectを宣言します。

次にD3D12_COMMAND_QUEUE_DESCのStructを宣言します。

このStructの変数の値を指定します。

因みに、「Direct3D 12 ゲームグラフィック実践ガイド」では

と指定していました。

一緒ですね。

以下のCommentの説明が分かり易いです。

まあこれは2023-03-06のBlogでの勉強があったからかもしれませんが。

最後に

を追加します。

これで完成です。

テストします。

以下のテスト用のCodeを追加しました。

実行します。

出来てました。

11.6 HLSLシェーダーの魔導書を勉強する

<先週の復習>

先週はConstant Bufferについて勉強したんでしょうか?

こんな内容を書いていました。

これだけ?

これだけだと、何をやったのか全然分かりません。

先々週のBlogも読んでみます。

「3.1座標変換」を読んでいます。

そして以下の感想を述べています。

一寸、「3.1座標変換」を読み直します。

うーん。

多分ですが「3.1座標変換」の「3.1.6 メモリー転送」の「定数Buffer」を読んでConstant Bufferについて勉強しようとしたんでしょう。

あ、思い出してきました。

先週はDirectXを勉強する時間があんまり残っていなくて、とりあえずやった感だけ出しておこう。みたいな感じでパラパラ見て終わりにしたんでした。

じゃあ、

今週は「3.1.6 メモリー転送」の「定数Buffer」とSample CodeにおけるConstant Bufferについて勉強する事にします。

そしてその後で、Sample CodeにあるConstant Buffer Classの実装についても勉強する事にします。

<「3.1.6 メモリー転送」の「定数Buffer」>

教科書の「3.1.6 メモリー転送」の「定数Buffer」にConstant Bufferの役割を簡単にまとめた疑似Programmingが載っています。

これをまず理解するのが、Constant Bufferの本質を理解するために必要と感じました。

のでこの疑似Programmingの内容を以下にまとめます。

この疑似Programming、2つの事を行っています。

一つ目は当然ですが、Constant Bufferの生成とその値の指定です。

二つ目はWorld Matrix、Camera Matrix、そしてProjection Matrixをそれぞれ持つStructの作成です。

まずConstant Bufferの生成では

  1. Constant Buffer ClassからObjectを生成
  2. そのObjectのサイズを2つ目で作成するStructのサイズにする
  3. そのObjectに2つ目のStructの値をCopyする

次にWorld Matrix、Camera Matrix、そしてProjection Matrixのそれぞれを持つStructの作成では

  1. World Matrix、Camera Matrix、そしてProjection Matrixのそれぞれを持つStructの作成
  2. そのStructからObjectを生成
  3. World Coordinateを計算してそのObjectのWorld Matrixにセット
  4. Camera Coordinateを計算してそのObjectのCamera Matrixにセット
  5. Projection Matrixを計算してそのObjectのProjection Matrixにセット

を行っています。

<Sample CodeにおけるConstant Buffer>

今度はSample CodeのConstant Bufferについて調べます。

なんとSample CodeにおけるConstant Bufferの実装はこれだけした。

これは教科書に書かれていたConstant Bufferの疑似Programmingの最初の2つの手順の部分です。

<Sample CodeにあるConstant Buffer Class>

流石に先週よりは理解出来るようにはなりました。

Header fileから見ていきます。

まずこのClassが持つ変数です。

うーん。

まずこの変数から見ていきます。

うん。なんで2個しかないんでしょう。

教科書の疑似Programmingと同じならWorld Matrix、Camera Matrix、そしてProjection Matrixの3つのMatrixの値を保持するはずです。

うーん。

分からん。

次の変数です。

これは解説の意味は分かりますね。Constant BufferのAddressを保持させるための変数です。

これは来週じっくり勉強する事にします。

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

11.7 「Direct3D 12 ゲームグラフィック実践ガイド」の続きを勉強する

<先週の復習>

先週、何を勉強したのか全く覚えていません。

先週のBlogを読み直します。

教科書の「2.3.3 Swap Chainの生成」を読んでその内容をまとめています。

それで先週から以下のScheduleで勉強する事にしています。

お、

となると今週はCreate Swap Chain()関数を使用してSwap Chainを生成すれば良いのか!

やっと何を勉強する予定だったのか分かりました。

でも先週、その前の予定である「DXGI_SWAP_CHAIN_DESC構造体について」の勉強を最後までやったのか覚えていません。

それだけ確認します。

DXGI_SWAP_CHAIN_DESC構造体の設定の大半を占めるBuffer Descの元であるDXGI_MODE_DESC structureの設定のFormatやScanlineOrderingの説明を読んでも何を言っているのか分からん。と書いています。

そして前提条件を説明してくれないから、この説明を聞いてもしっくりこない。

前提条件を説明するのは物事を理解するのには必須だ。

と主張し始めています。

そしてこれは重要なのでこの事については来週まとめると言って終わっています。

はい。

そうだった。

今週は、「Direct3D 12 ゲームグラフィック実践ガイド」の勉強はお休みして、新しい事を理解するためにはその新しい事が何で新しいのかを理解出来るだけの前提条件を前もって知っておく必要がある事についてまとめるんでした。

11.8 前提を知る

前提条件って言う言い方は一寸間違っていました。

この場合、あらすじを知る必要がある。が正しいです。

人間って丸暗記するのは凄い苦手なんです。でもStory付けで何かを覚えるのは凄い得意なんです。

人間、一回でもStoryで聞いたことは忘れません。

これ誰でもそうです。

良く天才の証明にPhoto-memoryが挙げられます。写真を撮るみたいに見た映像をぱっと記憶出来る能力の事です。

大抵の場合はそれは嘘で、記憶したと言っていますがテストすると全く覚えていません。

しかし一人だけ本当にこの能力を持っている人にあった事があります。

アメリカの大学に居た時の中国人の同級生です。

PCの設定を一緒にしていたんですが、新しく買ったRooterの暗証番号を入力しないといけない時に、12桁の暗証番号を、本当に文字通り一瞬見ただけで暗記していました。

彼曰く、12桁位の数字を覚えるのは朝飯前で、本当に一瞬で記憶出来るそうです。

で、私は彼に対抗して12桁の数字を物語を付けて憶えたんです。

結構、対抗出来ました。

流石に物語を創作するには一瞬では無理ですが、それでも一端、物語が完成するとこれ絶対忘れないんです。

この物語式記憶術の凄い所は、全ての人間に当てはまる事です。

Photo-memoryのような極めて少数の人間しか保有していない特殊な能力に頼らなくても生存している全ての人間は何万年もの過酷な生存競争を生き延びてきたエリートの末裔なので、もっとすごい能力を持っているんです。

それが物語式記憶術です。

よく円周率を暗記する人がいます。

円周率をどれだけ言えるのかと数学の成績には相関関係がある。とか言う噂もあります。

で私は3.14までしか知りません。

その次の4桁を調べたら1592でした。

1592の語呂を調べたら、1592って朝鮮出兵の年号でした。

以後国(1592)最悪、朝鮮出兵

って覚えるそうです。

朝鮮出兵してから財政が傾いて、豊臣秀吉の政治基盤が崩壊したのは、歴史は漫画で読んだ程度の知識しかない私でも知っています。

以後国(1592)最悪、朝鮮出兵

は物語としてすぐに暗記出来ます。

そして円周率も、3.14朝鮮出兵とおぼえておけば、

3.14(以後国最悪、朝鮮出兵)だから3.141592だ。とすぐに思い出せます。

はい。

いや、今読み直したら、これは物語を利用したら暗記も凄くなる話で、これはこれで有効ですが、新しい事を理解するためにはその前提のあらすじを知っておく必要がある。という話とは一寸違っています。

うーん。でももう書いちゃったし、時間も無くなってしまいました。

新しい事を理解するためにはその前提のあらすじを知っておく必要がある。

と言う話の解説と根拠は来週またまとめる事にします。

12.まとめと感想

時間が無いのでまとめはなしです。

来週は、3カ月に一回のお休みですのでUEの勉強はお休みします。

13.参照(Reference)

[1] Magee, R. (n.d.). Foundations | Overview | SideFX. https://www.sidefx.com/tutorials/foundations-overview/

[2] OlympusMonsTutorials. (2021, March 17). C++ DirectX 12 Game Engine - [S01E03] - Creating A Game Engine [Video]. YouTube. https://www.youtube.com/watch?v=YgZSSE3qZqA

[3] CGHOW. (2023b, March 10). Noise to Stylized Trail in UE5 Niagara Tutorial | Download Files [Video]. YouTube. https://www.youtube.com/watch?v=e5c5rhtgaik

[4] Ben Cloward. (2022b, November 10). Metal Shader - Advanced Materials - Episode 7 [Video]. YouTube. https://www.youtube.com/watch?v=sjvL4q_KRZA

[5] David Das. (2022, April 12). DaVinci Resolve: How to export audio only [Video]. YouTube. https://www.youtube.com/watch?v=N_m0CRG3jm8

[6] Thaddaeus Andreades. (2023, January 18). Save hours! Procedural Foliage in Unreal Engine 5 - Photoreal Landscape Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=JpbWi95Bz20

[7] RockMap - Gaea Documentation - QuadSpinner. (n.d.). QuadSpinner Gaea Documentation. https://docs.quadspinner.com/Reference/Data/RockMap.html

[8] Andrea Cantelli. (2020b, June 6). Gaea Tutorial for Beginners #6 | Texturing our first terrain [Video]. YouTube. https://www.youtube.com/watch?v=d879QNdQG7U

[9] JSFILMZ. (2023, March 23). Fortnite Creative 2.0 Beginner Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=1xmVuhXmHD8

[10] Fortnite - Introduction | Epic Developer Community. (n.d.). Epic Developer Community. https://dev.epicgames.com/community/fortnite/new-to

[11] GeeksforGeeks. (2022, July 5). C   Program to Create an Interface. https://www.geeksforgeeks.org/cpp-program-to-create-an-interface/

[12] C++ abstract base class constructors/destructors - general correctness. (n.d.). Stack Overflow. https://stackoverflow.com/questions/8513408/c-abstract-base-class-constructors-destructors-general-correctness