UE4の勉強記録

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

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

f:id:kazuhironagai77:20210919220518p:plain

<前文>

前文には日本人が誤解しているアメリカ、特に日本文化とキリスト教文化の違いから生じる誤解とその解決法について気が付く範囲ですが書いて行く予定でした。

しかし今週だけはお休みしてEpic とAppleの訴訟の判決に対して調査した結果をまとめておきたいと思います。

この訴訟は、日本のSmart Phoneアプリの開発の方向性を決定する大きな事件であるはずなのに、日本ではあまり大きなニュースになっていません。

その結果、この裁判の結果がどうなっているのか日本語のニュースを追っているだけでは良く分からないです。

それで私が勝手に調べて見ました。

ただし最初に断っておきますが、私は毎週UE4の勉強をしていて、もう4年近く経ちます。その間Epic Games社にはこんな凄いGame Engineを無料で提供してくれて感謝しかありません。のでかなり私はEpic Game社を応援する側になります。なるだけ公平かつ客観的な意見を述べようと心がけますが、少しはバイアスが入ってしまうかもしれません。

まずCNBCのニュース [1]です。

f:id:kazuhironagai77:20210919220539p:plain

とまとめられています。

まず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の勉強
  • 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のサンプルそっくりに再現する事が目的です。

以下に先週の結果を示しますが、かなりそっくりに再現出来たと思います。

f:id:kazuhironagai77:20210919220711p:plain

<出来なかった事は?>

唯一出来なかった部分がMaterialです。

f:id:kazuhironagai77:20210919220728p:plain

これはどう直せば良いのか全く分からなかったです。

<学んだ事は?>

先週、まとめた学んだ事に追加して以下の事を学びました。

  • Force Moduleが速度を追加しているだけだと言う事。
  • Edit Valueについて

f:id:kazuhironagai77:20210919220757p:plain

  • Light RendererUse Inverse Squared Falloffについて
  • Initialize Mesh Reproduction Sprite ModuleUpdate Mesh Reproduction Sprite Moduleについて
  • SpriteMeshNormal Vectorに垂直に面するようにする設定方法(Sprite Renderer ModuleAlignmentFacing Modeの値を以下に示した値に変更)

f:id:kazuhironagai77:20210919220827p:plain

  • Spriteを丸くする

f:id:kazuhironagai77:20210919220858p:plain

  • Objectに触った部分のキャラのMaterialが消える方法
  • Distance To Nearest Surfaceノードの機能

f:id:kazuhironagai77:20210919220927p:plain

  • 生成したParticleをバラバラに飛ばす方法
  • 以下の名称がNam Spaceだった件

f:id:kazuhironagai77:20210919220955p:plain

  • Scratch Pat Moduleの作成方法(2回目)

以上です。

これらの中で、先週学んだけど実際はよくわかっていない箇所が沢山あります。それらは次で復習します。

2.2 先週、勉強した事で分からなかった部分の勉強

Link InputTransient

TransientがどのName Spaceを指しているのか分かりません。

f:id:kazuhironagai77:20210919221042p:plain

調べます。

公式のDocumentであるNiagara Script Editor Reference [5] には

f:id:kazuhironagai77:20210919221057p:plain

と書かれていました。と言う事はそのModule内にしか存在しないLocal Variableなんでしょうか?

CursorをTransientに重ねたら以下の説明が出て来ました。

f:id:kazuhironagai77:20210919221113p:plain

説明が微妙に違いますね。こっちの説明だと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を作成します。

f:id:kazuhironagai77:20210919221222p:plain

Blend ModeはTranslucentです。

f:id:kazuhironagai77:20210919221236p:plain

PlaneにこのMaterialを貼り付けると

f:id:kazuhironagai77:20210919221250p:plain

こんな感じの半透明になります。

f:id:kazuhironagai77:20210919221304p:plain

Shader Complexityを見ると

f:id:kazuhironagai77:20210919221317p:plain

うーん。

あんまり差が見えませんね。

PrismaticaDev氏の解説に出て来るサンプルは

f:id:kazuhironagai77:20210919221338p:plain

結構真っ赤です。

まあ、Translucentを使用すれば最低でも2回Renderingをしなければならない訳でコストがOpaqueに比べて高くなるのは理論的には確かです。

仕方ないです。3枚重ねてみました。

f:id:kazuhironagai77:20210919221352p:plain

今度は赤くなりました。これで行きます。

Litに戻すとこんな感じになってました。

f:id:kazuhironagai77:20210919221527p:plain

今度はDither Temporal AAノードを使用したMaterialを作成します。

Blend ModeをMaskedに変更して

f:id:kazuhironagai77:20210919221544p:plain

以下に示した様にDither Temporal AAを追加します。

f:id:kazuhironagai77:20210919221559p:plain

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

f:id:kazuhironagai77:20210919221614p:plain

うーん。

まずTranslucentとそっくりとは言えませんね。

でもある程度は後ろのImageも見えますので全く駄目と言うわけでもないですね。

PrismaticaDev氏の解説によればDither Temporal AAはMaterialを虫食い状態にするそうです。

そしてコストですが、

一枚ではこんな感じです。

f:id:kazuhironagai77:20210919221629p:plain

3枚ではこんな感じになりました。

f:id:kazuhironagai77:20210919221642p:plain

これは!

コストの面からはDither Temporal AAの方が圧倒的に有利ですね。

ただし、3枚重ねた実際のImageは以下の様です。

f:id:kazuhironagai77:20210919221657p:plain

100%、Translucentの代わりになる訳ではないさそうです。適所適材で行く必要がありますね。

PrismaticaDev氏のTutorialでは更にDither Temporal AAノードを使用した時に発生するへんな影の直し方についても別なTutorialで解説しています。

f:id:kazuhironagai77:20210919221711p:plain

うーん。まあこれは別な機会に勉強する事にします。

先週、使用したDither Temporal AAもOpacity Maskに繋がっていました。

f:id:kazuhironagai77:20210919221725p:plain

f:id:kazuhironagai77:20210919221731p:plain

<Distance To Nearest Surfaceノードについて

Distance To Nearest Surfaceノードについて調べます。

f:id:kazuhironagai77:20210919221749p:plain

これって名前から想像するとそのMeshから最も近い距離にあるAssetまでの距離を測るノードですよね。

公式のDocumentであるUtility Expressions [7] によるとDistance To Nearest SurfaceノードのRemarkには

f:id:kazuhironagai77:20210919221803p:plain

と書かれています。

Global Distance Fieldって何の事でしょう?

多分ですが、この公式のDocumentで述べられているMesh Distance Fields [8] の事と同じだと思います。

f:id:kazuhironagai77:20210919221818p:plain

つまり、Global Distance Fieldに、そのMeshから最も近い距離にあるAssetまでの距離が記録されている。と考えられます。

あ。分かった。

The signed distance …to the nearest occludes in the sceneがシーン内の最も近い距離にある遮蔽物からの距離、つまりMeshから最も近い距離にあるAssetまでの距離を指しているんです。その値がDistance fieldに入っているんです。

Distance To Nearest Surfaceノードの続きの実装部は何をしているのか?

次なんですがその後に

f:id:kazuhironagai77:20210919221837p:plain

こんな説明をして以下の実装をしているんです。

f:id:kazuhironagai77:20210919221851p:plain

これの意味が分からない。

うん。分からないなら実験してみます。

先程のMaterialを以下の様に改良しました。

f:id:kazuhironagai77:20210919221904p:plain

<<Subtract = 0、Divide = 30>>

f:id:kazuhironagai77:20210919221922p:plain

ぴったしガラス玉の内側に入っている部分だけ消えています。

<<Subtract = 10、Divide = 30>>

f:id:kazuhironagai77:20210919221940p:plain

なんと、1マス手前の位置からPlaneが消えています。1マスは10cmですのでSubtract=10は10cm手前で消滅すると言う事でしょうか?

<<Subtract = 30、Divide = 30>>

そんなに上手くは行かなかったです。

f:id:kazuhironagai77:20210919221959p:plain

Subtract = 30で5マス手前からPlaneが消滅しています。

しかしSubtractが何を表しているのかは分かりました。この数字が大きい程離れた所からPlaneが消えます。

<<Subtract = 10、Divide = 1>>

今度はSubtractを固定してDivideを変化させます。

f:id:kazuhironagai77:20210919222017p:plain

はい。Planeの曖昧な部分が全くなくなりました。

<<Subtract = 10、Divide = 10>>

f:id:kazuhironagai77:20210919222035p:plain

少しだけ曖昧な部分が出来ました。何となくですが曖昧な部分の大きさが10cmのような気がします。

<<Subtract = 10、Divide = 30>>

Divideを30にしたら曖昧な部分がもっと増えました。

f:id:kazuhironagai77:20210919222053p:plain

はい。DivideはPlaneの曖昧な部分の太さを担当しているようです。

先週の全く意味の分からなかった一文の意味が分かりました。

f:id:kazuhironagai77:20210919222241p:plain

このFadeはPlaneの消える部分を表しています。つまりSubtractする数字の事です。その次の黒いBandはPlaneの曖昧な部分を指しています。つまりDivideの部分です。

はい。これで完璧に理解しました。

<Get Level of Dissolveについて>

今度は先週、Scratch Pat Moduleより作成したGet Level of Dissolve Moduleについてです。

f:id:kazuhironagai77:20210919222305p:plain

ここで分からない事は一つだけです。

何でInput New Collision QueryとSample PositionをQuery Mesh Distance Field GPU ノードにパスするとDistance To Nearest Surfaceの値が返って来るのかだけです。

f:id:kazuhironagai77:20210919222318p:plain

これについてはGoogleで検索しても何も出て来ません。

唯一出て来たのがGithubにあるAdvanced Niagara Effects | Inside Unreal [9] で、そこには

f:id:kazuhironagai77:20210919222331p:plain

と書かれていました。

ここから推測すると、New Collision QueryがDistance Fieldを保持していてSample PositionがParticleの位置を保持しているんでしょうか?

それよりも

f:id:kazuhironagai77:20210919222346p:plain

これを読むとDistance Fieldって空間中にvoxelとして充満しているんでしょうか?

そう言えばMesh Distance Fields [8]に合った図(以下に示している)でも何もない空間中から木への距離を表しています。

f:id:kazuhironagai77:20210919222404p:plain

この図をよーく見ると四角の図が全体を覆ってますね。

とするとUnreal Engineでは全ての空間がVoxelで充満していてそれぞれのVoxelがDistance Field値を保持してると考えられます。

すると先程述べた

f:id:kazuhironagai77:20210919222420p:plain

は、「Meshから」ではなく「何もない空間に配置されているVoxel」からがより正確に近い言い方になります。

<Lerp Particle Attribute Module

このModuleは2つの値のLinear Interpolationをするのは間違いないです。

f:id:kazuhironagai77:20210919222441p:plain

f:id:kazuhironagai77:20210919222447p:plain

でもこの二つの値って同じじゃ…

f:id:kazuhironagai77:20210919222501p:plain

その後で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を勉強する事で新しいModuleDynamic Inputなどの使用方法が学べたらOKと考えておく。
  • 自分でEffectを作成してみる。
  • Content ExamplesSampleを自分で勉強してみる。
  • 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の解説をしている動画がありました。

f:id:kazuhironagai77:20210919222703p:plain

今週はこれを勉強しましょう。

UE5で作成すると言うので一応UE5をInstallしました。このパソコンでどこまで動くのか分かりませんが、出来る所までやっていき、出来なかったらUE4.26 か27でやり直します。

f:id:kazuhironagai77:20210919222723p:plain

新しいLevelを作成した後でSphere Reflection Captureを消しています。何か理由があるんでしょうか?

f:id:kazuhironagai77:20210919222738p:plain

<Cone、球、ドーナツ型のMeshの作成>

Cone、球、ドーナツ型のMeshを作成してUE5にImportしていますが、自分で作る事が出来ないのでStarter kitにあるやつをそのままCopyしてきました。

f:id:kazuhironagai77:20210919222756p:plain

Niagara Systemの作成>

Niagara SystemにTemplateのFountainを追加して新しいNSを作成しました。

f:id:kazuhironagai77:20210919222817p:plain

この辺はUE4と全く同じですね。

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

f:id:kazuhironagai77:20210919222831p:plain

一応、要らない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にセットしました。

f:id:kazuhironagai77:20210919222850p:plain

f:id:kazuhironagai77:20210919222856p:plain

この辺はまだ理解出来ますね。50個のParticleを一辺に生成すると言う意味なはずです。

f:id:kazuhironagai77:20210919222912p:plain

Particle Spawn SectionのInitialize Particle Moduleの設定を以下のように変更しました。

f:id:kazuhironagai77:20210919222927p:plain

それぞれのParticle の寿命は2秒になりました。

当然、Mesh RendererをRender Sectionに追加します。

f:id:kazuhironagai77:20210919222940p:plain

更にMeshにドーナツをセットします。

アレConeでした。Coneをセットします。

f:id:kazuhironagai77:20210919222954p:plain

TutorialではConeのサイズが小さいので、Particle Spawn SectionのInitialize Particle ModuleのMesh Uniform Scaleの値を変更しています。

f:id:kazuhironagai77:20210919223008p:plain

私のCone Meshは大きいのでScaleはそのままにしておきます。後で小さくする必要が出てくるかもしれませんが。

<Cone用Materialの作成>

この後、このCone用のMaterialを作成しています。

Tutorialと全く同じように作成しました。

f:id:kazuhironagai77:20210919223028p:plain

<Cornに色を追加>

その作成したMaterialをRender SectionのMesh Renderer Moduleの以下の箇所にセットします。

f:id:kazuhironagai77:20210919223046p:plain

Particle Spawn SectionのInitialize Particle ModuleでConeの色を赤くしました。

f:id:kazuhironagai77:20210919223100p:plain

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を追加しました。

f:id:kazuhironagai77:20210919223117p:plain

成程、これで望みのMeshをModuleにパスする訳ですね。

f:id:kazuhironagai77:20210919223133p:plain

はい。しています。

今度はそのMeshのWorld SpaceにおけるTri Positionの値をGet Tri Position WS Moduleを使用して呼び出しています。

f:id:kazuhironagai77:20210919223147p:plain

Tri PositionってMeshのどの位置を指しているんでしょうか?

一個一個のMeshを指しているのかなとも思ったんですが、Meshって四角の時もありますよね。

後、World SpaceとLocal Spaceの時のEffectの挙動の違いで良く分からない時があります。World SpaceとLocal Spaceの復習も後でやります。

Get Tri Position WS ModuleのCoordにRandom Tri Coord Moduleの返し値を繋ぎます。

f:id:kazuhironagai77:20210919223225p:plain

Random Tri Coord Moduleの機能をその名前から想像するとStatic Meshの中にある沢山のMeshから一つを適当に選ぶものと想像出来ます。とするとGet Tri Position WS Moduleの機能もStatic Meshの中の一個のMeshの位置を返していると考えられます。

Map SetにNew Vectorを追加して名前を以下の様に変更しました。

f:id:kazuhironagai77:20210919223240p:plain

更にName SpaceをParticleに変更しました。

f:id:kazuhironagai77:20210919223254p:plain

Applyを押してこのModuleが使用出来るようにします。

f:id:kazuhironagai77:20210919223309p:plain

<作成したScratch Moduleを使用して球の表面にCornを発生させる>

Scratch Moduleの変数にMy SphereとMy Torusが追加されています。そこに先程のStatic Meshを追加します。

f:id:kazuhironagai77:20210919223327p:plain

正しこれだけでは何も起こりません。

f:id:kazuhironagai77:20210919223341p:plain

何故ならScratch Moduleの返し値をParticleの生成する位置に指定していないからです。

そのためにParameterのParticle AttributeにあるParticle PositionをDragして

f:id:kazuhironagai77:20210919223354p:plain

Particle Update Sectionにセットします。

f:id:kazuhironagai77:20210919223409p:plain

へえー!こんな事が出来るんですね。

これが出来ると何が出来る様になるんでしょう?楽しみです。次に進みましょう。

なんと、Particle のPositionの値を先程作成したParticleのMy Sphere Locationに指定しました。

f:id:kazuhironagai77:20210919223425p:plain

あ、分かりました。

単に

Position = My Sphere Location;

を実装したのと同じ事をここでしたんです。

Cornの位置が球の表面に沿ってバラバラになりました。

f:id:kazuhironagai77:20210919223500p:plain

成程。

これは分かり易いです。

ただTutorialのCornと比較すると私のCornはかなり大きいです。

Particle Spawn SectionのInitialize Particle Moduleの設定を以下のように変更します。

f:id:kazuhironagai77:20210919223513p:plain

大分、TutorialのImageに近づきました。

f:id:kazuhironagai77:20210919223534p:plain

当然、Cornはドーナツ状に配置されるようになりました。

f:id:kazuhironagai77:20210919223550p:plain

分かり易い。

非常に分かり易いです。

<Lerp Particle Attribute Moduleを使用してドーナツの表面に発生させたCornを球の表面に移動させる>

そしたらParticle のPositionを消してしまいました。

f:id:kazuhironagai77:20210919223608p:plain

そしてParticle Update Section にLerp Particle Attribute Moduleを追加しました。

f:id:kazuhironagai77:20210919223626p:plain

おお!

この今一、良く分からないModuleの使用方法について詳しく教われそうです。

まずPositionにチェックを入れました。

f:id:kazuhironagai77:20210919223640p:plain

Position AにMy Sphere LocationをセットしてPosition BにMy Torus Locationをセットします。

f:id:kazuhironagai77:20210919223653p:plain

これなら意味が分かります。

やっとLerp Particle Attribute Moduleの機能が理解出来ました。

後はどの程度のBlendをPosition AとPosition Bでするかと言う事でしょう。

それはこのLerp Alphaで設定するそうです。

f:id:kazuhironagai77:20210919223713p:plain

0だと100% Position Aの値になり1だと100% Position Bの値になるそうです。

試しにLerp Alphaの値を0から1に変えてみました。

f:id:kazuhironagai77:20210919223841p:plain

f:id:kazuhironagai77:20210919223847p:plain

球の表面に発生したコーンがドーナツの表面に発生したコーンに変化しています。

Lerp Alphaの値をFloat from Curveに変更してCurveの値は以下の様に変更しました。

f:id:kazuhironagai77:20210919223901p:plain

上手く映像で撮れなかったんですが、ドーナツから球に変化しています。

なんで逆と思ったら、このCurveが1から0に変化しているからでした。

これでLerp Particle Attribute Moduleの機能が理解出来ました。

今週は時間がないのでやりませんが、来週、この機能を分かり易く説明する簡易Effectを作って、自分で解説し直します。

<コーンの向きをMeshの表面に合わせる(球だけ)>

今度はコーンの向きをMeshの表面に合わせます。

そのためには、Get Tri Normal WS Moduleを使用します。

f:id:kazuhironagai77:20210919223920p:plain

全体はこんな感じです。

f:id:kazuhironagai77:20210919223938p:plain

そしてParticle Update SectionにOrient Mesh To Vector Moduleを追加します。

f:id:kazuhironagai77:20210919223953p:plain

このModuleは初めて使用します。

My Sphere Normalをセットします。

f:id:kazuhironagai77:20210919224007p:plain

向きが少しだけオカシイみたいです。

f:id:kazuhironagai77:20210919224022p:plain

Particle Spawn SectionにInitial Mesh Orientation Moduleを追加します。

f:id:kazuhironagai77:20210919224036p:plain

Initial Mesh Orientation ModuleのRotationに0.25を追加します。

f:id:kazuhironagai77:20210919224051p:plain

その結果、

f:id:kazuhironagai77:20210919224106p:plain

向きが直りました。

ただし最初のドーナツ型の時はコーンの方向は滅茶苦茶なままです。

f:id:kazuhironagai77:20210919224126p:plain

<コーンの向きをMeshの表面に合わせる(ドーナツも)>

それを直すためにOrient Mesh To Vector ModuleのLook At DirectionのAとBに以下の値をセットします。

更にAlphaにセットされたFloat from CurveのGraphはLerp Particle Attribute のグラフをそのままPasteして使用しています。

f:id:kazuhironagai77:20210919224206p:plain

その結果、ドーナツ形でもコーンがドーナツに沿っています。

f:id:kazuhironagai77:20210919224224p:plain

はあ。成程。

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の以下の赤線で囲った部分をクリックして

f:id:kazuhironagai77:20210919224243p:plain

Read from New User Parameterを選択します。

f:id:kazuhironagai77:20210919224304p:plain

My SphereにUser My Sphereが表示されました。

f:id:kazuhironagai77:20210919224320p:plain

ドーナツも同様にします。

f:id:kazuhironagai77:20210919224335p:plain

UE5のEditorに戻り、作成したNSをLevel上に配置します。

f:id:kazuhironagai77:20210919224351p:plain

この時点ではNSのCornはその場で形状の変化をしているだけです。

NSのSourceに配置されている球とドーナツを追加します。

f:id:kazuhironagai77:20210919224405p:plain

Tutorialではこの部分の作業がカメラに写っていません。この部分のやり方を判明させるのにちょっとだけ苦労しました。

f:id:kazuhironagai77:20210919224423p:plain

こんな感じにNSが移動するようになりました。

f:id:kazuhironagai77:20210919224441p:plain

f:id:kazuhironagai77:20210919224453p:plain

f:id:kazuhironagai77:20210919224504p:plain

結構な勉強になったので、今週はここまでとします。(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は本当の基礎の基礎を教えるそうです。

f:id:kazuhironagai77:20210919224845p:plain

ぱっと見ましたが、確かに基本中の基本を教えていますね。でも復習や抜けの確認のためにこのTutorialからやるのが良いかもしれません。

UE4 Material Editor - Shader Creation [15]

こっちのTutorialも初心者向けみたいです。

f:id:kazuhironagai77:20210919224927p:plain

Shader Graph Basics [14]とどこか違うのか調べたらこっちのTutorialの方が古いんです。そのため30個も動画があります。

ただ今までの経験から言うと、Tutorialは新しい方が何倍も優れています。

Rain Materials in Unreal Engine 4 [16]

これは文字通り、雨を表現するために必要なMaterialの作成方法を教えています。

f:id:kazuhironagai77:20210919224958p:plain

まあ、応用編ですね。

Procedural Noise - UE4 Materials 101 [17] >

これはPerlin Noise についての勉強のようです。

f:id:kazuhironagai77:20210919225022p:plain

UE4 Water Material Tutorial [18] >

これは水のMaterialの作成方法のTutorialのようです。

f:id:kazuhironagai77:20210919225044p:plain

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そのままじゃないですか。

f:id:kazuhironagai77:20210919225108p:plain

これはProgrammer friendlyです。GLSLで書いていたCodeをほぼそのままで書き写せそうです。

こりゃ、UE負けている。

と思ったら、以下に示したTextureを動かす実装ですが、Unityはこの部分をUEのようにVertex Shaderで行う方法がないそうです。

f:id:kazuhironagai77:20210919225124p:plain

ほお。

これは一長一短で、UnityとUEがGame Engine業界で覇権を争っている理由が分かります。優劣つけがたいです。

それではこのTutorialでやっている実装を実際にUE5で試してみます。

作成しました。これはTextureをSine Curveに沿って移動させる実装です。

f:id:kazuhironagai77:20210919225146p:plain

Statsを見ます。

f:id:kazuhironagai77:20210919225200p:plain

Vertex Shaderが111 instructionsで、それ以外のShaderが152 instructionsです。

これにVertex Interpolator ノードを追加します。

f:id:kazuhironagai77:20210919225221p:plain

Statsの結果が変わりました。

f:id:kazuhironagai77:20210919225248p:plain

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に繋ぎます。

f:id:kazuhironagai77:20210919225305p:plain

Statsを見ます。

f:id:kazuhironagai77:20210919225319p:plain

Vertex Shaderが121 instructionsで、それ以外のShaderが148 instructionsのままです。

つまりWorld Position OffsetはVertex Shaderで計算されていると言う事です。

はい。

今週のMaterialの勉強はここまでとしておきます。

4.Map1の作成の続き

4.1 Landscapeの調整

地面が平ら過ぎるのでLandscapeでデコボコを追加します。

f:id:kazuhironagai77:20210919225345p:plain

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

f:id:kazuhironagai77:20210919225400p:plain

f:id:kazuhironagai77:20210919225408p:plain

地面ですが多少デコボコする位に留めました。

f:id:kazuhironagai77:20210919225434p:plain

何故か、この部分で色が変わっています。

f:id:kazuhironagai77:20210919225449p:plain

直したいですが理由が分かりません。

4.2 Light Mass Important Volume と Post Process Volumeについて

以下の二つのAssetが

f:id:kazuhironagai77:20210919225515p:plain

初期状態のまま残っていました。

f:id:kazuhironagai77:20210919225530p:plain

一応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を外しました。

朝です。

f:id:kazuhironagai77:20210919225557p:plain

別に変な所はありません。と言うかどこが変わったのかも分かりません。

Directional LightもMovable にセットしてるのでSky LightしかLight Massに影響を与える光がないからかもしれません。

昼です。

f:id:kazuhironagai77:20210919225635p:plain

これも今までとほとんど同じに見えます。

夕方です。

f:id:kazuhironagai77:20210919225705p:plain

普通ですね。

夜です。

f:id:kazuhironagai77:20210919225719p:plain

問題ないです。

Indirectな光の影響と言えば最初の村で家が同じ様に並んでいるのに片方だけ真っ黒な所があります。

f:id:kazuhironagai77:20210919225737p:plain

これってLight Mass Importance Volumeを配置したら変わるんでしょうか?

試してみます。

f:id:kazuhironagai77:20210919225800p:plain

変わってないですね。

Light Mass Importance VolumeはこのMapにはいらないですね。ただし全部外してしまうとUE4が勝手にLight Massを配置してしますので適当な所に一個だけ配置しておきます。

<Post Process Volume

これは勉強すべき範囲が多すぎです。Loading Screenの勉強が終わったらやる事にします。

4.3 最初の村の作成

Playerの操作するキャラが銀河鉄道に乗ってMap1に到着したら、村長と話しをします。

f:id:kazuhironagai77:20210919225841p:plain

すると魔物がうろついているので、武器を手に入れる必要がある。その為には奥の村に進む必要が在る事を知ります。

あ。

最初の村の住人のMeshがSK_Mannequinのままでした。

f:id:kazuhironagai77:20210919230001p:plain

これを直しましょう。

<村の住人のMeshの変換>

まず、この前買った

f:id:kazuhironagai77:20210919230011p:plain

の付属のキャラの色違いを全部作成しました。

これをそれぞれのNPCに追加して以降と思います。

f:id:kazuhironagai77:20210919230358p:plain

これをそれぞれのNPCに追加して以降と思います。

<Old Man

f:id:kazuhironagai77:20210919230428p:plain

小さくしてみました。

f:id:kazuhironagai77:20210919230444p:plain

UWidgetのキャラとは全く違いますね。

f:id:kazuhironagai77:20210919230505p:plain

後で調節します。

<Magic Researcher

これに近いImageのキャラを探します。

f:id:kazuhironagai77:20210919230526p:plain

これが一番近いImageですかね。

f:id:kazuhironagai77:20210919230552p:plain

頭の大きさが全然違います。エルフとドワーフみたいな種族の違いを導入しないと厳しそうです。

<Mountain Man

うーん。この爺さんに似てるキャラはいませんね。

f:id:kazuhironagai77:20210919230623p:plain

全然、見た目は違いますが取りあえずこのキャラを使用しておきます。

f:id:kazuhironagai77:20210919230648p:plain

やっぱりこっちの方がMountain Manって感じがしますね。

f:id:kazuhironagai77:20210919230720p:plain

こっちにしましょう。

<Head Man

今度は村長です。

f:id:kazuhironagai77:20210919230744p:plain

先程の王様と同じでいいでしょう。

f:id:kazuhironagai77:20210919230808p:plain

サイズは違いますがこれで行きます。

<Business Man

Business Manだそうです。

f:id:kazuhironagai77:20210919230841p:plain

これですかね。

f:id:kazuhironagai77:20210919230944p:plain

<Fortune Teller

占い師です。

f:id:kazuhironagai77:20210919231016p:plain

これですかね。

f:id:kazuhironagai77:20210919231059p:plain

<Retired Warrior

退役した戦士です。

f:id:kazuhironagai77:20210919231130p:plain

赤い色がありません。これで我慢します。

f:id:kazuhironagai77:20210919231150p:plain

<Talking NPC Political

政治の事ばかりおしゃべりする男性のNPCです。

f:id:kazuhironagai77:20210919231223p:plain

見た目から何か何まで違いますがこれで行きます。

f:id:kazuhironagai77:20210919231342p:plain

<Village Princes

村長の娘です。

f:id:kazuhironagai77:20210919231410p:plain

これにします。

f:id:kazuhironagai77:20210919231427p:plain

<Sheriff

村の保安官です。

f:id:kazuhironagai77:20210919231457p:plain

王様を大きくしました。

f:id:kazuhironagai77:20210919231518p:plain

<Back Pack

旅行者ですね。

f:id:kazuhironagai77:20210919231552p:plain

Blender使えたら自分で3Dモデル作成するんですが…

自分で言うのもあれですがこの2Dのデザインかなり良いですよね。

しかしこのデザインなら3Dの製作もそんなに難しくないですよね。

f:id:kazuhironagai77:20210919231625p:plain

もうどれでも同じでしょう。使ってないキャラを選択しました。

<Hunter

Hunterと言っていますが実際は傭兵ですね。

f:id:kazuhironagai77:20210919231813p:plain

体を大きくしました。

f:id:kazuhironagai77:20210919231835p:plain

<Weather Cast

天気予報する人です。

f:id:kazuhironagai77:20210919231901p:plain

老人はこれしかないです。

f:id:kazuhironagai77:20210919231938p:plain

これにします。

<Poet

詩人です。

f:id:kazuhironagai77:20210919232016p:plain

全然imageが違う。けど詩人っぽくはあります。

f:id:kazuhironagai77:20210919232034p:plain

<Henchman

f:id:kazuhironagai77:20210919232055p:plain

ちっこくしてみました。

f:id:kazuhironagai77:20210919232115p:plain

<Scientist

科学者の卵です。

f:id:kazuhironagai77:20210919232209p:plain

色だけ同じキャラにしました。

f:id:kazuhironagai77:20210919232238p:plain

これでNPC全てにキャラ振りを終わりました。

5.最初の村の村人のセリフを直す

最初の村で村人に話かけたら変なセリフを言っている所があります。

セリフを直します。

f:id:kazuhironagai77:20210919232306p:plain

完璧ではないですが何とか直しました。

細かい点ではおかしな所がありますが、来週以降、順次直していきます。

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] に以下の解説がありました。

f:id:kazuhironagai77:20210919232450p:plain

この機能を使用すれば別なLoading Screenの表示が出来そうです。

試してみます。

先週、Async Loading Screen用に作成したLevelにSet Display Backgroundノードを追加します。

f:id:kazuhironagai77:20210919232526p:plain

f:id:kazuhironagai77:20210919232533p:plain

試してみます。

出来ませんでした。

調べたら以下の様に書かれていました。

f:id:kazuhironagai77:20210919232606p:plain

しました。

f:id:kazuhironagai77:20210919232633p:plain

もう一回テストします。

Play ScreenからPlay Screen 1に移動します。

f:id:kazuhironagai77:20210919232925p:plain

Play Screen 1 からPlay Screenに移動します。

f:id:kazuhironagai77:20210919232941p:plain

Background Imageの設定は以下の様になっています。

f:id:kazuhironagai77:20210919232959p:plain

出来ました。

6.2 Loading Screenを作成する。

ここでLoading Screenも作成してしまいます。

完成品を4.24に移動した方が簡単であるのと、何か問題が発生した時にここの方が直しやすいからです。

Background Imageを以下のように作成しました。

f:id:kazuhironagai77:20210919233023p:plain

4ステップで描く! 星空の描き方メイキング [24] を参考にして描きました。

電車のイラストはhttps://illustimage.com/?dl=3165 のものを使用さえて頂きました。

利用規約をみると

f:id:kazuhironagai77:20210919233050p:plain

f:id:kazuhironagai77:20210919233057p:plain

と書かれていて加工しても良いし、このゲームを後で販売しても問題ない訳です。

f:id:kazuhironagai77:20210919233127p:plain

しかもコピーライトの表記も要らないとあります。

f:id:kazuhironagai77:20210919233202p:plain

え?

一番最初に、商業利用可能な無料のイラスト…て言っていましたよね。

何これ?

定食屋で「お代わり無料」と書かれていたからお代わりしたら「ご飯は別です。」とか言われて代金余計に取られた的な扱いは。

面倒臭そうなので電車の絵は消します。

これって「有利誤認表示」になりますよね。最初の文を一部商用利用可能に変更しておかないと、もし問題になった時に致命傷になる気がします。

電車の絵はhttps://www.irasutoya.com/2016/03/blog-post_625.html [25]から使用させてもらいました。

利用規定を確認します。

f:id:kazuhironagai77:20210919233251p:plain

私が制作しているゲームのLoading Screenに使用する事に対しては特に問題はなさそうです。

f:id:kazuhironagai77:20210919233316p:plain

編集や加工のOKと言っています。

f:id:kazuhironagai77:20210919233340p:plain

商業に利用したとしても1個だけしか使用していないのでOKと解釈しました。

クレジット表記も要らないとありました。

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

f:id:kazuhironagai77:20210919233428p:plain

銀河鉄道に乗らない場合のLoading Screenも考えておきます。

f:id:kazuhironagai77:20210919233509p:plain

そしてLevel Of DetailのTexture GroupをUIにセットします。

f:id:kazuhironagai77:20210919233527p:plain

こんな感じです。

f:id:kazuhironagai77:20210919233619p:plain

f:id:kazuhironagai77:20210919233627p:plain

Boarder Backgroundを改良します。

f:id:kazuhironagai77:20210919233651p:plain

f:id:kazuhironagai77:20210919233703p:plain

隙間を追加します。

f:id:kazuhironagai77:20210919233757p:plain

Loading のCircular throbberをThrobberに変更しました。

f:id:kazuhironagai77:20210919233818p:plain

セリフも直しました。

f:id:kazuhironagai77:20210919234041p:plain

f:id:kazuhironagai77:20210919234049p:plain

スタート画面用のLoading Screenも作成します。

作成したんですが、表示されません。

色々調べたら以下のShow Widget Overlayにチェックを入れないと駄目みたいです。

f:id:kazuhironagai77:20210919234104p:plain

こんな感じです。

f:id:kazuhironagai77:20210919234125p:plain

6.3 Async Loading ScreenUE4.24 に追加する

作り方が分かったのでCh4_3に実装します。

f:id:kazuhironagai77:20210919234147p:plain

Async Loading ScreenをUE4.24 に追加します。

f:id:kazuhironagai77:20210919234203p:plain

Plug Inを選択してEditorを再起動します。

Startup Loading Screenから作成していきます。

f:id:kazuhironagai77:20210919234219p:plain

こんな設定にしました。

f:id:kazuhironagai77:20210919234240p:plain

f:id:kazuhironagai77:20210919234247p:plain

テストします。

f:id:kazuhironagai77:20210919234303p:plain

こんな感じです。

Default Loading Screen画面も作成します。設定は4.26で作成したのとまったく同じです。

f:id:kazuhironagai77:20210919234318p:plain

開始画面です。

f:id:kazuhironagai77:20210919234337p:plain

Default Load画面です。

f:id:kazuhironagai77:20210919234355p:plain

Open Level毎に、どちらのImageとTextを読み込むのかを指定します。

Widget BPを一個開いて、そこからOpen Level ノードを使用しているBPを検索します。

f:id:kazuhironagai77:20210919234414p:plain

これらを一個ずつ検討していきます。

<Game Over Screen Falling Widget

Game Over Screen Falling WidgetのRe-Start ボタンがクリックされた時にOpen Level ノードが呼ばれていました。

f:id:kazuhironagai77:20210919234437p:plain

これ落っこちて死亡した時にやり直す時のボタンなので、Map1からやり直すのはオカシイです。この部分は後で直します。

それは兎も角、銀河鉄道に乗る訳ではないので「赤い帽子の魔女からの手紙」のLoading Screenを表示します。

f:id:kazuhironagai77:20210919234503p:plain

勿論、以下の部分のチェックをつけます。

f:id:kazuhironagai77:20210919234525p:plain

f:id:kazuhironagai77:20210919234532p:plain

Back Start Buttonがクリックされた時もOpen Levelが呼ばれていたのでそこも直しました。

f:id:kazuhironagai77:20210919234603p:plain

<Landscape 4

これは魔物と戦闘になるときですね。

f:id:kazuhironagai77:20210919234629p:plain

取りあえず「赤い帽子の魔女からの手紙」のLoading Screenを表示しておきます。

f:id:kazuhironagai77:20210919234648p:plain

<Battle Field

これは何かのテストのために作成して忘れてしまったヤツですね。

f:id:kazuhironagai77:20210919234742p:plain

消します。

<Inn

宿屋のLevelです。

f:id:kazuhironagai77:20210919234836p:plain

宿屋も作り直す必要がありますね。今はこのままにしておいて「赤い帽子の魔女からの手紙」のLoading Screenを表示する所だけ直しておきます。

f:id:kazuhironagai77:20210919234930p:plain

<Map1

f:id:kazuhironagai77:20210919235003p:plain

これも戦闘画面に移動する時ですね。

f:id:kazuhironagai77:20210919235036p:plain

「赤い帽子の魔女からの手紙」のLoading Screenを表示するようにしました。

<Map1_Test>

f:id:kazuhironagai77:20210919235121p:plain

Map1と全く同じです。

これで全部終りな訳ありません。

Game Mode BPを開いてもう一回、Open Level ノードを検索します。

今度はこれだけ表示されました。

これって全部のBPを一辺に調べる検索方法はないんでしょうか?

必ず漏れが生まれてしまうと思います。

最後のUWSは水のサンプルのMapなので無視していいですが、残りは全部チェックする必要があります。

f:id:kazuhironagai77:20210919235209p:plain

RPG Game Instance BP

遥か昔に作成した地図を使用して別なMapにワープする機能です。

これは勿体ないのでどこかで使用出来るようにします。

今は「銀河鉄道のLoading Screen」を入れておきます。

f:id:kazuhironagai77:20210919235336p:plain

RPG Game Mode BP

これは戦闘が終わって元のMapに戻る時ですね。

f:id:kazuhironagai77:20210919235624p:plain

「赤い帽子の魔女からの手紙」のLoading Screenを表示します。

f:id:kazuhironagai77:20210919235643p:plain

これは墜落した時のLoadingです。

f:id:kazuhironagai77:20210919235704p:plain

これ専用のLoadingが必要ですね。取りあえず「赤い帽子の魔女からの手紙」のLoading Screenを表示します。

f:id:kazuhironagai77:20210919235721p:plain

<Get Item Widget

これは戦闘が終了してかつ石像が褒美をくれた後に元のLevelに戻る時に使用するやつです。

f:id:kazuhironagai77:20210919235748p:plain

取りあえず「赤い帽子の魔女からの手紙」のLoading Screenを表示します。

<W_WarpGate Widget

はい。やっと出て来ました。銀河鉄道の駅のWidgetです。

f:id:kazuhironagai77:20210919235818p:plain

銀河鉄道のLoading Screen」を表示します。

<Game Over Screen Widget

Re-Start Button を押した時です。

f:id:kazuhironagai77:20210919235927p:plain

「赤い帽子の魔女からの手紙」のLoading Screenを表示します。

こっちはスタート画面に戻る時のEventです。

f:id:kazuhironagai77:20210919235945p:plain

「赤い帽子の魔女からの手紙」のLoading Screenを表示します。

こっちはスタート画面に戻る時のEventです。

f:id:kazuhironagai77:20210920000016p:plain

<Start Menu Widget

使用してないのが残っていました。

f:id:kazuhironagai77:20210920000134p:plain

消します。

Load Buttonがクリックされた時です。

f:id:kazuhironagai77:20210920000151p:plain

これは「銀河鉄道のLoading Screen」を表示します。

Talk with Witch Widget

f:id:kazuhironagai77:20210920000216p:plain

ゲーム開始最初の場面ですね。

銀河鉄道のLoading Screen」を表示します。

<Game Over Screen Falling Widget

Game Over してRe-Startした時です。

f:id:kazuhironagai77:20210920000238p:plain

オカシイ。これは前に直したはず。

f:id:kazuhironagai77:20210920000256p:plain

こっちは直っていました。

残りは全部直っていました。

テストします。

戦闘画面です。

f:id:kazuhironagai77:20210920000313p:plain

戦闘から戻る時です。

f:id:kazuhironagai77:20210920000331p:plain

あれ。Monsterが動いていない。

f:id:kazuhironagai77:20210920000411p:plain

あ。Level BPを別なLevelから開いたときは新たにそれぞれのLevelを開いてBuildをし直す必要がありました。

まあ、テストが終わってからやります。

銀河鉄道に乗りました。

f:id:kazuhironagai77:20210920000444p:plain

銀河鉄道が表示されています。

今度は戦闘に負けてみました。

f:id:kazuhironagai77:20210920000514p:plain

今度は崖から落ちてみました。

f:id:kazuhironagai77:20210920000553p:plain

崖から落ちた時の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