UE4の勉強記録

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

「Unreal Engine 4.xを使用してRPGを作成する」の足りない部分を作成する 最初のmapの作成 Part3

f:id:kazuhironagai77:20210926213448p:plain

<前文>

前文には、アメリカで10年暮らした私が、日本人が誤解しているアメリカ、特に日本文化とキリスト教文化の違いから生じる誤解とその解決法について書いて置きます。

普段は私の話を鼻で笑っている人達が、仕事や学校で突然アメリカに行く事になると、私の所に滅茶苦茶真剣に聞きに来るんです。やっぱりアメリカで逮捕されたり、銃で撃たれたりするのは誰でも怖いみたいですね。でもそういう奴には、ここで書いている話は有料で売る事にしようかと思っています。

良く日本では、宗教、政治、差別の話題はアメリカではタブーである。と言われていますが、全くの嘘です。

実際は、宗教、政治、差別でしっかりした意見を持っていない奴は軽蔑されて全く相手にされなくなります。

今週は、テキサス州の中絶禁止法を例にして説明します。

私の住んでいた場所は結構な田舎の州で、物凄く保守的なんです。日曜日はみんなして教会に行くのが当たり前みたいな。流石に大学生はそこまで宗教的じゃない人も多かったですが、それでもかなりの数の学生が日曜日は教会に行っていました。

そんな中である日、かなり保守的で、日曜日には必ず教会に通うアメリカ人の友達が「今日は教会で長年の疑問に対する答えらしいモノを教えてもらった。」と言うんです。

私も暇だったのでどんな話か聞いたら「家の隣に引っ越して来た人が、ゲイだったらどう対応するのがキリスト教徒として正しいのか?」に対する解答だと言うんです。

何でこんな事に長年悩んでいるのかすら、日本人にはよく分からないかもしれませんが、キリスト教徒にとっては十戒は最も守らなければならない戒律で、下手をすると自分の命より厳しいものなんです。そしてその十戒には「ゲイは禁止する。」と「隣人を(自分の家族の様に)愛せ。」と両方が書かれているんです。

だから「家の隣に引っ越して来た人が、ゲイだったらどう対応するのが正しいのか?」がとても重要な問題になるんです。

はい。

彼の答えは結構複雑で、その意味を理解するためには更なるキリスト教の概念を理解しないといけなかったんですが、簡単にまとめるとこんな感じです。

神様は全知全能である。ので何でも出来る。その中で神の子である我々(彼にとってはキリスト教でない人も、まだキリスト教になってないだけなので我々と言う。)は自分の意思で選択する自由を持って生まれてくる。この選択する自由だけは全知全能の神様も奪う事が出来ない、神の子である我々だけに与えられた究極の自由である。ただしその選択した結果に関しては死んだ後に永遠の罰として受け入れないといけない場合もある。

だからどんなにあの子と結婚したいと神様にお願いしても叶わない時もある。それは彼女(もしくは彼氏)の自由であって神様にもどうする事も出来ない権利だから。

では隣人がゲイだった時はどうするのか?

彼が納得した答えはこうでした。その隣人がゲイである事を選択したのはその隣人の自由なので、どうする事も出来ないしするべきでもない。その隣人は死後、裁きにあって永遠の罰を受ける、つまり地獄に落とされるとしても、それを選択する自由はその隣人が持つ唯一の権利だから、その権利を奪う事は許されない。

そして熱心なキリスト教徒である私の友達に与えられた自由とは、そのゲイである隣人をキリスト教徒として家族のように愛するか否かの選択だけなんだ。と言う事でした。

そして彼はキリスト教徒だから、隣人である限りその人がゲイであっても家族の様に愛すべきだと結論づけました。

熱心なキリスト教徒であるアメリカ人から、こういうような話を沢山聞かされていると、私にもアメリカ人とキリスト教の関係がおぼろげながら分かって来ました。

アメリカ人に取って彼らとキリスト教との関係とはとっても個人的な物なんです。自分とキリスト教の間には他人が入る隙間はないんです。

私はキリスト教徒ではありませんが、この考え方は常識ある人間として生きていく上でとても健全だと思います。

ところがですよ。

今回のテキサス州の中絶禁止の法律は、この健全なキリスト教観の真逆なんですよ。自分の事を顧みないで他人の選択の自由を奪う事ばかり考えているんですよ。こんなのアメリカの田舎に住んでいておじいさんの代から共和党にしか投票した事ない人達だってオカシイと思っていますよ。

ほとんどの日本人は日本にいるアメリカ人から「宗教、政治、差別の話題はタブーである。」と言われて、アホみたいにそれを信じて宗教、政治、差別に対して何も勉強していません。

そしてアメリカに行って初めて、こういう背景のある「今回のテキサス州の中絶禁止の法律」について意見を聞かれた時に、アホみたいに ” I don’ t know. ” を繰り返して、アメリカ人から軽蔑されて挙句の果てには無視されるように成ってしまう訳です。

それでは今週の勉強を始めます。

<本文>

1.今週の予定

今週は以下の事を、

やっていきます。

2.Niagara : Static Mesh Sampling in UE5 Niagara Tutorial [1] 続き 

今まではParticle System に最もEnergy をつぎ込んでいましたが、今週からは軽くやります。

2.1 先週の復習から

Lerp Particle Attribute Module

「このModuleの機能を説明する簡単なEffectを作成したい。」と言っていましたので作成してみましょう。

いつもの等加速度直線運動のEmitterを作成しました。

f:id:kazuhironagai77:20210926213619p:plain

Lerp Particle Attribute ModuleをParticle Spawn Sectionに追加します。

Position のLerp Positionにチェックを入れます。

f:id:kazuhironagai77:20210926213640p:plain

するとPosition AとBにParticle のPositionがセットされているのが表示されます。

このAとBの割合を指定してLinear Interpolationに基づいて混合するのがこのLerp Particle Attribute Moduleの働きです。

試しにPosition BにRandom Vectorをセットして値を50にします。

f:id:kazuhironagai77:20210926213725p:plain

そしてPosition AとBの混合割合を0:100にするためにLerp Particle AttributeのLerp Alphaの値を1にセットします。

f:id:kazuhironagai77:20210926213751p:plain

その結果、Spriteの発生する場所がRandomに成りました。

f:id:kazuhironagai77:20210926213810p:plain

ここで大切な事はPosition AとPosition Bの値の混合値をParticle のPosition 変数に代入していると言う事です。

だからPosition AもしくはPosition BにPosition 変数をセットする必要はありません。

以下の方法でも

f:id:kazuhironagai77:20210926213846p:plain

Position 変数に値はパスされています。

f:id:kazuhironagai77:20210926213916p:plain

Orient Mesh To Vector ModuleInitial Mesh Orientation Module

f:id:kazuhironagai77:20210926213935p:plain

このModuleは何をしているのか良く分かりませんね。

解説には以下の説明がありました。

f:id:kazuhironagai77:20210926213954p:plain

試しにZ軸に対してLockしてみたら

f:id:kazuhironagai77:20210926214012p:plain

Z軸に対して垂直に生成されるようになりました

f:id:kazuhironagai77:20210926214038p:plain

先週は以下の様な方法で使用しています。

f:id:kazuhironagai77:20210926214056p:plain

これだとCornのMeshを球のMeshの法線に対して平行に生成するんじゃないでしょうか?

f:id:kazuhironagai77:20210926214116p:plain

あ、その通りでした。それで次のInitial Mesh Orientation ModuleでCornの向きをY軸に対して90度回転させていたんですね。

f:id:kazuhironagai77:20210926214149p:plain

360度*0.25で90度と言う訳です。

2.2  Static Mesh Sampling in UE5 Niagara Tutorial [1] 続き 

先週やらなかった残りをやります。

Colorを追加する>

Tutorialでは球とドーナツにMayaを使用して色を追加してます。

f:id:kazuhironagai77:20210926214228p:plain

Starter Kitに含まれるMaterialで代用しました。

f:id:kazuhironagai77:20210926214246p:plain

f:id:kazuhironagai77:20210926214252p:plain

と思ったらVertex にMayaで指定した色を保持させてその色をMaterialで引き出して球とドーナツに色付けしています。

この部分の作成は難しいですね。

仕方ないので形だけ真似る事にします。

Materialを作成します。

f:id:kazuhironagai77:20210926214311p:plain

そのMaterialを球とドーナツにセットします。

f:id:kazuhironagai77:20210926214334p:plain

Scratch Module内で球やドーナツのそれぞれを構成する一つ一つのMeshの位置や法線を取ったように色をGet Tri Color ノードで取ります。

f:id:kazuhironagai77:20210926214358p:plain

その値をMy Sphere ColorとMy Torus Colorに保持させます。

f:id:kazuhironagai77:20210926214416p:plain

Particle Update SectionにColor Moduleを追加します。

f:id:kazuhironagai77:20210926214434p:plain

以下のような設定にします。

f:id:kazuhironagai77:20210926214451p:plain

出来ていますが、達成感があまり感じられません。

f:id:kazuhironagai77:20210926214513p:plain

2.3 Hanging Particulates Templateの再現

流石にこれだけだと短いのでもう少しだけ勉強します。

それで以下のEmitterのTemplateを自分で最初から作成する事に挑戦します

f:id:kazuhironagai77:20210926214540p:plain

多分、今の実力なら簡単でしょう。今回はHanging Particulates Templateの再現をします。

f:id:kazuhironagai77:20210926214559p:plain

こんなやつです。

Emitter Stackはこんな感じです。

f:id:kazuhironagai77:20210926214618p:plain

Emitter Setting SectionのEmitter Properties Moduleを見ると

f:id:kazuhironagai77:20210926214641p:plain

CPUで計算しています。

この数ならCPUでも問題ないんでしょうか?

どの位のParticleを生成しているのか確認します。

Emitter Update SectionのSpawn Rate Moduleを見ると

f:id:kazuhironagai77:20210926214701p:plain

f:id:kazuhironagai77:20210926214712p:plain

50にセットされていました。1秒間に50回、Particleの生成を行っていますね。

Spawn Burst Instantaneous Moduleを使用して一辺に大量のParticleを生成してキラキラさせていると思っていたのでSpawn Rate Moduleを使用していたのは意外でした。

Particle Spawn Section のInitialize Particle Moduleを見てみます。

f:id:kazuhironagai77:20210926214742p:plain

f:id:kazuhironagai77:20210926214748p:plain

Life timeとSpriteのサイズがRandomなのは分かりますね。

Sprite Rotation ModeがRandomなのは、うーん。意味が分からないです。結局、Spriteだから常に面がカメラに向かっている訳でしょう。

そこに移している絵が回転するんでしょうか?

この変数の値によってどんな変化が起きるのか不明ですね。

Particle Spawn SectionのBox Location ModuleとSphere Location Moduleについて

f:id:kazuhironagai77:20210926214810p:plain

二つのLocation Moduleを同時に使用する事も出来るんですね。

Box Location Moduleのみだと、こんな感じです。

f:id:kazuhironagai77:20210926214829p:plain

Sphere Location Moduleのみだとこれです。

f:id:kazuhironagai77:20210926214847p:plain

二つを同時に使用するとこんな感じです。

f:id:kazuhironagai77:20210926215022p:plain

単純に二つの形を足した形状にはなっていませんね。どういう計算なんでしょうか?

Particle Update SectionのCurl Noise Force Moduleをみます。

f:id:kazuhironagai77:20210926215042p:plain

f:id:kazuhironagai77:20210926215048p:plain

このModuleがParticleをふわふわ移動させているんですね。

Curl Noiseって流体の動きを再現するのに使用される奴でしたよね。

Particle Update SectionにはDrag Moduleも使用されていました。

f:id:kazuhironagai77:20210926215107p:plain

f:id:kazuhironagai77:20210926215113p:plain

この値は良く分からないです。Drag Moduleがどんな計算をしているのかも知らないです。

f:id:kazuhironagai77:20210926215133p:plain

うーん。結構簡単なModuleかもしれませんね。

読んでみますか。

f:id:kazuhironagai77:20210926215151p:plain

Transient Physics Drag変数がありますね。

Transientは今一、良く分かっていないName Spaceなんですが一応、そのSectionが実行される間、生きていると考えています。この場合、Physics Drag変数はParticle Update Sectionの実行中だけ存在する訳です。

それを確認したいですね。

Solve Force And Velocity ModuleにPhysics Drag変数が使用されていますね

f:id:kazuhironagai77:20210926215222p:plain

Physics Drag変数については、Hanging Particulates Templateを再現する時にもう一度調査しましょう。

このPhysics Drag変数にInputのDragを追加しているだけですね。

f:id:kazuhironagai77:20210926215243p:plain

回転にかかるDragは今回は使用していないのでスキップします。

Scale Sprite Size Moduleです。

f:id:kazuhironagai77:20210926215301p:plain

f:id:kazuhironagai77:20210926215307p:plain

Spriteのサイズを変更してるだけですね。

Scale Color Moduleです。

f:id:kazuhironagai77:20210926215324p:plain

f:id:kazuhironagai77:20210926215330p:plain

α値を変化させているだけですね。

最後にRender SectionにSprite Rendererが使用されています。

f:id:kazuhironagai77:20210926215348p:plain

大体分かりました。無のEmitterから同じモノを作成してみます。

f:id:kazuhironagai77:20210926215406p:plain

Emitter Update SectionのEmitter State Moduleの値を変更します

f:id:kazuhironagai77:20210926215424p:plain

f:id:kazuhironagai77:20210926215430p:plain

一応、Templateと同じ値にしましたが、あんまり意味があるとは思ってないです。

Emitter Update SectionにSpawn Rateを追加します。

f:id:kazuhironagai77:20210926215450p:plain

f:id:kazuhironagai77:20210926215456p:plain

Spawn Rateは50にセットしました。

f:id:kazuhironagai77:20210926215515p:plain

f:id:kazuhironagai77:20210926215522p:plain

やっぱりここで分からないのがSprite Rotation ModeとSprite UV Modeですね。何を指定してるのか予想がつかないです。

更にBox Location ModuleとSphere Location Moduleを追加しました。

f:id:kazuhironagai77:20210926215542p:plain

値はTemplateと同じです。

こんな感じです。

f:id:kazuhironagai77:20210926215600p:plain

Particle Update SectionにCurl Noise Force Moduleを追加しました。

f:id:kazuhironagai77:20210926215618p:plain

Particle がフワフワし始めました。

f:id:kazuhironagai77:20210926215636p:plain

このCurl Noise Force Moduleの変数の変化を表すEmitterも後で作成します。前に勉強した時はまだNiagaraの仕組みが分かってなかったのでNiagaraで実際に試す事は出来ませんでした。今度はもう少しだけCurl Noise Force Moduleの実態にせまれるでしょう。

Drag も追加しました。

f:id:kazuhironagai77:20210926215855p:plain

f:id:kazuhironagai77:20210926215901p:plain

Particleの動きはユックリに成りましたがそれだけですね。

炎のEffectの勉強をした時のEmberの様な地味だけどあると炎らしさを盛り上げる脇役的な凄みも感じません。

Scale Sprite Size Moduleを追加します。

f:id:kazuhironagai77:20210926215922p:plain

f:id:kazuhironagai77:20210926215927p:plain

ここはModuleよりDynamic Inputが良く分からないです

f:id:kazuhironagai77:20210926215945p:plain

f:id:kazuhironagai77:20210926215953p:plain

Vector 2D Floatは単に一つの値を2つにしただけです。

何でこんな事をしているんでしょうか?

いきなりFloat from Curveを入れちゃ駄目なんでしょうか?

この辺も後で検討します。

最後の追加するModuleですが、Scale Color Moduleです。

f:id:kazuhironagai77:20210926220017p:plain

こっちは普通にFloat From Curveを追加しています。

以上です。

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

f:id:kazuhironagai77:20210926220036p:plain

流石に2か月前とは違ってほとんど何をやっているのかは理解出来ました。

Vector 2D Floatについては来週調査します。

Physics Drag変数の調査も忘れていました。これも来週やります。

3.Material : 先週の続き

3.1 先週の復習など

UE4VFXを勉強しているとそのVFXが素晴らしくなるかどうかの30%位はMaterialの素晴らしさにかかっている事が分かります。これはLandscapeの作成の時と似ています。それでMaterialの勉強を開始する事にしました。

それでBen Cloward氏のShader Graph Basics [2]でMaterialの勉強をする事にしました。

それで突然思いだしたんですが、池田 亘氏の「HoudiniとUnreal Engine 4で学ぶ リアルタイム VFX」[3] でも2章分ぐらい、Materialについて語っていた気がします。前読んだときは、なんでVFXの勉強するための本なのにMaterialについて解説してるんだと不満に思い、Materialについては軽く読んで終わりにしてました。この辺をもう一度確認します。

不満に思ったと言えば、Sherif William氏の「 Unreal Engine 4 Scripting with C++ Cookbook」[4]の11章、Custom Materials and ShadersでもMaterialについて解説していたんですが、その本で勉強した時は「何これUE4C++について教えると言って、何でBPで教えてるの?」と激怒してその章は読むのを止めてしまいました。今になってみると、この本のMaterialの内容も一応もう一度確認しておいた方が良い気がしています。

後、公式のDocumentや公式のOnline Learningもチェックします。

この辺について今週はやっていきます。

3.2 Your First Shader - Shader Graph Basics [5] を勉強する

まず、ぱっと見たのですが本当の初心者向けです。全くUEを触った事が無い人でも出来るように教えています。

それでもこの初心者向けのTutorialで知らない事があったら問題な訳で、一応見て置いて損はないでしょう。

後、Unityで同様の操作を教えています。

うーん。これは興味深いです。

C#は問題なく使用出来るんでUnityを勉強する弊害はないんですね。ただ私は本格的なソフト開発はC++でするべきであると強く信じているので、最終的な選択はUEになってしまいます。

ただしUnityのMaterialの以下の構成には惹かれるものがあります。

f:id:kazuhironagai77:20210926220133p:plain

GLSLそのままですから。

今週は、Unityの部分は見るだけにします。一週間考えてからInstallするか決めます。

このTutorialで教えている内容で私が知らなかった事をまとめておきます。

<UE5の表示されている文字を大きくする方法>

f:id:kazuhironagai77:20210926220155p:plain

Tool->Debug->Widget Reflectorを選択してWidget Reflectorを開きます。

f:id:kazuhironagai77:20210926220218p:plain

Application Scaleの値を変更します。文字のサイズを1.5倍にしたいときは1.5と入力します。

f:id:kazuhironagai77:20210926220233p:plain

Field of Viewの設定>

次はMaterial EditorのField of Viewの設定箇所の説明です。

f:id:kazuhironagai77:20210926220251p:plain

Field of Viewの設定箇所は分かったんですが、確かField of Viewって縦と横があったと思うんです。これはどっちを指しているんでしょうか?

私はこの辺の値は弄る気はないのでどうでも良いですが。

PreviewのBackground を消す方法>

PreviewのBackground を消す方法がここにあるのは知らなかったです。

f:id:kazuhironagai77:20210926220316p:plain

EffectみたくBackgroundの色を変化する方法はないんでしょうか?あったら知りたいです。

f:id:kazuhironagai77:20210926220336p:plain

私が以下のボタンの使用方法について知ったのは最近です。

f:id:kazuhironagai77:20210926220351p:plain

このボタンの使用方法については軽く説明していました。

こんだけです。私が知らなかった事は。

一応結果も貼っておきます。

f:id:kazuhironagai77:20210926220404p:plain

3.3 Basic Shader Math - Shader Graph Basics - Episode 4 [6] を勉強する

流石にこれだけだと勉強した事にならないのでもっとやります。

まず、ぱっと見ました。特に知らない事は無かったと思います。

Material内における四則計算について解説しています。

3.4 Understanding Texture Maps - Shader Graph Basics - Episode 5 [7] を勉強する

どんどん行きます。

ここから少しだけ本格的になって来ます。

まず、TextureをUE5 にImport しますがUE5内でそのTextureを保持する時は別なFormatで保持されます。

のでそのTextureのサイズを知る為にはTextureを開いてDetailのResource Sizeを見る必要があります。

f:id:kazuhironagai77:20210926220431p:plain

Alphaを追加するだけでTextureのサイズは約2倍になります。Alphaを使用しないTextureは最初からAlphaは省いておきましょう。

Compression SectionにあるMaximum Texture Sizeの値を変化させると

f:id:kazuhironagai77:20210926220446p:plain

f:id:kazuhironagai77:20210926220451p:plain

Resource Sizeも変化します。

f:id:kazuhironagai77:20210926220505p:plain

f:id:kazuhironagai77:20210926220511p:plain

今度は圧縮のタイプについてです。現在、DXT5という圧縮方法が選択されています。

f:id:kazuhironagai77:20210926220525p:plain

これはAlpha Channelが使用されている圧縮方法です。

もしこのTextureがAlpha Channelを使用しない場合は、

f:id:kazuhironagai77:20210926220537p:plain

にチェックを入れます。

f:id:kazuhironagai77:20210926220550p:plain

FormatがAlpha ChannelのないDXT1に自動的に変更されTextureのサイズも5461Kbから2731Kbに縮小しました。

元のTextureから圧縮したくない場合はRGBAを選択すれば良いそうです。

f:id:kazuhironagai77:20210926220603p:plain

実際のTextureではどれを選択すべきかを解説しています。

Base Color用のTexture->DefaultであるDXT5

後、TextureがColorであるため以下のsRGBにチェックを入れる必要があります。

f:id:kazuhironagai77:20210926220648p:plain

Roughness用のTexture->Masks

sRGBはOffです。

成程、と思って、実際にStarter Kitで使用されているMaterial(M_Brick_Clay_Beveled)を開いて見たら

f:id:kazuhironagai77:20210926220704p:plain

Roughnessに使用されているTexture(T_Brick_Clay_Beveled_M)は

f:id:kazuhironagai77:20210926220717p:plain

DefaultでsRGBにもチェックが入っていました。

このTextureのRにはAmbient Occlusion用、BにはRoughness用のデータが入っていますがsRGBにチェックを入れる必要はあるんでしょうか?

この辺は良く分かりませんね。

このすぐ後で説明されていました。

別々なChannelのデータを一つのTextureに組み込んだ場合は、sRGBのチェックは要らないそうです。

成程、とT_Brick_Clay_Beveled_MのsRGBのチェックを外したらErrorになってしまいました。

f:id:kazuhironagai77:20210926220734p:plain

ウーン。良く分からない。これを理解するためにはsRGBの勉強も必要ですね。

Hight Map用のtexture―>Gray Scale

Hight Map用のTextureにCompressionを掛けると微妙な高さを示すGradientが無くなってしまうので圧縮せずにGray Scaleをそのまま運用するのが良いそうです。

最後はNormal Mapです。

f:id:kazuhironagai77:20210926220749p:plain

Normal専用の圧縮であるBC5が使用されています。

以上です。

これはかなり勉強になりました。

3.5 公式のDocumentをチェックする

Materialに関する公式のDocumentをチェックするのを忘れていました。

Designing Visuals, Rendering, and Graphics [8] の当りから見るのが順当でしょうね。

f:id:kazuhironagai77:20210926220810p:plain

この中で以下のTutorialはそのものズバリですね。

f:id:kazuhironagai77:20210926220824p:plain

On line Learningについても調べて見ます。

Materialで検索すると33個のTutorialがありました。

f:id:kazuhironagai77:20210926220849p:plain

ぱっと見るとほとんど関係ないのものや、あまり質の良くないのもありそうです。

後でじっくり選別しましょう。

3.6 HoudiniUnreal Engine 4で学ぶ リアルタイム VFX[3]のMaterialに関して述べている部分をチェックする。

ぱっと見ると3~5章がShaderについて述べているようです。のでその辺を軽く読んでみます。

3章はMaterialについてそのものです。ここでの四則計算はTextureとの関連において解説されていてMaterialで説明する意味が分かります。Basic Shader Math - Shader Graph Basics - Episode 4 [6]は単なる四則計算の説明をしてて全くBPの使用方法が分からない人にいきなりMaterialを教えるつもりなのかと???となりました。

4章はMaterialとEffectの関係についての解説ですね。Materialを直す事でEffect自体が変わってくる事を具体的な例を用いて説明しています。

ただ4章で使用されている例は、ちょっと極端な気がします。もう少し基本的なサンプルで解説しても良かったと思いました。

5章はVertex Shaderについてでした。

3.7 Unreal Engine 4 Scripting with C++ Cookbook[4]のMaterialも復習しておく

これはもうずっと前になりますが、この本でUE4C++の勉強をしていた時にMaterialの章になったら全部BPで説明していて何でC++の本なのにBP使ってんっだ騙された。とかなり激怒した記憶があります。

今になって思えば、UE4のMaterialの部分をC++というかShader 言語だけで書く仕組みは元々ない訳で、そこまで怒る必要も無かったかもしれません。

ただそんなにスゴイ事は書いては無いと思いますが一応確認だけはしておきます。

一番最初の節にはBase ColorやRoughnessなどのPBRについての説明がありました。次に水のMaterialを作成するために必要なMaterial内でのPositionの移動方法についての解説です。その後でCustom Nodeについて解説しています。

うーん。結構しっかりした作りでした。

これはもう一回勉強する必要がありますね。

3.8 Materialまとめと感想

MaterialのTutorialについて簡単ですが調べました。その感想をここにまとめます。

MaterialはMeshにTextureを貼る時だけでなくEffectやLandscapeの作成、更にPost Processでも使用される幅の広い機能ですが、基本的に理解しなければならない部分はかなり共通している気がしています。

例えば、PBRについてはBase Color、Roughness、MetallicそしてSpecularについて理解する必要があります。

更に操作方法としてTextureに対する四則計算から始まりTimeなどのNodeの使用方法を覚える必要があります。

ここで応用として色々な物質の質感(例えば木、金属、プラスチック、石など)の出し方も勉強すると効率が良さそうです。

その後で、EffectやLandscapeのためのMaterialの作成について勉強します。

Materialの使用方法を理解して自由に好きなMaterialを組めるようになるための学習ロードマップは以上の様になる気がします。

後、私個人の疑問としては本当に大学レベルの物理も数学も知らない人でもMaterialを自由に組めるようになるのか知りたいです。例えばFresnel 反射について理解出来なくてもFresnel関数のノードの使用方法さえ覚えてしまえばMaterialが組めるようになるのかどうかをです。

4.Map1の作成の続き

4.1 地面の色がオカシイ

先週、Componentの継ぎ目で地面の色がオカシクなっているのに直し方が分からない。と書いていました。

f:id:kazuhironagai77:20210926220946p:plain

この部分です。

f:id:kazuhironagai77:20210926220959p:plain

このImageからもComponentの境で地面の色が変化しているのが分かります。

直しました。

f:id:kazuhironagai77:20210926221013p:plain

直し方は簡単でLandscapeのPaintでGrass_LayerInfoをPaintするだけでした。

f:id:kazuhironagai77:20210926221027p:plain

一部でもGrass_LayerInfoでPaintされたComponentは地面そのものの色が薄くなります。

この違いが何故現れるのかは分かりません。

4.2 会話の確認

先週作成した会話がオカシクないか確認します。

<村長>

村長との会話です。

f:id:kazuhironagai77:20210926221115p:plain

最初から文の推敲が必要ですね。

f:id:kazuhironagai77:20210926221130p:plain

セリフを移す紙の解像度が低すぎます。別なのに変えます。

f:id:kazuhironagai77:20210926221143p:plain

回答ボタンにもImageを追加してみました。

f:id:kazuhironagai77:20210926221159p:plain

背景が見えるようにImageを少しだけ透明にしました。

f:id:kazuhironagai77:20210926221212p:plain

これで行きます。

「金の切符について…」を選択します。

f:id:kazuhironagai77:20210926221226p:plain

このセリフも推敲の余地ありです。

直しましょう。

f:id:kazuhironagai77:20210926221243p:plain

他のセリフも推敲しましょう。

直しました。

他のNPCについても直していきます。

<村長の腰巾着>

f:id:kazuhironagai77:20210926221301p:plain

こいつを直していきます。

f:id:kazuhironagai77:20210926221315p:plain

セリフも全部直しました。

<天気予報する老人>

f:id:kazuhironagai77:20210926221333p:plain

このNPCは特に目的がないです。見た目だけ直します。

f:id:kazuhironagai77:20210926221348p:plain

<引退した戦士>

f:id:kazuhironagai77:20210926221401p:plain

これも推敲します。

f:id:kazuhironagai77:20210926221414p:plain

セリフを推敲します。

<魔法研究家>

f:id:kazuhironagai77:20210926221432p:plain

見た目から直します。

f:id:kazuhironagai77:20210926221449p:plain

セリフも少しだけ直しました。

<商売人>

f:id:kazuhironagai77:20210926221506p:plain

直しました。

f:id:kazuhironagai77:20210926221521p:plain

<政治の話ばかりするおじさん>

f:id:kazuhironagai77:20210926221539p:plain

直しました。

f:id:kazuhironagai77:20210926221552p:plain

セリフはあまり推敲する箇所が無かったです。

<山好きな老人>

f:id:kazuhironagai77:20210926221611p:plain

直します。

f:id:kazuhironagai77:20210926221623p:plain

<村の詩人>

f:id:kazuhironagai77:20210926221644p:plain

この詩の内容も物語に関係ないですね。

f:id:kazuhironagai77:20210926221658p:plain

関係ない話なので、セリフは今回は直さないでおきます。

<村の占い師>

f:id:kazuhironagai77:20210926221716p:plain

この占い師のセリフもどう直すべきか、まだ決まっていません。見た目だけ直します。

f:id:kazuhironagai77:20210926221728p:plain

<科学者の卵>

f:id:kazuhironagai77:20210926221745p:plain

f:id:kazuhironagai77:20210926221752p:plain

<村の老人>

f:id:kazuhironagai77:20210926221810p:plain

f:id:kazuhironagai77:20210926221817p:plain

これも特に直す部分が決まっていないので絵だけ直しました。

<村長の娘>

f:id:kazuhironagai77:20210926221837p:plain

f:id:kazuhironagai77:20210926221848p:plain

セリフも少しだけ直しました。

<村の保安官>

f:id:kazuhironagai77:20210926221908p:plain

見た目だけ直しました。

f:id:kazuhironagai77:20210926221921p:plain

<荒くれ者の戦士たち>

f:id:kazuhironagai77:20210926221939p:plain

これも見た目だけ直しました。

f:id:kazuhironagai77:20210926221956p:plain

これで全部直したはずです。確認します。

<謎の旅人>

謎の旅人を忘れていました。

f:id:kazuhironagai77:20210926222013p:plain

見た目だけ直しました。

f:id:kazuhironagai77:20210926222027p:plain

NPCは全部これで直したはずです。

5.Stream Levelの検討

Trigger boxにPlayer の操作するキャラが侵入したらStream Levelを読み込む事にします。

一番簡単なStream Levelは村人です。彼らは村に侵入しない限り登場する必要はありません。

f:id:kazuhironagai77:20210926222048p:plain

次は村の家や村の内部に生えている木です。これは城壁の外側からでも見えるため村人と同じ扱いには出来ませんが、Stream Levelに入れられます。

川も見えない時は沢山あります。Stream Levelに入れてしまいましょう。

Monsterの発生もStream Levelに入れたいです。

Landscapeも分けたいですね。

5.1 試しにやってみる

色々想像しない問題が発生しそうなのでMap1を別なProjectにMigrateしてそこで試してます。

f:id:kazuhironagai77:20210926222106p:plain

当然ですがErrorが凄いです。

Map1のBPの機能を全て切りました。

これでCompileする事が出来ました。

f:id:kazuhironagai77:20210926222121p:plain

Errorはまだ出ている状態ですが、テストするには十分な環境でしょう。

色々試してみます。

<村を別なLevelに移す>

新しいStream Levelを作成してそこに村を移しました。

f:id:kazuhironagai77:20210926222152p:plain

f:id:kazuhironagai77:20210926222158p:plain

Trigger boxは以下に示したように作成しました。

f:id:kazuhironagai77:20210926222219p:plain

f:id:kazuhironagai77:20210926222227p:plain

テストします。

f:id:kazuhironagai77:20210926222248p:plain

ここからではまだ村が存在していません。

f:id:kazuhironagai77:20210926222304p:plain

村が現れました。

f:id:kazuhironagai77:20210926222318p:plain

村人も普通に生成されています。

f:id:kazuhironagai77:20210926222334p:plain

今度は奥の岩を別なStream Levelに移します。

f:id:kazuhironagai77:20210926222346p:plain

f:id:kazuhironagai77:20210926222353p:plain

f:id:kazuhironagai77:20210926222400p:plain

テストします。

あれ。

f:id:kazuhironagai77:20210926222415p:plain

思い出しました。Trigger boxはあくまでBoxにInした時に発動するんでした。Box内に生成されるときは発動しないんでした。

f:id:kazuhironagai77:20210926222428p:plain

こうしました。

f:id:kazuhironagai77:20210926222441p:plain

今度は出来ています。

f:id:kazuhironagai77:20210926222458p:plain

最後に真ん中の広場も別のStream Levelに移動します。

f:id:kazuhironagai77:20210926222511p:plain

やっている事は一緒です。ので詳細は省きます。

f:id:kazuhironagai77:20210926222525p:plain

f:id:kazuhironagai77:20210926222532p:plain

こんな感じで消えます。

今度はLandscapeもStream Level内で作成出来るか試してみます。

以下の様にLandscapeを追加してみました。

f:id:kazuhironagai77:20210926222556p:plain

f:id:kazuhironagai77:20210926222602p:plain

テストします。

Stream Level、Landscapeが読み込まれていない状態です。

f:id:kazuhironagai77:20210926222627p:plain

読み込まれている時です。

f:id:kazuhironagai77:20210926222642p:plain

うん。

LandscapeもSteam Levelで別々に読み込む事が出来ますね。

そしたら、以下のLandscapeを二つに分けてPersistent LevelとそのStream LevelであるLandscapeTest Levelに配置します。

f:id:kazuhironagai77:20210926222713p:plain

しかしその方法が分かりません。

色々弄ってやり方を見つけました。

このやり方が最善ではないかもしれませんが、兎に角出来ました。

やり方を下に記録しておきます。

まずLandscapeを選択して

f:id:kazuhironagai77:20210926222741p:plain

Scriptを選択します。

f:id:kazuhironagai77:20210926222755p:plain

するとSculptにHeight mapが表示されるので

f:id:kazuhironagai77:20210926222812p:plain

Export Fileを選択します。

f:id:kazuhironagai77:20210926222825p:plain

以下のMapのHight MapがExportされたはずです。

f:id:kazuhironagai77:20210926222841p:plain

こんな感じのやつです。

f:id:kazuhironagai77:20210926222853p:plain

次に新しくLandscapeを作成するStream Levelを開きます。

ここに先程ExportしたLandscapeと全く同じComponentのLandscapeを作成します。

以下の様にです。

f:id:kazuhironagai77:20210926222906p:plain

作成したら先程Export したHight MapをここにImportします。

やり方はExportした方法と同じで、最後にImportを選ぶだけです。

f:id:kazuhironagai77:20210926222920p:plain

すると色なしのLandscapeのCopyがStream Levelに完成します。

要らない部分のComponentをManageのDeleteを使用して消します。

f:id:kazuhironagai77:20210926222934p:plain

次に色を塗ります。

まず、先程作成したLandscapeを選択してLandscape Materialに元のLandscapeで使用しているのと同じMaterialをセットします。

f:id:kazuhironagai77:20210926222947p:plain

するとTarget Layersに以下の様なLayerが表示されるのでそれぞれのLayerに元のLandscapeと同じLayer Infoをセットします。

f:id:kazuhironagai77:20210926223001p:plain

これでLandscapeにPaint出来るようになったので、元のLandscapeと同じようにPaintします。

f:id:kazuhironagai77:20210926223018p:plain

こんな感じです。

今度は元のLandscapeで新しいLandscapeと重なっている部分を消します。

f:id:kazuhironagai77:20210926223032p:plain

Trigger Boxを追加します。

今回は2個のTrigger Boxを追加しました。

以下のように二つのTrigger Boxが重なっている部分があるので

f:id:kazuhironagai77:20210926223055p:plain

Boolean変数を2つ作成して

f:id:kazuhironagai77:20210926223107p:plain

両方がfalseの時だけこのStream LevelをUnloadするようにします。

f:id:kazuhironagai77:20210926223121p:plain

f:id:kazuhironagai77:20210926223126p:plain

以上です。

テストの結果も記しておきます。

Stream LevelがLoadされる前です。

f:id:kazuhironagai77:20210926223142p:plain

された後です。

f:id:kazuhironagai77:20210926223201p:plain

二つのTrigger Boxが重なった部分を移動していますが、Stream Levelが消えたりする問題は発生しません。

f:id:kazuhironagai77:20210926223216p:plain

ただし、つなぎ目ははっきり分かります。

f:id:kazuhironagai77:20210926223231p:plain

分かるだけじゃなくて所によっては隙間が空いています。

f:id:kazuhironagai77:20210926223245p:plain

Loadがかなり軽くなっているのは感じます。

PCがうねりを上げる事が無くなりました。

とは言っても上記に記した様な隙間がLandscapeに生じても困ります。

色々調べたらLevel Streaming 用のLandscapeを作成するためには、World Compositionを使用するらしいです。

結構そのものズバリのTutorialでありそうなWorld Composition And Basic Level Streaming - Unreal Engine 4 Tutorial [9] を見つけたので、これを先に勉強します。

5.2 World Composition And Basic Level Streaming - Unreal Engine 4 Tutorial [9] を勉強する。

いつもの空のLevelを作成します。

f:id:kazuhironagai77:20210926223307p:plain

まず、World SettingsのWorldからEnable World Compositionをチェックします。

f:id:kazuhironagai77:20210926223322p:plain

これでWorld Compositionが使用出来るように成るみたいです。

Sub Levelを追加します。

f:id:kazuhironagai77:20210926223338p:plain

このTutorialではStream Levelと呼ばずにSub Levelと普通に呼んでいました。Sub Levelの方が分かり易いですし、私も元に戻ってSub Levelと呼ぶ事にします。

Level1にLandscapeを作成します。

Landscapeの設定はTutorialと同じにしました。

f:id:kazuhironagai77:20210926223353p:plain

こんな感じです。

f:id:kazuhironagai77:20210926223407p:plain

Persistent Levelに戻りLevelsの右隣にある2つのIconのWorld Compositionをクリックします。

f:id:kazuhironagai77:20210926223424p:plain

以下のWindowが開かれます。これがWorld Compositionのようです。

f:id:kazuhironagai77:20210926223439p:plain

マウスの右クリックで座標を動かします。

f:id:kazuhironagai77:20210926223453p:plain

Landscapeを選択した状態でマウスの左を押し続けながら移動するとLandscape自体が動かせます。

f:id:kazuhironagai77:20210926223506p:plain

白い矢印はカメラの位置を示しています。

f:id:kazuhironagai77:20210926223520p:plain

次に別なLevelにLandscapeを追加する方法を示します。

このLandscapeを選択した状態でAdd Adjacent Landscape Levelから+Xを選択します。

f:id:kazuhironagai77:20210926223534p:plain

新しいLevelの名前とSaveする場所を聞いて来ます。

f:id:kazuhironagai77:20210926223549p:plain

答えると

f:id:kazuhironagai77:20210926223602p:plain

同様の方法で更に3つのLandscapeを追加します。

f:id:kazuhironagai77:20210926223619p:plain

このように4つのSub Levelに別々に作成したLandscapeですが

f:id:kazuhironagai77:20210926223633p:plain

LandscapeのSculptから4つの別々なLevelに存在するLandscapeを同時にScript出来ます。

f:id:kazuhironagai77:20210926223701p:plain

World CompositionをZoom outするとLandscapeの最大値が見られます。

f:id:kazuhironagai77:20210926223724p:plain

4.23 Kmと表示されています。

今度はどれくらいLandscapeから離れるとUnloadされるのかを設定します。

World CompositionのUncategorizedの隣にある+ボタンを押します。

f:id:kazuhironagai77:20210926223739p:plain

以下の様に打ち込みます。

f:id:kazuhironagai77:20210926223751p:plain

Createを押します。これでStreaming distanceが10000であるSD_10Kが出来ました。

f:id:kazuhironagai77:20210926223803p:plain

しかしSD_10Kを開くと作成したLandscapeはありません。

f:id:kazuhironagai77:20210926223816p:plain

SD_10Kに先程作成したLandscapeを移すためには、以下に示したように

f:id:kazuhironagai77:20210926223832p:plain

全てのLandscapeを選択した状態でAssign to Layerを選択してSD_10Kを選ぶ必要があります。

f:id:kazuhironagai77:20210926223846p:plain

テストします。

f:id:kazuhironagai77:20210926223900p:plain

Landscapeのつなぎ目に山があって本当にunloadされているのか分かりません。

Landscapeを以下の様に作り直しました。

f:id:kazuhironagai77:20210926223914p:plain

これならUnloadされたらすぐ分かります。

f:id:kazuhironagai77:20210926223928p:plain

されました。

f:id:kazuhironagai77:20210926223942p:plain

5.3 World Compositionを勉強して

World Compositionの基本を少しだけ勉強しました。既にSub Levelを作成しているMap1に直接応用する事は難しそうです。これから作成するMapには使用する事にします。

Sub Level一つに入っているMapの大きさはどれくらいが良いんでしょうか?

これが知りたいですね。

遠くに有っても高い山は見える訳で、単に距離だけでMapをUnloadするのは強引過ぎるとも思いました。

遠くにある山の情報が入らなくなる代わりにSeamlessに動けるようになるのは、現実の世界とはちょっと違う感じがしてストレスを感じます。

ただUE5ではもうこの問題を考える必要が無い訳であんまりこだわるのもアレかとなると適当な所で納得しておくべきかもしれません。

Tutorialに使用したMapの大きさは120平方mでした。Unloadされる基準は100m離れる事でした。

この基準をMap1に当てはめると、Map1はかなり大きいMapになります。

f:id:kazuhironagai77:20210926224007p:plain

そしてLandscapeの条件は以下のようになっています。

f:id:kazuhironagai77:20210926224022p:plain

TutorialのLandscapeの条件は以下のようになっています。

f:id:kazuhironagai77:20210926224037p:plain

2021-03-22のブログにLandscapeのparameterについての簡単なまとめがありました。

f:id:kazuhironagai77:20210926224052p:plain

Tutorialの方のNumber of Componentsは全てのSub LevelにあるComponentの数を合わせていますね。

15*8=120

であってますね。

120m^2で一つのSub Levelを作成すると考えるべきかもしれませんね。

6.Loading Screen 色々

6.1 宿屋のLoading Screenの確認

f:id:kazuhironagai77:20210926224117p:plain

コードを見直したら、宿屋に泊まった時はLevelを新しく読み直してはいませんでした。

RPG Game Instance BPにあるDispatcherであるSet Time Spend 0をInn_Welcome Widgetから呼び出す事で時間をResetしています。

f:id:kazuhironagai77:20210926224131p:plain

このDispatcherはLevel内でBindしており、新しいLevelを作成した時にそのLevelに以下の実装をしないと宿屋は正常に機能しないです。

f:id:kazuhironagai77:20210926224145p:plain

すっかり忘れていました。

後、睡眠中に使用されている星空ですが、Perlin Noiseで星雲を画いておきます。

f:id:kazuhironagai77:20210926224200p:plain

こんな感じです。

f:id:kazuhironagai77:20210926224214p:plain

かなりマシになりました。

Perlin Noiseを追加するだけでこんなに絵のレベルが上がるなんて衝撃的です。

Perlin先生もこんな風に自分の作ったNoise が利用される事になるとは想像もしていなかったと思います。

6.2 Loading Screenの種類を増やす

先週、Loading Screenを作成していて、銀河鉄道に乗る場合とそれ以外のLoading Screenだけでは足りないと思いました。どんなLoading Screenが必要かを調査してまとめておきます。

<死亡してからやり直す場合>

これは戦闘で死んだ後と、落下して死んだ後の場合があります。

<戦闘画面への移行と戦闘画面からの帰還>

これは、なるだけ速く行いたいわけですから文字の表示なども少なくし、Loading Screenで得られる情報も戦闘に関係したものにしたいです。

<不思議な地図でワープした場合>

特別な銀河鉄道に乗るようにします。

<落下して死んだ時>

先程の死んだ後にやり直すのではなく落下して死んだ時は、Map、Fallingに移動します。のでその時にLoading Screenが呼ばれます。

端的に滑落している事を知らせるLoading Screenが必要です。

以上でした。

7.Loading Screenの勉強の続き

7.1 Async Loading ScreenがどうやってOpen Levelノードが呼ばれるたびに呼ばれるようになっているのかを調べます。

どうやって調べたらいいのか全く分かりません。

先週から、暇なときにAsync Loading Screenのコードをパラパラみたり、Unreal Engine 4 Scripting with C++ CookbookのSlateの箇所を読み直したりしたんですが全く分かりません。

そう言えば、Axel Riffard氏による Async Loading Screens and Transition Levels | Unreal Fest Europe 2019 | Unreal Engine [10]ではどうやってLoading Screenを呼び出していたんでしょう。

2021-08-16のBlogに書かれていました。

f:id:kazuhironagai77:20210926224329p:plain

これなら分かります。

Open Levelノードの前にPlay Loading Screen関数を呼んでいるですから。

これから想像するに、Slate Moduleの機能でOpen Levelが呼ばれると自動的に呼ばれるようになっている訳ではなさそうです。同じようなSlate機能を使用しているAction RPGではOpen Levelの前に関数を呼び出してSlateを起動しているからです。

考えられるのは、

  • ModulePluginの違い
  • Engine Pluginだから
  • .iniにそう言う事を指定出来る機能がある

などです。

PluginやModuleの作成方法を今、勉強する気はあんまりないです。メリットを感じません。

Engine Plugin と通常のPluginの違いは何でしょう。

公式のDocumentであるPlugins [11] には、以下の説明がありました。

f:id:kazuhironagai77:20210926224356p:plain

Engine PluginとGame Pluginがどう違うのかは不明ですがPlugin fileの位置が違う事だけは分かりました。

これにしたがってEngine Pluginが収納されているFolderを探すと、Async Loading Screenが保持されているFolderを見つけました。

f:id:kazuhironagai77:20210926224424p:plain

f:id:kazuhironagai77:20210926224434p:plain

先週Downloadしたfileと全く同じ様ですね。

比較のための先週Git hubからDownloadしたFileも見てみます。

f:id:kazuhironagai77:20210926224448p:plain

BinaryやIntermediate folderがないのは一回もBuildしていないからです。Configはどうでしょう。開いてみます。

うーん。あんまり関係なさそうです。

まあ同じと言って良いでしょう。

.iniの違いはどうなんでしょうか?

これは今の所は分かりませんね。

7.2 Async Loading Screen色々

分からない事だらけなので、分かる所を見てみます。

AsyncLoadingScreen.upluginを開くと

f:id:kazuhironagai77:20210926224512p:plain

が使用されています。これは2021-08-16のblogで勉強したのと全く同じでした。

f:id:kazuhironagai77:20210926224527p:plain

次にAsyncLoadingScreenModule.hファイルをみます。

f:id:kazuhironagai77:20210926224541p:plain

IModuleInterfaceを継承していると言う事はこのクラスはModuleになる訳です。PluginもModuleなんですね。

と言う事はAction RPGにおけるAction RPG Loading Screen Moduleと同じ事をしていると考えられます。

二つを見比べましたが、Action RPGのActionRPGLoadingScreen.hの方が仕組みがかなり単純です。こっちを先に理解すべきですね。

30分位、Cppファイルを基本に眺めてまくって、大体の流れは理解したのですが、分からない所も結構あります。

分かった所、分からない所をまとめておきます。

まずActionRPGLoadingScreen.cppの以下のクラスについてです。

f:id:kazuhironagai77:20210926224556p:plain

FActionRPGLoadingScreenModuleの実装部を見ると

f:id:kazuhironagai77:20210926224610p:plain

と言う箇所があります。SRPGLoadingScreenはそのクラスの直ぐ上で定義されています。

f:id:kazuhironagai77:20210926224626p:plain

そしてこのクラスの中で

f:id:kazuhironagai77:20210926224640p:plain

が呼ばれています。

そしてこの中の関数であるStartInGameLoadingScreen() が

f:id:kazuhironagai77:20210926224655p:plain

BPから呼ばれているヤツでしょう。

f:id:kazuhironagai77:20210926224708p:plain

最後のこれはModuleを実装するためのMacroだそうです。

f:id:kazuhironagai77:20210926224726p:plain

それで分からない事は、この分かった事以外全部で、一々書いてられないのでここには書きません。

しかしModuleを作るTutorialとSlateを作るTutorialを2,3個やれば結構分かるようになるとは思っています。

今週はここまですね。流石に今からModule とSlateの勉強をやる気力はありません。

来週は、ModuleとSlateのTutorialをやってみます。

8.Good Skyの復習

流石にもう延期は出来ません。少しずつですが復習してLandscapeにも昼夜を追加します。

調べた所、2020-11-08のブログでどのようにGood Skyを使用して昼夜を作成したのかが解説されています。

これをまず復習します。

8.1 昼夜の作成

Map1のLevel BP内に以下の方法で実装していました。

f:id:kazuhironagai77:20210926224752p:plain

今回は復習だけなのでCodeの変更はしませんが見にくいです。

f:id:kazuhironagai77:20210926224806p:plain

Delta Secondの値が変化した場合でも昼夜の時間が変化してない事を計算して証明しています。

この辺を理論的にも証明しておきたいですね。

8.2 世界が赤くなる現象

2021-04-26のBlogにGood Skyで赤くなる現象に対する対策が述べられていました。

f:id:kazuhironagai77:20210926224828p:plain

Sky lightのMobilityをStaticからStationaryに変更すると世界全体が赤くなってしまいます。

f:id:kazuhironagai77:20210926224854p:plain

CubemapにDaylight Ambient Cubemapをセットすると直ります。

Light Massの数によって赤さの影響がどれ位変わるのかも調べておきたいですね。

以上です。

9.まとめと感想

Niagaraの勉強はStatic Mesh Sampling in UE5 Niagara Tutorial [1] を実装とHanging Particulates Templateの再現を行いました。

  • その中でLerp Particle Attribute Module Orient Mesh To Vector ModuleInitial Mesh Orientation Moduleの機能について勉強しました。

今週からCascadeの勉強の代わりにMaterialの勉強を始めました。

  • Your First Shader - Shader Graph Basics [5]にある動画の内、最初の幾つかを自分で試した事と他のMaterialの教材の内容を確認しました。
  • 公式のDocumentOnline Learningで、一定以上の基準を満たしていると思われる教材の選別は出来ませんでした。

RPGの作成では

  • 最初の村の全部のNPCのセリフを推敲しました。
  • Map1Streaming Levelを導入するための検討をしました。
  • Async Loading ScreenがどうやってOpen Levelノードが呼ばれるたびに呼ばれるようになっているのかを調査し、その過程でModuleStateの作成方法についての復習が必要であるとの結論が出ました。
  • Good Skyの復習をやっと始められた。

UE4のModuleの作成方法を検索していると、NiagaraのModuleの作成方法が同時に検索結果に表示されて厄介です。

この二つは全く違うモノなので区別する必要があります。前者をUE4C++のModule、後者をNiagaraのModuleと呼ぶ事にします。

ModuleやSlateの勉強は面白いですが、RPGの完成とは直接の関係はありません。どの程度の勉強をするのかを見極める必要があります。

ModuleやSlate の勉強をするより、Async Loading ScreenでLoading Screen中に動画を流す方法を勉強する方がGameの質の向上には格段に貢献します。

10.参照(Reference

[1] CGHOW. (2021, August 26). Static Mesh Sampling in UE5 Niagara Tutorial | Download Files [Video]. YouTube. https://www.youtube.com/watch?v=9MJ8YtEs5as

[2] Cloward, B. (n.d.). Shader Graph Basics. YouTube. Retrieved September 26, 2021, from https://www.youtube.com/playlist?list=PL78XDi0TS4lEBWa2Hpzg2SRC5njCcKydl

[3] 池田亘. (2020). HoudiniとUnreal Engine 4で学ぶリアルタイムVFX: レベルアップのための心得と実践 (Japanese Edition) (Vol. 1). ボーンデジタル. http://www.amazon.co.jp/dp/B0872SFBX2

[4] Sherif, W., & Whittle, S. (2016). Unreal Engine 4 Scripting with C++ Cookbook (1st ed., Vol. 1). Packt Publishing. http://www.amazon.co.jp/dp/B01FR2LCF2

[5] Cloward, B. [Ben Cloward]. (2021a, June 24). Your First Shader - Shader Graph Basics - Episode 3 [Video]. YouTube. https://www.youtube.com/watch?v=IAR2izQxsxM&list=PL78XDi0TS4lEBWa2Hpzg2SRC5njCcKydl&index=3

[6] Cloward, B. [Ben Cloward]. (2021b, July 1). Basic Shader Math - Shader Graph Basics - Episode 4 [Video]. YouTube. https://www.youtube.com/watch?v=bihZJzeuwOU&list=PL78XDi0TS4lEBWa2Hpzg2SRC5njCcKydl&index=4

[7] Cloward, B. [Ben Cloward]. (2021c, July 8). Understanding Texture Maps - Shader Graph Basics - Episode 5 [Video]. YouTube. https://www.youtube.com/watch?v=WJkEacYRhPU&list=PL78XDi0TS4lEBWa2Hpzg2SRC5njCcKydl&index=5

[8] Epic Games. (n.d.-a). Designing Visuals, Rendering, and Graphics. Unreal Engine Documentation. Retrieved September 26, 2021, from https://docs.unrealengine.com/4.27/en-US/RenderingAndGraphics/

[9] Aspland, M. [Matt Aspland]. (2021, February 2). World Composition And Basic Level Streaming - Unreal Engine 4 Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=xeJz26M2xn4

[10] Epic Games [Unreal Engine]. (2019, May 20). Async Loading Screens and Transition Levels | Unreal Fest Europe 2019 | Unreal Engine [Video]. YouTube. https://www.youtube.com/watch?v=ON1_dEHoNDg

[11] Epic Games. (n.d.-b). Plugins. Unreal Engine Documentation. Retrieved September 26, 2021, from https://docs.unrealengine.com/4.27/en-US/ProductionPipelines/Plugins/