<前文>
前文には日本人が誤解しているアメリカ、特に日本文化とキリスト教文化の違いから生じる誤解とその解決法について気が付く範囲ですが書いて行く予定でした。
しかし今週だけはお休みしてEpic とAppleの訴訟の判決に対して調査した結果をまとめておきたいと思います。
この訴訟は、日本のSmart Phoneアプリの開発の方向性を決定する大きな事件であるはずなのに、日本ではあまり大きなニュースになっていません。
その結果、この裁判の結果がどうなっているのか日本語のニュースを追っているだけでは良く分からないです。
それで私が勝手に調べて見ました。
ただし最初に断っておきますが、私は毎週UE4の勉強をしていて、もう4年近く経ちます。その間Epic Games社にはこんな凄いGame Engineを無料で提供してくれて感謝しかありません。のでかなり私はEpic Game社を応援する側になります。なるだけ公平かつ客観的な意見を述べようと心がけますが、少しはバイアスが入ってしまうかもしれません。
まずCNBCのニュース [1]です。
とまとめられています。
まず2番目の文章ですが、これをそのまま解釈すると今までIOSのアプリで課金する場合はAppleの提供した課金システムを絶対に使用する必要がありましたが、これからはそれ以外の方法で課金しても良いと解釈できます。
これはCNBCに限らず他のニュースサイトでもほぼ同じ解説をしていました。
ところがですね。
Richard Hoeg氏がEpic v Apple: Judgment Day - Who Won? Who Lost? ...and Why? (VL538) [2]のThe Court on Commissions(4分31秒位)で述べていますが、IOSのAppはAppleの提供した課金システムを使用する必要はありませんが、AppleはappをStore に載せる時の契約でAppleの提供した課金システムを使用してない課金に対しても今まで通りの30%(15%)の使用料を請求する権利があるそうです。
Richard Hoeg氏の解釈が絶対、正しいとは限りません。
事実、彼はUnityで検索するとUnreal Engineが一番最初に検索結果が現れると言ってTim Sweeney氏のビジネス手法が偽善的であると批判しています(Epic's CEO Just Called Me Out: A Response (VL289) [10]) 。しかし彼がその時に検索に使用した単語はUnity ではなくUnity Engine でした。
そりゃUnity Engineで検索したらGoogleのAIだってUnreal Engineの打ち間違いと思うでしょう。
このような事から推測すると、Richard Hoeg氏の主張は事実に基づかないで(もしくは極めて限定的な状態のみで通用する事実に基づいて)言っている可能性はかなりあります。
しかしRichard Hoeg氏はIT関連の会社法?専門の弁護士だそうですので、彼の解釈はTake Noteはしておくべきです。
つまり、今の時点では30%もしくは15%の使用料については変化なし。と考えておいた方が無難です。
(ここでBlu-Ray Discなどのおまけでゲーム内通貨が貰える場合についても調べたんですが、それについては分かりませんでした。)
更に、3番目の文章で語られているAppleが独占禁止法に違反していないと言う判決に対しても、Yong Yea氏がBoth Epic & Apple Lose Big After Court Rules On Their Legal Battle [3]の11分12秒位から解説していますが、判決文を読むと、携帯ゲーム機に限って言えば「Appleは独占禁止法に違反していない」と言う意味なんだそうです。つまりこれからの裁判でやっぱりAppleは独占禁止法に違反しているよね。と言う判決が出る可能性は十分にあるわけです。
はい。
ここまでの調査で理解した事をまとめますと、まだ何も結論は出ていない。となりました。
うん。調べたけどあんまり意味なかったですね。
それでは今週の勉強を始めます。
<本文>
1.今週の予定
今週は以下の事をやります。
- Particle Systemの勉強
- Niagara : Building advanced effects in Niagara | Unreal Engine [4]の総括
- Cascade: 先々週の続き
- RPGの作成
- Map1の作成の続き
- Loading Screenの勉強の続き
- Good Skyの復習
2.Niagara : Building advanced effects in Niagara | Unreal Engine [4]の総括
先週やっとNiagara : Building advanced effects in Niagara | Unreal Engine [4]のTutorialが終わりました。
今週はNiagara : Building advanced effects in Niagara | Unreal Engine [4]についての総括、特に以下の点についての検討
- 目的は?
- 出来なかった事は?
- 学んだ事は?
- 目的は達成出来たのか?
- Tutorial通りに作れたのか?
- このTutorialの改善点について
を行います。
その後でNiagara : Building advanced effects in Niagara | Unreal Engine [4]とCGHOW氏のTutorialを比較してこれからNiagaraの勉強をするのにCGHOW氏のTutorialを使用すべきかどうかを検討します。
2.1 Niagara : Building advanced effects in Niagara | Unreal Engine [4]の総括
<目的は?>
先週も書きましたが、Tutorialのサンプルそっくりに再現する事が目的です。
以下に先週の結果を示しますが、かなりそっくりに再現出来たと思います。
<出来なかった事は?>
唯一出来なかった部分がMaterialです。
これはどう直せば良いのか全く分からなかったです。
<学んだ事は?>
先週、まとめた学んだ事に追加して以下の事を学びました。
- Force Moduleが速度を追加しているだけだと言う事。
- Edit Valueについて
- Light RendererのUse Inverse Squared Falloffについて
- Initialize Mesh Reproduction Sprite ModuleとUpdate Mesh Reproduction Sprite Moduleについて
- SpriteがMeshのNormal Vectorに垂直に面するようにする設定方法(Sprite Renderer ModuleのAlignmentとFacing Modeの値を以下に示した値に変更)
- Spriteを丸くする
- Objectに触った部分のキャラのMaterialが消える方法
- Distance To Nearest Surfaceノードの機能
- 生成したParticleをバラバラに飛ばす方法
- 以下の名称がNam Spaceだった件
- Scratch Pat Moduleの作成方法(2回目)
以上です。
これらの中で、先週学んだけど実際はよくわかっていない箇所が沢山あります。それらは次で復習します。
2.2 先週、勉強した事で分からなかった部分の勉強
<Link InputのTransient>
TransientがどのName Spaceを指しているのか分かりません。
調べます。
公式のDocumentであるNiagara Script Editor Reference [5] には
と書かれていました。と言う事はそのModule内にしか存在しないLocal Variableなんでしょうか?
CursorをTransientに重ねたら以下の説明が出て来ました。
説明が微妙に違いますね。こっちの説明だとTransient Valueの値は、同じSectionに属するModuleからModuleの場合は変化しませんが、別なSection のModuleに移ったら変わると説明してあります。
この説明だとLocal Variableとの違いが分かります。
<Dither Temporal AA ノードについて>
そのものズバリのTutorialがありました。Dither Temporal AA Node | 5-Minute Materials [UE4] [6] です。
滅茶苦茶分かり易いです。こんなTutorialを作成する人が今まで一回も検索に引っかからなかったのは不思議です。
Dither Temporal AA ノードは、偽の透明をMasked Materialに作成する機能だそうです。Translucent はコストが高いMaterialですが、Dither Temporal AA ノードを使用する事でこのコストを下げる事が出来るそうです。
PrismaticaDev氏の説明が非常に分かり易いので同じ事をここでやってみたいと思います。
以下の様なMaterialを作成します。
Blend ModeはTranslucentです。
PlaneにこのMaterialを貼り付けると
こんな感じの半透明になります。
Shader Complexityを見ると
うーん。
あんまり差が見えませんね。
PrismaticaDev氏の解説に出て来るサンプルは
結構真っ赤です。
まあ、Translucentを使用すれば最低でも2回Renderingをしなければならない訳でコストがOpaqueに比べて高くなるのは理論的には確かです。
仕方ないです。3枚重ねてみました。
今度は赤くなりました。これで行きます。
Litに戻すとこんな感じになってました。
今度はDither Temporal AAノードを使用したMaterialを作成します。
Blend ModeをMaskedに変更して
以下に示した様にDither Temporal AAを追加します。
こんな感じに変わりました。
うーん。
まずTranslucentとそっくりとは言えませんね。
でもある程度は後ろのImageも見えますので全く駄目と言うわけでもないですね。
PrismaticaDev氏の解説によればDither Temporal AAはMaterialを虫食い状態にするそうです。
そしてコストですが、
一枚ではこんな感じです。
3枚ではこんな感じになりました。
これは!
コストの面からはDither Temporal AAの方が圧倒的に有利ですね。
ただし、3枚重ねた実際のImageは以下の様です。
100%、Translucentの代わりになる訳ではないさそうです。適所適材で行く必要がありますね。
PrismaticaDev氏のTutorialでは更にDither Temporal AAノードを使用した時に発生するへんな影の直し方についても別なTutorialで解説しています。
うーん。まあこれは別な機会に勉強する事にします。
先週、使用したDither Temporal AAもOpacity Maskに繋がっていました。
<Distance To Nearest Surfaceノードについて>
Distance To Nearest Surfaceノードについて調べます。
これって名前から想像するとそのMeshから最も近い距離にあるAssetまでの距離を測るノードですよね。
公式のDocumentであるUtility Expressions [7] によるとDistance To Nearest SurfaceノードのRemarkには
と書かれています。
Global Distance Fieldって何の事でしょう?
多分ですが、この公式のDocumentで述べられているMesh Distance Fields [8] の事と同じだと思います。
つまり、Global Distance Fieldに、そのMeshから最も近い距離にあるAssetまでの距離が記録されている。と考えられます。
あ。分かった。
The signed distance …to the nearest occludes in the sceneがシーン内の最も近い距離にある遮蔽物からの距離、つまりMeshから最も近い距離にあるAssetまでの距離を指しているんです。その値がDistance fieldに入っているんです。
<Distance To Nearest Surfaceノードの続きの実装部は何をしているのか?>
次なんですがその後に
こんな説明をして以下の実装をしているんです。
これの意味が分からない。
うん。分からないなら実験してみます。
先程のMaterialを以下の様に改良しました。
<<Subtract = 0、Divide = 30>>
ぴったしガラス玉の内側に入っている部分だけ消えています。
<<Subtract = 10、Divide = 30>>
なんと、1マス手前の位置からPlaneが消えています。1マスは10cmですのでSubtract=10は10cm手前で消滅すると言う事でしょうか?
<<Subtract = 30、Divide = 30>>
そんなに上手くは行かなかったです。
Subtract = 30で5マス手前からPlaneが消滅しています。
しかしSubtractが何を表しているのかは分かりました。この数字が大きい程離れた所からPlaneが消えます。
<<Subtract = 10、Divide = 1>>
今度はSubtractを固定してDivideを変化させます。
はい。Planeの曖昧な部分が全くなくなりました。
<<Subtract = 10、Divide = 10>>
少しだけ曖昧な部分が出来ました。何となくですが曖昧な部分の大きさが10cmのような気がします。
<<Subtract = 10、Divide = 30>>
Divideを30にしたら曖昧な部分がもっと増えました。
はい。DivideはPlaneの曖昧な部分の太さを担当しているようです。
先週の全く意味の分からなかった一文の意味が分かりました。
このFadeはPlaneの消える部分を表しています。つまりSubtractする数字の事です。その次の黒いBandはPlaneの曖昧な部分を指しています。つまりDivideの部分です。
はい。これで完璧に理解しました。
<Get Level of Dissolveについて>
今度は先週、Scratch Pat Moduleより作成したGet Level of Dissolve Moduleについてです。
ここで分からない事は一つだけです。
何でInput New Collision QueryとSample PositionをQuery Mesh Distance Field GPU ノードにパスするとDistance To Nearest Surfaceの値が返って来るのかだけです。
これについてはGoogleで検索しても何も出て来ません。
唯一出て来たのがGithubにあるAdvanced Niagara Effects | Inside Unreal [9] で、そこには
と書かれていました。
ここから推測すると、New Collision QueryがDistance Fieldを保持していてSample PositionがParticleの位置を保持しているんでしょうか?
それよりも
これを読むとDistance Fieldって空間中にvoxelとして充満しているんでしょうか?
そう言えばMesh Distance Fields [8]に合った図(以下に示している)でも何もない空間中から木への距離を表しています。
この図をよーく見ると四角の図が全体を覆ってますね。
とするとUnreal Engineでは全ての空間がVoxelで充満していてそれぞれのVoxelがDistance Field値を保持してると考えられます。
すると先程述べた
は、「Meshから」ではなく「何もない空間に配置されているVoxel」からがより正確に近い言い方になります。
<Lerp Particle Attribute Module>
このModuleは2つの値のLinear Interpolationをするのは間違いないです。
でもこの二つの値って同じじゃ…
あ
その後でVortex Velocityを追加していました。
うーん。でもやっぱり良く分からない。
Lerpした値はどの変数が保持するんでしょうか?
2.3 Niagara : Building advanced effects in Niagara | Unreal Engine [4]の総括の続き
<目的は達成出来たのか?>
目的は取りあえずTutorial通りに作成出来る事だったのですが、Material以外は出来ましたね。
100%理解出来たかどうかはまた別な問題ですが。
<Tutorial通りに作れたのか?>
上記で述べた通りです。
<このTutorialの改善点について>
CrunchのMaterialが新しくなっているのでその場合の直し方を示してほしいです。それ以外は無いです。
2.4 Niagara : Building advanced effects in Niagara | Unreal Engine [4]とCGHOW氏のTutorialを比較して
はい。
それでは今回のメインである。これからのNiagaraの勉強をどうするかについて、今までの勉強を踏まえて考えていこうと思います。
それで色々まとめて検討するより、徒然なるままに好きな事を述べた方が本質に迫れる気がしています。のでダラダラと思った事を書いていきます。
3週間かけてUnreal Engine公式のTutorialであるNiagara: Building advanced effects in Niagara | Unreal Engine [4]を勉強しました。
- 一応、Tutorial通りの再現は出来る。
- MaterialなどVersionが変わると何をやっているのか不明。
- 理解出来ない箇所はあった。
一方でCGHOW氏のTutorialは
- Tutorial通りの再現は出来ない。
- 全部の解説はしていない事が多い。
- 理解出来ない所は、いくらがんばっても理解出来ない。
- 自分でStatic Meshを作成する必要がある箇所がある。
となっています。
これだけ見ても、CGHOW氏のTutorialを主にNiagaraの勉強を進めるのは危険過ぎます。
後、VFXに詳しくなるメリットがどれだけあるのかも不明です。Userから見れば買ったVFXを追加すれば同じに見えるだけかもしれません。
ただしNiagaraにはかなり可能性を感じています。ModuleやDynamic InputをVisual Scriptingで自在に組めるのはとても可能性を感じます。
後、CascadeだとEffectの前後関係がオカシイ時があります。私はEffectはもっとゆっくり動くべきと思っていますが、Cascadeをゆっくり動かしたらEffectの前後がオカシイ部分もUserにばれてしまいます。今までやった分だけですがNiagaraではEffectの前後関係でオカシイ部分は見つかっていません。この部分にもNiagaraの可能性を感じます。
炎、煙、雷、水、氷、魔法陣、雪、砂、風、光、闇、爆発、回復、状態異常や呪いのEffectの作成方法位は基本として知っておきたいです。
この中で一応、今の所、一部でも作り方が分かっているのは、炎、煙、雷、水、氷、魔法陣、雪、光、闇、爆発、回復、状態異常や呪いでしょうか?結構分かって来ましたね。砂はあれだけ勉強したのに直接の作成方法はまだ不明です。
この辺のEffectの作成方法を自分で追及するのも面白いかもしれません。
CGHOW氏のTutorialはこれらのVFXの作り方を直接学ぶ事は出来ないかもしれませんがその過程で今まで知らないModuleやDynamic Inputの使用方法の勉強やどんなEffectを追加すべき、などは学べます。その辺の勉強はかなり役に立つと思います。
後、考えているのはVFXの勉強は一端終わりにしてMaterialかBlenderの使用方法を勉強する事です。
MaterialのTutorialにはBen Cloward氏が作成したTutorial [11]があってとても良い出来のような気がしています。
後、たまたま見つけたんですがKurt Kupser氏のAdvanced UE4 Shaders [12]もちょっと興味があります。
2.5 これからの勉強法について
やっぱりNiagaraの勉強をここで止めるのは勿体ないですので、こうする事にします。
- CGHOW氏のTutorialを勉強する時は同じEffectが完成しなくても良い。そのTutorialを勉強する事で新しいModuleやDynamic Inputなどの使用方法が学べたらOKと考えておく。
- 自分でEffectを作成してみる。
- Content ExamplesのSampleを自分で勉強してみる。
- Materialの勉強も開始する。よってCascadeの勉強は一端中止する。
CascadeのEffectは前後関係がオカシク表示されるので、頑張って勉強する価値はこの中では最も低いと思われます。唯一の問題は今作成しているRPGのUEのVersionは4.24なのでNiagaraが使用出来ない事ですが、今まで勉強した知識で対応する事にします。
うん。
これで行きます。Niagaraの勉強は
- CGHOW氏のTutorialを勉強する
- 自分でEffectを作成
- Content ExamplesのSampleを自分で勉強
のどれかをする事にします。そしてCascadeの勉強は一端中止して、Materialの勉強を開始します。特にBen Cloward氏が作成したTutorial [11]をやっていくことにします。
2.6 Static Mesh Sampling in UE5 Niagara Tutorial [13] を勉強する
なんとCGHOW氏のTutorialでContent ExamplesのSampleの解説をしている動画がありました。
今週はこれを勉強しましょう。
UE5で作成すると言うので一応UE5をInstallしました。このパソコンでどこまで動くのか分かりませんが、出来る所までやっていき、出来なかったらUE4.26 か27でやり直します。
新しいLevelを作成した後でSphere Reflection Captureを消しています。何か理由があるんでしょうか?
<Cone、球、ドーナツ型のMeshの作成>
Cone、球、ドーナツ型のMeshを作成してUE5にImportしていますが、自分で作る事が出来ないのでStarter kitにあるやつをそのままCopyしてきました。
<Niagara Systemの作成>
Niagara SystemにTemplateのFountainを追加して新しいNSを作成しました。
この辺はUE4と全く同じですね。
要らないModuleを全部消去しました。
一応、要らないModuleの意味も理解出来ますね。
Emitter Update SectionのEmitter State ModuleやParticle Spawn SectionのInitialize Particle ModuleそしてParticle Update SectionのParticle State ModuleはどのEmitter Stackでも必ず必要なはずです。
<Cornの生成>
Emitter sectionにSpawn Burst Instantaneous Moduleを追加しました。Spawn Countは50にセットしました。
この辺はまだ理解出来ますね。50個のParticleを一辺に生成すると言う意味なはずです。
Particle Spawn SectionのInitialize Particle Moduleの設定を以下のように変更しました。
それぞれのParticle の寿命は2秒になりました。
当然、Mesh RendererをRender Sectionに追加します。
更にMeshにドーナツをセットします。
アレConeでした。Coneをセットします。
TutorialではConeのサイズが小さいので、Particle Spawn SectionのInitialize Particle ModuleのMesh Uniform Scaleの値を変更しています。
私のCone Meshは大きいのでScaleはそのままにしておきます。後で小さくする必要が出てくるかもしれませんが。
<Cone用Materialの作成>
この後、このCone用のMaterialを作成しています。
Tutorialと全く同じように作成しました。
<Cornに色を追加>
その作成したMaterialをRender SectionのMesh Renderer Moduleの以下の箇所にセットします。
Particle Spawn SectionのInitialize Particle ModuleでConeの色を赤くしました。
MaterialのParticle ColorはOpacityに繋がってないですが、Aの値を変化させたらConeの色が薄くなるんでしょうか?
<Scratch Pat Moduleの作成>
このConeらをドーナツの表面で生成させて、その後、球の表面に移動させたい訳です。
そのためにはStatic Mesh Location Moduleを…使用しないで、Scratch Pat Moduleを使用して全部のやり方を解説してくれるそうです。
おお。
ひょっとするとですが、最近のCGHOW氏のTutorialはParticleを始めて学習する人達向けにかなり親切に作成されているのかもしれません。
Map Get ノードにInput New Static Meshを追加しました。
成程、これで望みのMeshをModuleにパスする訳ですね。
はい。しています。
今度はそのMeshのWorld SpaceにおけるTri Positionの値をGet Tri Position WS Moduleを使用して呼び出しています。
Tri PositionってMeshのどの位置を指しているんでしょうか?
一個一個のMeshを指しているのかなとも思ったんですが、Meshって四角の時もありますよね。
後、World SpaceとLocal Spaceの時のEffectの挙動の違いで良く分からない時があります。World SpaceとLocal Spaceの復習も後でやります。
Get Tri Position WS ModuleのCoordにRandom Tri Coord Moduleの返し値を繋ぎます。
Random Tri Coord Moduleの機能をその名前から想像するとStatic Meshの中にある沢山のMeshから一つを適当に選ぶものと想像出来ます。とするとGet Tri Position WS Moduleの機能もStatic Meshの中の一個のMeshの位置を返していると考えられます。
Map SetにNew Vectorを追加して名前を以下の様に変更しました。
更にName SpaceをParticleに変更しました。
Applyを押してこのModuleが使用出来るようにします。
<作成したScratch Moduleを使用して球の表面にCornを発生させる>
Scratch Moduleの変数にMy SphereとMy Torusが追加されています。そこに先程のStatic Meshを追加します。
正しこれだけでは何も起こりません。
何故ならScratch Moduleの返し値をParticleの生成する位置に指定していないからです。
そのためにParameterのParticle AttributeにあるParticle PositionをDragして
Particle Update Sectionにセットします。
へえー!こんな事が出来るんですね。
これが出来ると何が出来る様になるんでしょう?楽しみです。次に進みましょう。
なんと、Particle のPositionの値を先程作成したParticleのMy Sphere Locationに指定しました。
あ、分かりました。
単に
Position = My Sphere Location;
を実装したのと同じ事をここでしたんです。
Cornの位置が球の表面に沿ってバラバラになりました。
成程。
これは分かり易いです。
ただTutorialのCornと比較すると私のCornはかなり大きいです。
Particle Spawn SectionのInitialize Particle Moduleの設定を以下のように変更します。
大分、TutorialのImageに近づきました。
当然、Cornはドーナツ状に配置されるようになりました。
分かり易い。
非常に分かり易いです。
<Lerp Particle Attribute Moduleを使用してドーナツの表面に発生させたCornを球の表面に移動させる>
そしたらParticle のPositionを消してしまいました。
そしてParticle Update Section にLerp Particle Attribute Moduleを追加しました。
おお!
この今一、良く分からないModuleの使用方法について詳しく教われそうです。
まずPositionにチェックを入れました。
Position AにMy Sphere LocationをセットしてPosition BにMy Torus Locationをセットします。
これなら意味が分かります。
やっとLerp Particle Attribute Moduleの機能が理解出来ました。
後はどの程度のBlendをPosition AとPosition Bでするかと言う事でしょう。
それはこのLerp Alphaで設定するそうです。
0だと100% Position Aの値になり1だと100% Position Bの値になるそうです。
試しにLerp Alphaの値を0から1に変えてみました。
球の表面に発生したコーンがドーナツの表面に発生したコーンに変化しています。
Lerp Alphaの値をFloat from Curveに変更してCurveの値は以下の様に変更しました。
上手く映像で撮れなかったんですが、ドーナツから球に変化しています。
なんで逆と思ったら、このCurveが1から0に変化しているからでした。
これでLerp Particle Attribute Moduleの機能が理解出来ました。
今週は時間がないのでやりませんが、来週、この機能を分かり易く説明する簡易Effectを作って、自分で解説し直します。
<コーンの向きをMeshの表面に合わせる(球だけ)>
今度はコーンの向きをMeshの表面に合わせます。
そのためには、Get Tri Normal WS Moduleを使用します。
全体はこんな感じです。
そしてParticle Update SectionにOrient Mesh To Vector Moduleを追加します。
このModuleは初めて使用します。
My Sphere Normalをセットします。
向きが少しだけオカシイみたいです。
Particle Spawn SectionにInitial Mesh Orientation Moduleを追加します。
Initial Mesh Orientation ModuleのRotationに0.25を追加します。
その結果、
向きが直りました。
ただし最初のドーナツ型の時はコーンの方向は滅茶苦茶なままです。
<コーンの向きをMeshの表面に合わせる(ドーナツも)>
それを直すためにOrient Mesh To Vector ModuleのLook At DirectionのAとBに以下の値をセットします。
更にAlphaにセットされたFloat from CurveのGraphはLerp Particle Attribute のグラフをそのままPasteして使用しています。
その結果、ドーナツ形でもコーンがドーナツに沿っています。
はあ。成程。
Orient Mesh To Vector ModuleのLook At DirectionにLerp VectorをセットしたのでVector AとVector Bがセット出来るようになりました。更にAlpha値のFloat From Curveもセット出来きます。
<Content Exampleのサンプルのような位置の移動も追加する>
今度はContent Exampleのサンプルのように、球とドーナツが離れた位置に配置された状態でCornに形状の変化だけでなく位置の変化も追加します。
Scratch ModuleのMy Sphereの以下の赤線で囲った部分をクリックして
Read from New User Parameterを選択します。
My SphereにUser My Sphereが表示されました。
ドーナツも同様にします。
UE5のEditorに戻り、作成したNSをLevel上に配置します。
この時点ではNSのCornはその場で形状の変化をしているだけです。
NSのSourceに配置されている球とドーナツを追加します。
Tutorialではこの部分の作業がカメラに写っていません。この部分のやり方を判明させるのにちょっとだけ苦労しました。
こんな感じにNSが移動するようになりました。
結構な勉強になったので、今週はここまでとします。(Tutorialの10分33秒位)
このTutorialは比較的初心者向けに作成されているためか、分かり易かったです。私でも問題なく再現出来ました。
新しく習ったModuleなどの機能の調査やTutorialの残りは来週やります。
3.Cascade: 先々週の続き
はい。
先程、述べた通りCascadeの勉強は中止にします。そしてMaterialの勉強をやる事にします。
Ben Cloward氏が作成したTutorial [11]の中からどれかを選んで勉強します。
3.1 それぞれのTutorialについて
Ben Cloward氏が作成したMaterialのTutorialは沢山の種類があります。どれから勉強すべきなのか分かりません。軽くそれぞれのTutorialを見てそこで何を教えているのかを理解します。その後でどのTutorialを最初に勉強するかを決定します。
<Shader Graph Basics [14]>
このTutorialは本当の基礎の基礎を教えるそうです。
ぱっと見ましたが、確かに基本中の基本を教えていますね。でも復習や抜けの確認のためにこのTutorialからやるのが良いかもしれません。
<UE4 Material Editor - Shader Creation [15] >
こっちのTutorialも初心者向けみたいです。
Shader Graph Basics [14]とどこか違うのか調べたらこっちのTutorialの方が古いんです。そのため30個も動画があります。
ただ今までの経験から言うと、Tutorialは新しい方が何倍も優れています。
<Rain Materials in Unreal Engine 4 [16] >
これは文字通り、雨を表現するために必要なMaterialの作成方法を教えています。
まあ、応用編ですね。
<Procedural Noise - UE4 Materials 101 [17] >
これはPerlin Noise についての勉強のようです。
<UE4 Water Material Tutorial [18] >
これは水のMaterialの作成方法のTutorialのようです。
3.2 Shader Graph Basics [14]を勉強する
まあ、これだけ調べたら当然ですがShader Graph Basics [14]を勉強します。
ハッキリ言ってこのTutorial、かなり簡単に見えます。どんどんやっていきます。
<Announcing What's Next! - Shader Graph Basics [19] >
ここでは今まで勉強した内容の簡単なまとめと、このTutorialについての解説がされていました。
特に自分でImplementしなければならない事はなかったです。
一つだけ特に記録しておくべきと考えられる重要な内容は、Unreal Engine 5だけでなくUnityも同時にやるそうです。Material の実装はUnrealもUnityもそんなに変わらないそうです。
<The Graphics Pipeline - Shader Graph Basics [20] >
前半部分は、一般的なGraphicsのPipelineについての解説です。一応、大学では3d Graphicsが専門だったのでこの辺は知ってる事でした。
後半部分でUE5のMaterialの実装部分の一部をPixel Shader ではなくVertex Shaderで行う方法が解説されていました。これは自分で試してみます。
面白かったのがUnityとの比較です。
以下のUnityのMaterialを示しますが、これってGLSLそのままじゃないですか。
これはProgrammer friendlyです。GLSLで書いていたCodeをほぼそのままで書き写せそうです。
こりゃ、UE負けている。
と思ったら、以下に示したTextureを動かす実装ですが、Unityはこの部分をUEのようにVertex Shaderで行う方法がないそうです。
ほお。
これは一長一短で、UnityとUEがGame Engine業界で覇権を争っている理由が分かります。優劣つけがたいです。
それではこのTutorialでやっている実装を実際にUE5で試してみます。
作成しました。これはTextureをSine Curveに沿って移動させる実装です。
Statsを見ます。
Vertex Shaderが111 instructionsで、それ以外のShaderが152 instructionsです。
これにVertex Interpolator ノードを追加します。
Statsの結果が変わりました。
Vertex Shaderが115 instructionsで、それ以外のShaderが148 instructionsです。
ここでそれ以外のShaderはPixel shaderしかないのでPixel shaderの工程が4つも減ったらかなり作業工程が減っているはずです。
成程、分かりました。
後、大切な事はUser InterpolatorsでCustom が0から2にセットされている事です。
User Interpolatorsの数は限られており、その中の2つが使用されていると言っています。勿論Texture CoordのUとVとして使用されていると言う事です。
Position、Normal、そしてUVに関してはVertex Shaderで計算した方がコストが下がるのでVertex Interpolator ノードの使用を考えるべきだそうです。
ここからは私の意見ですが、Normal VectorをVertex Shader内で計算してFragment Shaderで単純にInterpolateするとVertex Shader内では正規化したにもかかわらず、Fragment Shaderで1より大きい数字になってしまったりします。ので無条件で納得は出来ませんが一つの手段としてPosition、Normal、そしてUVに対しての計算はVertex Interpolator ノードの使用を考えるべきは納得出来ます。
今度は、以下の部分をWorld Position Offsetに繋ぎます。
Statsを見ます。
Vertex Shaderが121 instructionsで、それ以外のShaderが148 instructionsのままです。
つまりWorld Position OffsetはVertex Shaderで計算されていると言う事です。
はい。
今週のMaterialの勉強はここまでとしておきます。
4.Map1の作成の続き
4.1 Landscapeの調整
地面が平ら過ぎるのでLandscapeでデコボコを追加します。
こんな感じになりました。
地面ですが多少デコボコする位に留めました。
何故か、この部分で色が変わっています。
直したいですが理由が分かりません。
4.2 Light Mass Important Volume と Post Process Volumeについて
以下の二つのAssetが
初期状態のまま残っていました。
一応Light massとPost Processの機能は知っていますが、あんまり詳しくはないです。
一回きちんと復習しておくべきでしょう。
これらの勉強をします。
<Light Mass Importance Volume>
WTF Is? Volume - Lightmass Importance in Unreal Engine 4 [21] に使い方といつ使うべきなのかについての解説がありました。
後、これは日本語の資料ですがライトマップの最適化 にLight Mapを可視化するためのToolの使用方法の詳しい解説がありました。ただこのサイト、作者名が書かれていないので参照からは外しました。
またUnreal Sensei氏がHow to Make Unreal Engine 4 Render Lighting Faster! - UE4 GPU Lightmass Tutorial [22] でGPUを使用したLight Massについての詳しい解説を作成していますが、今回はGPUは使用しないのでこれは見ませんでした。
それでStationary Lightが配置されていてかつそのLightのIndirectな明るさが欲しい所にLight Mass Importance Volumeを配置すれば良いと考えています。
このGameは中世の世界観を出したいので暗いほうが良い訳です。
出来るだけLight Mass Importance Volumeは外していきます。
Light Mass Importance Volumeを外しました。
朝です。
別に変な所はありません。と言うかどこが変わったのかも分かりません。
Directional LightもMovable にセットしてるのでSky LightしかLight Massに影響を与える光がないからかもしれません。
昼です。
これも今までとほとんど同じに見えます。
夕方です。
普通ですね。
夜です。
問題ないです。
Indirectな光の影響と言えば最初の村で家が同じ様に並んでいるのに片方だけ真っ黒な所があります。
これってLight Mass Importance Volumeを配置したら変わるんでしょうか?
試してみます。
変わってないですね。
Light Mass Importance VolumeはこのMapにはいらないですね。ただし全部外してしまうとUE4が勝手にLight Massを配置してしますので適当な所に一個だけ配置しておきます。
<Post Process Volume>
これは勉強すべき範囲が多すぎです。Loading Screenの勉強が終わったらやる事にします。
4.3 最初の村の作成
Playerの操作するキャラが銀河鉄道に乗ってMap1に到着したら、村長と話しをします。
すると魔物がうろついているので、武器を手に入れる必要がある。その為には奥の村に進む必要が在る事を知ります。
あ。
最初の村の住人のMeshがSK_Mannequinのままでした。
これを直しましょう。
<村の住人のMeshの変換>
まず、この前買った
の付属のキャラの色違いを全部作成しました。
これをそれぞれのNPCに追加して以降と思います。
これをそれぞれのNPCに追加して以降と思います。
<Old Man >
小さくしてみました。
UWidgetのキャラとは全く違いますね。
後で調節します。
<Magic Researcher>
これに近いImageのキャラを探します。
これが一番近いImageですかね。
頭の大きさが全然違います。エルフとドワーフみたいな種族の違いを導入しないと厳しそうです。
<Mountain Man>
うーん。この爺さんに似てるキャラはいませんね。
全然、見た目は違いますが取りあえずこのキャラを使用しておきます。
やっぱりこっちの方がMountain Manって感じがしますね。
こっちにしましょう。
<Head Man>
今度は村長です。
先程の王様と同じでいいでしょう。
サイズは違いますがこれで行きます。
<Business Man>
Business Manだそうです。
これですかね。
<Fortune Teller>
占い師です。
これですかね。
<Retired Warrior>
退役した戦士です。
赤い色がありません。これで我慢します。
<Talking NPC Political>
政治の事ばかりおしゃべりする男性のNPCです。
見た目から何か何まで違いますがこれで行きます。
<Village Princes>
村長の娘です。
これにします。
<Sheriff>
村の保安官です。
王様を大きくしました。
<Back Pack>
旅行者ですね。
Blender使えたら自分で3Dモデル作成するんですが…
自分で言うのもあれですがこの2Dのデザインかなり良いですよね。
しかしこのデザインなら3Dの製作もそんなに難しくないですよね。
もうどれでも同じでしょう。使ってないキャラを選択しました。
<Hunter>
Hunterと言っていますが実際は傭兵ですね。
体を大きくしました。
<Weather Cast>
天気予報する人です。
老人はこれしかないです。
これにします。
<Poet>
詩人です。
全然imageが違う。けど詩人っぽくはあります。
<Henchman>
ちっこくしてみました。
<Scientist>
科学者の卵です。
色だけ同じキャラにしました。
これでNPC全てにキャラ振りを終わりました。
5.最初の村の村人のセリフを直す
最初の村で村人に話かけたら変なセリフを言っている所があります。
セリフを直します。
完璧ではないですが何とか直しました。
細かい点ではおかしな所がありますが、来週以降、順次直していきます。
6.Loading Screenの勉強の続き
今週でLoading Screenの勉強は終りにします。今週やる事は3つです。
一つ目はUE4.24 にAsync Loading Screen plug-inを追加して、Ch4_3にLoading Screenを作成する事です。
2つ目はAsync Loading Screenを追加したEngineは必ず Open Level NodeでLoading Screenを呼び出しますが、この呼び出すLoading Screenの種類をOpen Levelの種類によって分けたいのです。具体的に言えば、銀河鉄道に乗って移動する場合は、5秒以上の鉄道に乗っているLoading Screenを表示し、宿屋で寝ている時は、睡眠中のLoading Screenを表示したいのです。
最後はAsync Loading ScreenがどうやってOpen Levelノードが呼ばれる度に呼ばれるようにしてるのかを調べます。これさえ分かれば後はコードが全部読める気がしています。
この方法について調べます。
6.1 別なLoading Screenを表示する方法
Async Loading Screen [23] に以下の解説がありました。
この機能を使用すれば別なLoading Screenの表示が出来そうです。
試してみます。
先週、Async Loading Screen用に作成したLevelにSet Display Backgroundノードを追加します。
試してみます。
出来ませんでした。
調べたら以下の様に書かれていました。
しました。
もう一回テストします。
Play ScreenからPlay Screen 1に移動します。
Play Screen 1 からPlay Screenに移動します。
Background Imageの設定は以下の様になっています。
出来ました。
6.2 Loading Screenを作成する。
ここでLoading Screenも作成してしまいます。
完成品を4.24に移動した方が簡単であるのと、何か問題が発生した時にここの方が直しやすいからです。
Background Imageを以下のように作成しました。
4ステップで描く! 星空の描き方メイキング [24] を参考にして描きました。
電車のイラストはhttps://illustimage.com/?dl=3165 のものを使用さえて頂きました。
利用規約をみると
と書かれていて加工しても良いし、このゲームを後で販売しても問題ない訳です。
しかもコピーライトの表記も要らないとあります。
え?
一番最初に、商業利用可能な無料のイラスト…て言っていましたよね。
何これ?
定食屋で「お代わり無料」と書かれていたからお代わりしたら「ご飯は別です。」とか言われて代金余計に取られた的な扱いは。
面倒臭そうなので電車の絵は消します。
これって「有利誤認表示」になりますよね。最初の文を一部商用利用可能に変更しておかないと、もし問題になった時に致命傷になる気がします。
電車の絵はhttps://www.irasutoya.com/2016/03/blog-post_625.html [25]から使用させてもらいました。
利用規定を確認します。
私が制作しているゲームのLoading Screenに使用する事に対しては特に問題はなさそうです。
編集や加工のOKと言っています。
商業に利用したとしても1個だけしか使用していないのでOKと解釈しました。
クレジット表記も要らないとありました。
こんな感じになりました。
銀河鉄道に乗らない場合のLoading Screenも考えておきます。
そしてLevel Of DetailのTexture GroupをUIにセットします。
こんな感じです。
Boarder Backgroundを改良します。
隙間を追加します。
Loading のCircular throbberをThrobberに変更しました。
セリフも直しました。
スタート画面用のLoading Screenも作成します。
作成したんですが、表示されません。
色々調べたら以下のShow Widget Overlayにチェックを入れないと駄目みたいです。
こんな感じです。
6.3 Async Loading ScreenをUE4.24 に追加する。
作り方が分かったのでCh4_3に実装します。
Async Loading ScreenをUE4.24 に追加します。
Plug Inを選択してEditorを再起動します。
Startup Loading Screenから作成していきます。
こんな設定にしました。
テストします。
こんな感じです。
Default Loading Screen画面も作成します。設定は4.26で作成したのとまったく同じです。
開始画面です。
Default Load画面です。
Open Level毎に、どちらのImageとTextを読み込むのかを指定します。
Widget BPを一個開いて、そこからOpen Level ノードを使用しているBPを検索します。
これらを一個ずつ検討していきます。
<Game Over Screen Falling Widget>
Game Over Screen Falling WidgetのRe-Start ボタンがクリックされた時にOpen Level ノードが呼ばれていました。
これ落っこちて死亡した時にやり直す時のボタンなので、Map1からやり直すのはオカシイです。この部分は後で直します。
それは兎も角、銀河鉄道に乗る訳ではないので「赤い帽子の魔女からの手紙」のLoading Screenを表示します。
勿論、以下の部分のチェックをつけます。
Back Start Buttonがクリックされた時もOpen Levelが呼ばれていたのでそこも直しました。
<Landscape 4>
これは魔物と戦闘になるときですね。
取りあえず「赤い帽子の魔女からの手紙」のLoading Screenを表示しておきます。
<Battle Field>
これは何かのテストのために作成して忘れてしまったヤツですね。
消します。
<Inn>
宿屋のLevelです。
宿屋も作り直す必要がありますね。今はこのままにしておいて「赤い帽子の魔女からの手紙」のLoading Screenを表示する所だけ直しておきます。
<Map1>
これも戦闘画面に移動する時ですね。
「赤い帽子の魔女からの手紙」のLoading Screenを表示するようにしました。
<Map1_Test>
Map1と全く同じです。
これで全部終りな訳ありません。
Game Mode BPを開いてもう一回、Open Level ノードを検索します。
今度はこれだけ表示されました。
これって全部のBPを一辺に調べる検索方法はないんでしょうか?
必ず漏れが生まれてしまうと思います。
最後のUWSは水のサンプルのMapなので無視していいですが、残りは全部チェックする必要があります。
<RPG Game Instance BP>
遥か昔に作成した地図を使用して別なMapにワープする機能です。
これは勿体ないのでどこかで使用出来るようにします。
今は「銀河鉄道のLoading Screen」を入れておきます。
<RPG Game Mode BP>
これは戦闘が終わって元のMapに戻る時ですね。
「赤い帽子の魔女からの手紙」のLoading Screenを表示します。
これは墜落した時のLoadingです。
これ専用のLoadingが必要ですね。取りあえず「赤い帽子の魔女からの手紙」のLoading Screenを表示します。
<Get Item Widget>
これは戦闘が終了してかつ石像が褒美をくれた後に元のLevelに戻る時に使用するやつです。
取りあえず「赤い帽子の魔女からの手紙」のLoading Screenを表示します。
<W_WarpGate Widget>
「銀河鉄道のLoading Screen」を表示します。
<Game Over Screen Widget>
Re-Start Button を押した時です。
「赤い帽子の魔女からの手紙」のLoading Screenを表示します。
こっちはスタート画面に戻る時のEventです。
「赤い帽子の魔女からの手紙」のLoading Screenを表示します。
こっちはスタート画面に戻る時のEventです。
<Start Menu Widget>
使用してないのが残っていました。
消します。
Load Buttonがクリックされた時です。
これは「銀河鉄道のLoading Screen」を表示します。
ゲーム開始最初の場面ですね。
「銀河鉄道のLoading Screen」を表示します。
<Game Over Screen Falling Widget>
Game Over してRe-Startした時です。
オカシイ。これは前に直したはず。
こっちは直っていました。
残りは全部直っていました。
テストします。
戦闘画面です。
戦闘から戻る時です。
あれ。Monsterが動いていない。
あ。Level BPを別なLevelから開いたときは新たにそれぞれのLevelを開いてBuildをし直す必要がありました。
まあ、テストが終わってからやります。
銀河鉄道に乗りました。
銀河鉄道が表示されています。
今度は戦闘に負けてみました。
今度は崖から落ちてみました。
崖から落ちた時のLoading Screenは別なのが必要ですね。
最後に宿屋に泊まった時のテストをします。
何も表示されません。
あれ?
今週も時間が無くなってしまったのでここで中止です。
宿屋は来週検討します。
6.4 Async Loading ScreenがどうやってOpen Levelノードが呼ばれるたびに呼ばれるようになっているのかを調べる
これを調査するのが今週のLoad Screenの勉強目的だったんですが、時間が無くなってしまいました。これも来週に回します。
6.Good Skyの復習
これもまた来週以降になってしまいましたね。
7.まとめと感想
Niagara SystemはCGHOW氏のTutorialで勉強をする事は取りあえず継続する事になりました。
- Dither Temporal AAノード
- Distance To Nearest Surfaceノード
- Lerp Particle Attribute Module
などについて勉強しました。
Static Mesh Sampling in UE5 Niagara Tutorial [13]を参考にしながらContent ExamplesにあるサンプルのStatic Mesh Samplingについて勉強しました。ここに使用されたModuleやNodeについては来週、改めて復習します。
Cascadeの勉強は中止してMaterialの勉強をする事にしました。
Map1の作成では、今週は特にNPCの修正をやりました。一番大変だったのがセリフの修正で、ある人が300前の大戦争でと言って、別な人は5000年前の大戦争といっています。こういう統一性が全くない会話になってしまうのは年表が出来てないからなのかと思いつつ年表を作成する気は起きないです。
NPCは今の所、歩いたりはしませんが、NPC用のAIを作成すればMonsterのように歩いたり、Playerの操作するキャラに向かって走ってきたりする事は出来ます。NPC用のAIを作成するか、それとも年表を作成するか。この辺の検討も必要かもしれません。
後、Map1をStream Levelに分割する事も検討します。せっかくSeamlessなmapの読み込み方法を勉強したんだから積極的に活用していきます。
地面の色がくっきり変わってします箇所があります。その部分は絶対直したいですが、直し方が分かりません。
Light Mass Importance Volumeは出来るだけ使用しない事にしました。影が濃いほうが中世的な雰囲気が出るからです。
Post Processは後でキッチリと勉強します。
Loading Screenの勉強に関してはUE4.24 にAsync Loading Screen plug-inを追加して、Ch4_3にLoading Screenを作成しました。Ch4_3で使用した全てのOpen LevelにSet Display Background IndexノードとSet Display Tip Text Indexノードを追加しました。これでそれぞれのLoading Screenで指定した絵とセリフが表示されるはずです。
ただし、Loading ScreenのFormatは全部同じものしか選択出来ません。この辺も選択出来る様になるともっと便利になる気がします。
Async Loading Screen plug-inのコードは公開されているので自分で改良してみたいです。
今回、結構、時間を取られたのがNPCのセリフの作成とLoading Screenの絵の作成です。こういうのはどんどん分業した方が良いと思います。Gameを作成するためのProgrammingは世間一般の評価とは裏腹に、実際にやってみると英語とProgramming Skillは当然として結構深い数学や物理の知識が要求されます。
英語とC++のProgrammingが当然のように出来て、大学Levelの数学と物理をきちんと理解してる人と文章が書ける人や絵が描ける人の数を比較したら1:50:5000ぐらいにはなるでしょう。
ゲーム制作出来るProgrammerはそれ自体が激レアキャラです。
彼らにあえて文章を書いたり、絵を描く事をProgrammerに強制するのは無駄な気がします。
そう考えるとNPC用のAIを作成するか、それとも年表を作成するか。の選択で年表を作成する気力は沸いてこないですね。
<参照(Reference)>
[1] Leswing, K. (2021, September 10). Apple can no longer force developers to use in-app purchasing, judge rules in Epic Games case. CNBC. https://www.cnbc.com/2021/09/10/epic-games-v-apple-judge-reaches-decision-.html
[2] Hoeg Law. (2021, September 11). Epic v Apple: Judgment Day - Who Won? Who Lost? . . .and Why? (VL538) [Video]. YouTube. https://www.youtube.com/watch?v=43CMV8KIs3E
[3] Yea, Y. [Yong Yea]. (2021, September 11). Both Epic & Apple Lose Big After Court Rules On Their Legal Battle [Video]. YouTube. https://www.youtube.com/watch?v=sCyF4Uf7Lco
[4] Epic Games [Unreal Engine]. (2020, May 27). Building advanced effects in Niagara | Unreal Engine [Video]. YouTube. https://www.youtube.com/watch?v=syVSRDQxrZU
[5] Epic Games. (n.d.-b). Niagara Script Editor Reference. Unreal Engine Documentation. Retrieved September 19, 2021, from https://docs.unrealengine.com/4.27/en-US/RenderingAndGraphics/Niagara/ScriptEditorReference/
[6] PrismaticaDev. (2021, April 5). Dither Temporal AA Node | 5-Minute Materials [UE4] [Video]. YouTube. https://www.youtube.com/watch?v=kvHh0Jd-D3Q
[7] Epic Games. (n.d.-c). Utility Expressions. Unreal Engine Documentation. Retrieved September 19, 2021, from https://docs.unrealengine.com/4.26/en-US/RenderingAndGraphics/Materials/ExpressionReference/Utility/
[8] Epic Games. (n.d.-a). Mesh Distance Fields. Unreal Engine Documentation. Retrieved September 19, 2021, from https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/LightingAndShadows/MeshDistanceFields/
[9] Nilsson, M. (n.d.). LearningUnrealEngine/Inside Unreal - Advanced Niagara Effects.md at master · ibbles/LearningUnrealEngine. GitHub. Retrieved September 19, 2021, from https://github.com/ibbles/LearningUnrealEngine/blob/master/Inside%20Unreal%20-%20Advanced%20Niagara%20Effects.md
[10] Hoeg Law. (2020, August 17). Epic’s CEO Just Called Me Out: A Response (VL289) [Video]. YouTube. https://www.youtube.com/watch?v=OQkD9kIgHkQ&t=438s
[11] Cloward, B. [Ben Cloward]. (2010, July 6). Ben Cloward [Video]. YouTube. https://www.youtube.com/user/bcloward/playlists
[12] Kupser, K. (n.d.). Kurt Kupser. ArtStation. Retrieved September 19, 2021, from https://www.artstation.com/learning/instructors/Kurt-Kupser
[13] CGHOW. (2021, August 26). Static Mesh Sampling in UE5 Niagara Tutorial | Download Files [Video]. YouTube. https://www.youtube.com/watch?v=9MJ8YtEs5as
[14] Cloward, B. (n.d.-c). Shader Graph Basics. YouTube. Retrieved September 19, 2021, from https://www.youtube.com/playlist?list=PL78XDi0TS4lEBWa2Hpzg2SRC5njCcKydl
[15] Cloward, B. (n.d.-d). UE4 Material Editor - Shader Creation. YouTube. Retrieved September 19, 2021, from https://www.youtube.com/playlist?list=PL78XDi0TS4lFlOVKsNC6LR4sCQhetKJqs
[16] Cloward, B. (n.d.-b). Rain Materials in Unreal Engine 4. YouTube. Retrieved September 19, 2021, from https://www.youtube.com/playlist?list=PL78XDi0TS4lHpIHseomZCPRm_NkyUMkPs
[17] Cloward, B. (n.d.-a). Procedural Noise Materials in Unreal Engine 4. YouTube. Retrieved September 19, 2021, from https://www.youtube.com/playlist?list=PL78XDi0TS4lE7kpna273_SUl2e0PXYZRY
[18] Cloward, B. (n.d.-e). UE4 Water Material Tutorial. YouTube. Retrieved September 19, 2021, from https://www.youtube.com/playlist?list=PL78XDi0TS4lGXKflD2Z5aY2sLuIln6-sD
[19] Cloward, B. [Ben Cloward]. (2021, June 10). Announcing What’s Next! - Shader Graph Basics - Episode 1 [Video]. YouTube. https://www.youtube.com/watch?v=OX_6_bKpP9g&list=PL78XDi0TS4lEBWa2Hpzg2SRC5njCcKydl&index=1
[20] Cloward, B. [Ben Cloward]. (2021b, June 17). The Graphics Pipeline - Shader Graph Basics - Episode 2 [Video]. YouTube. https://www.youtube.com/watch?v=ZEXVQgbWxQY&list=PL78XDi0TS4lEBWa2Hpzg2SRC5njCcKydl&index=2
[21] Wadstein, M. [Mathew Wadstein]. (2015, December 10). WTF Is? Volume - Lightmass Importance in Unreal Engine 4 [Video]. YouTube. https://www.youtube.com/watch?v=2LEuPveQfWg
[22] Sensei, U. [Unreal Sensei]. (2021, January 15). How to Make Unreal Engine 4 Render Lighting Faster! - UE4 GPU Lightmass Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=H3PEVnRGA4s
[23] Bui, T. (n.d.). GitHub - truong-bui/AsyncLoadingScreen. GitHub. Retrieved September 19, 2021, from https://github.com/truong-bui/AsyncLoadingScreen
[24] オオタカハシ. (n.d.). 4ステップで描く! 星空の描き方メイキング. いちあっぷゼミ. Retrieved September 19, 2021, from https://ichi-up.net/2017/099
[25] いらすとや. (n.d.). いろいろな色の電車のイラスト. Retrieved September 17, 2021, from https://www.irasutoya.com/2016/03/blog-post_625.html