UE4の勉強記録

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

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

f:id:kazuhironagai77:20210912211148p:plain

<前文>

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

<言霊信仰はアメリカにもある>

井沢元彦の逆説の日本史に出て来る言霊思想は、日本の文化を語る上で外せない重要な要素です。

簡単に言霊思想を説明すると、言葉には霊力がこもっていて声に出すとその霊力によって声に出した事が現実になる。と言う思想です。

この思想は科学的な根拠がないにも関わらず、日本のあちこちで、特に悪い意味で信仰されていてます。

例えば受験生の前では「スベル」とか「落ちる」、結婚式では「切る」「離れる」「分かれる」と言う言葉は使ってはならない。となっています。

後、病院では4の数字の病室がなかったりとかもあります。

これ、日本だけの文化と思っている日本人が多いですが、アメリカにもあります。多分ですがヨーロッパにもあります。

欧米では「Go* Damn you!」、「Oh my Go*」そしてもっとも良く聞く「Jesu*!」のような宗教関連の言葉が言霊化しているんです。

これキリスト教の人に言わせると、神の名を軽々しく呼ぶのはいけないから。と説明します。しかしそれはキリスト教を信じる人にとっての戒律で、キリスト教を信じない人には関係ない話です。しかし欧米人は色々な屁理屈をこねて日本人である私にもそういう言葉を使うなと強要して来ます。

最初、私はキリスト教原理主義を全ての人に強制するナチス的な思想の現れなのかと思ったんですが、そうじゃなかったんです。

彼らも言霊を信仰していたんです。

そういう言葉をお前が口に出すと、俺が呪われるから、絶対に言うな。と言うのが彼らの本音だったんです。

西洋人が4の数字に日本人が感じるような畏怖は感じませんが「Go*  Damn you!」には日本人が4の数字に感じるような畏怖を感じるんです。言霊の信仰する対象が違うだけで言霊思想はあるんです。

はい。

外国人が日本の結婚式に参加して「切る」「離れる」「分かれる」なんて言葉を使用したら普通の日本人なら気分悪いですよね。

もし日本人がアメリカで「Go* Damn you!」、「Oh my Go*」そしてもっとも良く聞く「Jesu*!」をTPOをわきまえずに使用したらアメリカ人も気分が悪くなります。

あなたがアメリカ人から常識があり、友人として付き合うのに相応しい相手と思われたいなら「Go* Damn you!」、「Oh my Go*」そしてもっとも良く聞く「Jesu*!」のような言葉は、空気を読んで言っても大丈夫な時だけ使用する事にしましょう。もしその微妙な空気が読めないなら、100%そういう言葉を使用しないのも一つの手ではあります。

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

<本文>

1.今週の予定

先週はやりたい事が多すぎて予定の時間を大幅にOverしても終わらなくて泣く泣く途中で止める羽目になってしまいました。

今週は先週終わらなかった個所をやっていきます。

  • Particle Systemの勉強
  • RPGの作成
    • Map1の作成
    • Loading Screenの勉強の続き
    • Good Skyの復習

2.Building advanced effects in Niagara | Unreal Engine [1]の勉強の続き

先週はSpriteを丸くする所までやったんでした。

それでは続きを始めます。とやると本質を見失ってしまいます。

先週、このTutorialを勉強し始めた理由は、これからNiagaraを勉強するに当たってCGHOW氏のTutorialとどれくらい真剣に向き合うべきなのかを決めるためでした。この結論を出すためには

  • 目的は?
  • 出来なかった事は?
  • 学んだ事は?
  • 目的は達成出来たのか?
  • Tutorial通りに作れたのか?
  • このTutorialの改善点について

についての考察が必ず必要になります。この辺をしっかりと認識しながら続きをやっていきます。

2.1 先週までの総括

先週やった範囲で上記の項目に対してどの程度の解答が得られたのかをまとめておきます。

<目的>

先週のBlogを見直すとこのTutorialを勉強する目的は「CGHOW氏のTutorialとの違いを見極める事」と書いてありました。

CGHOW氏のTutorialの作成したEffectは素晴らしいです。しかしそのTutorialはあまり生徒思いに作られておらず、勉強したからと言って理解出来るとは限りません。というか逆に訳わからなくなる可能性が高いです。

分かり易く言うと、CGHOW氏のTutorialは崖っぷちに落ちているダイヤモンドなんです。

ダイヤを拾えて返ってこれればこれ以上ない利益を得られるんですが、逆に崖に落ちたら死にます。そういうリスクがあるTutorialなんです。

ここで、ダイヤは拾えんかったけど、生きて帰っては来れた。と言う時はどう評価すべきかが今回、私が見極めたい所なんです。そのための比較対象としてEpic Games社が提供する今回のTutorialをやっている訳です。

Building advanced effects in Niagara | Unreal Engine [1] はEpic Games社が提供しているTutorialで、本当に生徒の立場に立って親切丁寧に作成されたTutorialです。

例えば、このTutorialで勉強しても目的のEffectが使えるようにならなかったら、その理由を徹底的に解明する必要があります。

その結果「UE4のVersionは同じにしないと駄目だ。」という結果が得られたらCGHOW氏のTutorialでもUEのVersionを同じにしてから勉強する事でダイヤモンドが手に入れられる可能性が高くなります。

処が、Materialの作成方法が良く分からないから同じEffectが作成出来なかったとなった場合は、一端、Effectの勉強は停止して今度はMaterialの勉強に移った方が良いと判断出来ます。

ここでですね。

Building advanced effects in Niagara | Unreal Engine [1] は完璧にEffectを再現出来たけど、CGHOW氏のTutorialは勉強しても全然同じものが作れない。となった時にどう判断すべきなのかが決まっていないんです。

その辺を見極めるのが今回の真の目的になると思います。

そして今回の小さい目的はBuilding advanced effects in Niagara | Unreal Engine [1]のEffectを完璧に再現する事です。

<出来なかった事は?>

先週の時点で、出来なかった事が既にあります。それらをまとめておきます。

<<サイズの全く違うParticleが生成される>>

Particle Spawn SectionにSphere Location Moduleを使用すると以下の様にTutorialのParticle のサイズとは全く違うサイズのParticleが生成されます。

f:id:kazuhironagai77:20210912211344p:plain

Particle Spawn Sectionに作成されているInitialize Particle Moduleの値を変更すれば同じに形状になるので、これは大した問題ではないと考えられています。

<<使用しているMaterialが違う>>

Tutorialで使用しているキャラであるCrunch

f:id:kazuhironagai77:20210912211406p:plain

現在のVersionではmaterialの設定がTutorialの時とは全く違っています。

f:id:kazuhironagai77:20210912211422p:plain

それで我流で直したんですが、

f:id:kazuhironagai77:20210912211437p:plain

こんな感じでTutorialのイメージとは結構違っています。この部分は全く出来ていません。しかしそれが最終的な結果にあんまり影響はない気もしています。

<学んだ事は?>

これは先週、全く考えていませんでした。兎に角、早く終わらせないとだけ思って何を学んだのかについては覚えていません。どんな新しいModuleを使用したのかとか、そのModuleの機能とか全く覚えていません。Blogを見直してみます。

  • Vortex Force ModuleやGravity Force ModuleをParticle Spawn Sectionにセットした場合とParticle Update Sectionにセットした場合の違いについて
  • Color ModuleのSimulation Position(Color ModuleのParameterの一つに使用)
  • Light RendererのUse Inverse Squared Falloff
  • 何でGPUによるSpriteの時はEmitterの境界を指定しないといけないのか
  • Initialize Mesh Reproduction Sprite Moduleについて
  • Update Mesh Reproduction Sprite Moduleについて
  • Materialの改良によるParticleの色付けについて
  • Spriteが常にカメラを向いている事を直すのに、Sprite Renderer ModuleのAlignmentとFacing Modeの値を以下の様に変更した事

f:id:kazuhironagai77:20210912211521p:plain

  • Spriteを丸くするために、以下のコードを実装した事。

f:id:kazuhironagai77:20210912211548p:plain

  • 更に色を表示するためにInitialize Particle ModuleのColor を黒にした事

これらの新しい事を学びました。

学んだんですが、これらが何故、このような結果を作り出すのかについては全く分かっていません。それは次の節で調べる事にします。

<目的は達成出来たのか?>

<Tutorial通りに作れたのか?>

<このTutorialの改善点について>

これらについてはTutorialが全部終わってからじゃないと出来ないのでそれからやります。

2.2 先週、新しく使用したModuleや機能についての調査や考察

この勉強を忘れていたのでこれをまずやります。

<Vortex Force ModuleやGravity Force ModuleをParticle Spawn Sectionにセットした場合とParticle Update Sectionにセットした場合の違いについて>

これは、ForceをParticle Spawn Sectionにセットした場合とParticle Update Sectionにセットした場合の違いについての考察で、先週もそれなりには、やっています。

f:id:kazuhironagai77:20210912211641p:plain

今回はGravity Force Moduleのみで検討してみます。

以下のEmitterを作成しました。

f:id:kazuhironagai77:20210912211656p:plain

ParticleにかかっているForceはParticle Update SectionにあるGravity Force Moduleのみです。

f:id:kazuhironagai77:20210912211711p:plain

見事に等加速度直線運動を行っています。

今度はGravity Force ModuleをParticle Spawn Sectionにセットしました。

Apply Initial Force Moduleが強制的に追加されました。

f:id:kazuhironagai77:20210912211726p:plain

Apply Initial Force ModuleはSolve Initial Force Moduleと同じような働きをするModuleなんでしょうか?

Apply Initial Force Moduleについては後で調べます。

結果です。

f:id:kazuhironagai77:20210912211743p:plain

今度は等速直線運動をしています。

はい。

ForceをParticle Spawn Sectionにセットした場合とParticle Update Sectionにセットした場合の違いについて完全に理解しました。

ForceをParticle Spawn Sectionにセットした場合は初速度になります。ForceをParticle Update Sectionにセットした場合、加速度になります。

Force Moduleは、やっぱりForceと言う名前とは裏腹に速度を追加しているModuleのようです。

Particle Update SectionにセットされたModuleは毎秒呼び出されます。Force Moduleも毎秒呼び出されるのでそのたびにParticleに指定された速度を追加します。その結果、加速度の値を表しているのと同じになります。

この後で、Force Moduleについての解説はないのか探したらありました。CGHOW氏のAll Forces Modules in UE4 Niagara Explained [2] です。

このTutorialは少しだけ見ましたが、かなり詳しくForce Moduleの実際の使用方法について説明していて分かり易かったです。

うーん。

やっぱりCGHOW氏のTutorialは崖にあるダイヤモンドです。無事にダイヤを取って来る事が出来ればこの上ない価値があります。

<Color ModuleのSimulation Position(Color ModuleのParameterの一つに使用)>

Edit ValueからSimulation Positionを検索するとDynamic Inputsに分類されている事が分かります。

f:id:kazuhironagai77:20210912211811p:plain

私はSimulation Position以前にこのModuleのParameterにセット出来るEdit Value自体の意味が良く分かってないんです。

f:id:kazuhironagai77:20210912211825p:plain

今回はこのEdit Valueについて調べる事にします。

中々、直で説明している解説が見つかりません。

ちょっとカスっているのか分かりませんが、公式のDocumentであるNiagara Overview [3] に以下の説明がありました。

f:id:kazuhironagai77:20210912211840p:plain

うーん。よく分からない。

gameDev Outpost 氏のTutorialにUE4 - Niagara Dynamic Inputs [4] がありました。

ぱっと見たのですが、まずModule内のParameterをVariableつまり変数と呼んでいました。

f:id:kazuhironagai77:20210912211908p:plain

これは言われてみれば当たり前ですが、何故か変数と言う言葉が出て来ませんでした。何故かと言うとその変数に値をパスしている訳で、その値をパスする行為が関数のParameterに当たっているからです。

それでピンと来ました。変数にEditorから値をパスする場合をDynamic Inputsと呼んでいるじゃないのかと。

ならば変数の値を上のModuleで使用した変数からPassする事も出来るはずです。

それがLink Inputなんじゃないでしょうか?

f:id:kazuhironagai77:20210912211923p:plain

因みにParticle Update SectionにあるColor ModuleのDistanceのLink InputのParticleを開いて見ると以下の様になっています。

f:id:kazuhironagai77:20210912211939p:plain

ここに表示されているParticle AttributeをParameterの方で見ると

f:id:kazuhironagai77:20210912211954p:plain

Float型のAttributeはSprite Rotation以外全て表示されています。変数、DistanceはFloat型なのでこれは納得です。

次のMakeは何なんでしょう?

f:id:kazuhironagai77:20210912212010p:plain

これは多分ですが、新しいAttributeをEmitterやParticleに作成してそのParticle の値を読むんじゃないでしょうか?

まあはっきり言えば分かりません。

最後の3つですが、New Scratch Dynamic Inputは意味が分かります。

f:id:kazuhironagai77:20210912212027p:plain

Dynamic Inputsを自作するためのものでしょう。

あ。

先週、勉強したこれですわ。

f:id:kazuhironagai77:20210912212045p:plain

f:id:kazuhironagai77:20210912212051p:plain

成程、Dynamic Inputsも自作出来るわけですね。

Local Valueは何なんでしょうね。このModule 内でしか使用出来ない変数なんでしょうか?

f:id:kazuhironagai77:20210912212109p:plain

適当なModuleを開いてNodeを見るとLocal Sphere Vectorと言う変数がありました。多分このTypeを作成するんでしょう。

最後のNew Expressionの意味は分かりません。

f:id:kazuhironagai77:20210912212124p:plain

ExpressionってC++の用語でしたっけ。覚えていません。

調べたらありました。Cppreference.comのExpressions [5] に詳しい解説がありました。

f:id:kazuhironagai77:20210912212140p:plain

この解説を読むと、例えば=(x+2)の様な計算とか、Printf(x)のような関数など、OperatorとOperandsがあってその指定に基づいて何かしらのComputationをすればそれはExpressionになるそうです。

多分、これを作成するんでしょう。

でもそうするとDynamic Inputsと同じになってしまいますよね。これもまだちょっと分かりませんね。

こんだけ理解出来れば、Simulation Positionの意味ももっとよく分かりますね。

もう一回調べて見ます。

Simulation PositionのNiagara Dynamic Inputs Scriptを開くと以下の様になっていました。

f:id:kazuhironagai77:20210912212157p:plain

おお。全く先週の説明文に合った通りの機能が実装されています。

Local Spaceにセットされている場合は0を返して、それ以外はPositionを返します。

Emitter PropertiesのLocal Spaceを見るとチェックされていませんでした。

f:id:kazuhironagai77:20210912212234p:plain

と言う事は、Engine Owner の変数であるPositionの値が返されていますね。

となると先週考えた通り、やっぱりこのDynamic InputsはEmitterの中心を返していると考えられますね。だって対になるStart positionにセットされているのがParticleのPositionなんですから。

最後に、最初に意味が分からないと言ったNiagara Overview [3] にある以下の説明についてもう一回考察します。

f:id:kazuhironagai77:20210912212251p:plain

<<Dynamic inputs are built the same way modules are built.>>

はい。これはもう言っている意味は明白です。

ModuleがModule Scriptで実装出来る様に

f:id:kazuhironagai77:20210912212312p:plain

Dynamic InputsもDynamic Input Scriptで実装できます。

f:id:kazuhironagai77:20210912212325p:plain

<<Dynamic inputs give users infinite extensibility for inheritance.>>

これは、抽象的な意味で言っているなら分かりますが、何かの機能を具体的に指して言っているとするとそれは分かりません。

<<Instead of acting on a parameter map, dynamic inputs act on a value type.>>

多分ですが、Parameter MapはModuleの事を指していると思われます。そこだけはちょっと曖昧です。

Value Typeは勿論、変数の型の事です。Dynamic inputsは常にある変数のTypeの値を返すと解釈出来ます。

f:id:kazuhironagai77:20210912212403p:plain

この例では、Curve IndexにDynamic InputであるNormalize Distance Rangeが使用されています。Normalize Distance RangeはStart Position とEnd Positionを指定する必要があります。このEnd Positionにもう一回Dynamic InputであるSimulation Positionを指定しています。

<Light RendererのUse Inverse Squared Falloff

Rendererは開けないし、先週まとめた以上の情報は入りそうにないです。

f:id:kazuhironagai77:20210912212426p:plain

と思ったら公式のDocumentにInverse Square Falloff [6] がありました。

f:id:kazuhironagai77:20210912212441p:plain

この解説を読むと実際の光の減衰と同じ公式を使用して計算しているようです。

<何でGPUによるSpriteの時はEmitterの境界を指定しないといけないのか>

これは先週調べました。

<Initialize Mesh Reproduction Sprite Moduleについて>

これは先週調べた以上の情報は分からなかったです。しかし公式のDocumentであるParticle Spawn Group [7]のUpdate Mesh Reproduction Sprite Moduleの項目にこのModuleの解説が書かれていたので、それについて<Update Mesh Reproduction Sprite Moduleについて>で解説します。

<Update Mesh Reproduction Sprite Moduleについて>

公式のDocumentであるParticle Spawn Group [7]のUpdate Mesh Reproduction Sprite Moduleの解説です。

f:id:kazuhironagai77:20210912212510p:plain

1と2は分かりますがそれ以外の意味は分かりません。

それよりもContent Examplesに例があると書かれています。こちらを確認してみます。

ありました。

Niagara Advanced の1.5です。

f:id:kazuhironagai77:20210912212528p:plain

中を開いて見ると

f:id:kazuhironagai77:20210912212543p:plain

Update Mesh Reproduction Sprite Moduleはありません。

f:id:kazuhironagai77:20210912212557p:plain

多分ですが、この辺のヤツが同じ働きをしているんでしょう。

f:id:kazuhironagai77:20210912212612p:plain

この二つのModuleは今の私の手に負えるものじゃないです。

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

<Materialの改良によるParticleの色付けについて>

私のVersionのCrunchのMaterialはいかのように7種類使用しています。

f:id:kazuhironagai77:20210912212633p:plain

先週、勉強したBuilding advanced effects in Niagara | Unreal Engine [1]では使用しているMaterialは一個でした。

それで、頭の部分だけ担当しているMaterial InstanceであるMIC_Crunch_Headを

f:id:kazuhironagai77:20210912212702p:plain

先週作成したM_Crunch_Parent_Niagaraを元に作成して

f:id:kazuhironagai77:20210912212716p:plain

Sprite RendererのMaterialにセットしたら

f:id:kazuhironagai77:20210912212730p:plain

頭の部分だけは綺麗に表示されるのでは?

と思い試してみました。

f:id:kazuhironagai77:20210912212747p:plain

駄目でした。

やっぱりMaterialはちょっと深くなるともう分からなくなります。

<Spriteが常にカメラを向いている事を直すのに、Sprite Renderer ModuleのAlignmentとFacing Modeの値を以下に示した値に変更した事>

f:id:kazuhironagai77:20210912212811p:plain

ここでTutorialより以下の説明がありました。

f:id:kazuhironagai77:20210912212825p:plain

この部分の意味だけは今なら分かるようになりました。

Update Mesh Reproduction Sprite Moduleで全てのMeshのNormal Vectorを計算しているはずです。その値をそのまま利用してFacing ModeでVectorに沿って整列させている訳です。

<Spriteを丸くするために何をしたのか>

この部分です。

f:id:kazuhironagai77:20210912212848p:plain

この中で意味が分からないのはDither Temporal AAだけです。

まあでも、丸くはなるでしょう。

<更に色を表示するためにInitialize Particle ModuleのColor を黒にした事>

f:id:kazuhironagai77:20210912212909p:plain

上記の図にあるParticleの値が

f:id:kazuhironagai77:20210912212923p:plain

に繋がっているからでしょう。

2.3 Building advanced effects in Niagara | Unreal Engine [1]の勉強の続き

CrunchがObjectに触ったらCrunchのMaterialが消えるようにします。

壁にぶつかったりするそうなので、Third Person CharacterのMeshをCrunchに変更しました。

f:id:kazuhironagai77:20210912212943p:plain

f:id:kazuhironagai77:20210912212950p:plain

Distance To Nearest Surfaceノードを使用するそうです。

f:id:kazuhironagai77:20210912213005p:plain

使用する箇所がCrunchのMaterial、つまりM_Crunch_Parentになります。

f:id:kazuhironagai77:20210912213020p:plain

ちょっとそのまま使用しただけでは出来ないかもしれませんね。

次にDistance To Nearest Surfaceノードを使用するためにProject SettingのRenderingのLightingにあるGenerate Mesh Distance Fieldsにチェックを入れます。

f:id:kazuhironagai77:20210912213036p:plain

Tutorialによると今度は以下の事を実装するそうです。

まず表面からの距離によってFadeさせます。次にFadeする前に黒いBandを生成します。

良く意味が分かりません。

そしたらこんな説明をしていました。

壁とCrunchの距離が50cmあるとします。そして30cmのbandと20cmのFadeが欲しかったら、50cmから30cmを引いて20cmで割ればいいだけです。

うーん。何を言っているんでしょうか?

全然分からない。

取りあえず先に進んでから考える事にします。やり方は見れば分かるので完成した状態から逆算して何が言いたかったのかを推測する事にします。

以下の実装をしました。

f:id:kazuhironagai77:20210912213051p:plain

うん。20を引いて30で割っていますね。

もう一回見直しましたが、やっぱり50cmから30cmを引いて20cmで割れと言っています。

まあ、先に進みます。

f:id:kazuhironagai77:20210912213108p:plain

今度はこれをOpacity Maskに接続します。

以下のようにして繋ぎました。

f:id:kazuhironagai77:20210912213121p:plain

更にMaterialのBlend ModeをMaskedに変更します。

f:id:kazuhironagai77:20210912213204p:plain

Imageが消えてしまいました。

f:id:kazuhironagai77:20210912213219p:plain

Tutorialではこれでテストしています。

f:id:kazuhironagai77:20210912213234p:plain

私も自分のを試してみました。

f:id:kazuhironagai77:20210912213249p:plain

おお。

Crunchの足にガラス玉が当たっていますが、足がFadeしています。

理由は良く分からないけど出来ていますね。

だけどこのやり方だと足首から下は常に消えてしまいますね。

今度は、このCrunchの表面に発生したParticleをバラバラにするそうです。

それをするためには、NS_DissolveEffectのそれぞれのParticle にバラバラに動く物理をBlendする必要があるそうです。更に、そのためには、現在どのくらいの量のParticle がDissolveしてるのかを記録するための変数が必要になるそうです。

うーん。

もう付いていけません。

言われた通りにやるだけです。

f:id:kazuhironagai77:20210912213312p:plain

Scratch Pat Moduleを作成しました。

名前をGet Level Of Dissolveに変更しました。

f:id:kazuhironagai77:20210912213327p:plain

この名前の変更方法は単にクリックするだけです、選択画面には名前を変更するはありません。

今度は表面からの距離を測ります。

それはNew Collision Queryを使用する事で可能だそうです。

f:id:kazuhironagai77:20210912213341p:plain

もう全然分かりません。

f:id:kazuhironagai77:20210912213446p:plain

そこにQuery Mesh Distance Field GPUを繋げます。

今度はVectorを追加して名前をSample Positionに変更しました。

f:id:kazuhironagai77:20210912213508p:plain

そして以下の赤で囲った部分の値を変更しました。

f:id:kazuhironagai77:20210912213523p:plain

こうする事でSample PositionのDefault値はParticleのPositionになるのでしょうか?

f:id:kazuhironagai77:20210912213538p:plain

あ。分かりました。これで表面とParticleの距離が判明したんです。

すると次にやる事は

f:id:kazuhironagai77:20210912213552p:plain

これです。

引き算して割り算です。

f:id:kazuhironagai77:20210912213605p:plain

引き算する値を追加します。Floatで作成してBiasと名付けました。

f:id:kazuhironagai77:20210912213618p:plain

更に割り算用の値も追加しました。

f:id:kazuhironagai77:20210912213632p:plain

値が0と1の間になるようにします。Scratch Pat ModuleにはSaturate ノードが無いからかClampを使用しています。

f:id:kazuhironagai77:20210912213858p:plain

今度は値を逆にするためにOne Minisノードを追加します。

f:id:kazuhironagai77:20210912213912p:plain

Out put用のfloat、Dissolve Amountを作成します。

f:id:kazuhironagai77:20210912213957p:plain

今度はName SpaceをLocalからOUTPUTに変更します。

f:id:kazuhironagai77:20210912214032p:plain

変更したらOUTPUTにMODULEも勝手に追加されました。

こんな機能があるなんて初めて知りました。

f:id:kazuhironagai77:20210912214047p:plain

この色付きの名前はName Spaceだったんですね。

後で詳しく勉強しましょう。

最後にApplyボタンを押してこのModuleを作成します。

f:id:kazuhironagai77:20210912214102p:plain

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

f:id:kazuhironagai77:20210912214116p:plain

Get Level Of Dissolve Moduleに値を追加します。

f:id:kazuhironagai77:20210912214129p:plain

これで後はこの値をBlendすれば終わりです。

まず最初に

f:id:kazuhironagai77:20210912214143p:plain

のWrite to Intrinsic Properのチェックを外します。

f:id:kazuhironagai77:20210912214158p:plain

この理由は、Solve Forces and Velocity ノードの後にUpdate Mesh Reproduction Sprite Moduleがあると

f:id:kazuhironagai77:20210912214213p:plain

Solve Forces and Velocity ノードの情報はUpdate Mesh Reproduction Sprite Moduleに上書きされてしまいます。

それを外すためにWrite to Intrinsic Properのチェックを外します。

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

f:id:kazuhironagai77:20210912214237p:plain

次にLerp Positionの値を以下の様にセットしました。

f:id:kazuhironagai77:20210912214254p:plain

何でこの値で良いのかは分かりません。一回復習しますのでその時に考えます。

今度はVelocityの値を指定します。

f:id:kazuhironagai77:20210912214315p:plain

何でこの値を選択したのかは後で考えます。

最後にVortex Velocityを追加します。

f:id:kazuhironagai77:20210912214348p:plain

f:id:kazuhironagai77:20210912214353p:plain

これで完成だそうです。

テストしてみます。

f:id:kazuhironagai77:20210912214410p:plain

おお、壁にぶつかった場所がParticle化して空中に舞っています。

凄いです。

Tutorialの残りを見てたらもう一個Moduleを追加していました。

終りじゃなかったです。

Color Moduleを追加しました。

f:id:kazuhironagai77:20210912214428p:plain

Testします。

Particleが光っています。

f:id:kazuhironagai77:20210912214444p:plain

少しだけ微調整します。

f:id:kazuhironagai77:20210912214500p:plain

発光している部分の幅が狭くなりました。

f:id:kazuhironagai77:20210912214517p:plain

これでBuilding advanced effects in Niagara | Unreal Engine [1]の勉強は終わりました。

2.4 Building advanced effects in Niagara | Unreal Engine [1]の総括

もう頭が一杯で何も考えられません。来週、気持ちが落ち着いたら後半部分の復習と全部の総括を行います。

3.Cascade: 先々週の続き

先週、時間がなくてCascadeの勉強は出来ませんでした。2021-08-30のブログで勉強した続きをやっていきます。

CGHOW氏のUnreal Engine Skull Aura Tutorial | Download Project Files [8] を途中まで勉強しました。

f:id:kazuhironagai77:20210912214549p:plain

今週は残りをやります。

3.1 2021-08-30のブログの復習

もう何を勉強したのか忘れてしまったので2021-08-30のブログで復習をします。

<骸骨を回転させる>

2021-08-30のブログは、区切り良くまとまってないので、勝手に区切ってまとめます。

最初の区分は、髑髏を回転させる所です。

f:id:kazuhironagai77:20210912214705g:plain

Initial Velocity ModuleでLocked Axesの値をXYZに固定し

f:id:kazuhironagai77:20210912214734p:plain

かつVelocity/Life ModuleのVelocity Over Lifeの値を以下の様にセットして骸骨を回転させています。

f:id:kazuhironagai77:20210912214749p:plain

次にRequired ModuleのScreen Alignmentの値をPSA Velocityに変更する事で、骸骨の向きが前を向くように調節しています。

f:id:kazuhironagai77:20210912214804p:plain

ただし骸骨が一瞬だけ横を向くバグが発生しています。

そして色々検討しているんですがその原因が分かっていないです。

<骸骨を光らせる>

以下の図の様に骸骨を光らせます。

f:id:kazuhironagai77:20210912214822p:plain

正し、この図の骸骨はCGHOW氏が作成したものです。

私が出来たのは以下の骸骨です。

f:id:kazuhironagai77:20210912214838p:plain

この違いは使用したMeshの違いのせいです。使用するMeshの違いによってもこんなに違う結果が生まれるとは驚きでした。

<専用のMaterialを作成する>

光る骸骨のための専用のMaterialを作成しました。

f:id:kazuhironagai77:20210912214858p:plain

そこではFresnel関数が使用されています。

Fresnel関数については以下の事を勉強しました。

Fresnel関数にはBase Reflect FractionとExponentInの二つのParameterがあります。

ExponentInは外円の大きさを管理しています。

ExponentIn = 10、

f:id:kazuhironagai77:20210912214913p:plain

ExponentIn = 5、

f:id:kazuhironagai77:20210912214928p:plain

ExponentIn = 1

f:id:kazuhironagai77:20210912214942p:plain

となっています。

Base Reflect Fractionは内円の色の濃さを管理しています。

Base Reflect Fraction = 0

f:id:kazuhironagai77:20210912214956p:plain

Base Reflect Fraction = 0.01

f:id:kazuhironagai77:20210912215011p:plain

Base Reflect Fraction = 0.04

f:id:kazuhironagai77:20210912215049p:plain

となっています。Base Reflect Fractionの値の範囲は0から0.04位が適切な値でとても小さい値の変化で内円の色が物凄く濃くなります。

3.2 Unreal Engine Skull Aura Tutorial | Download Project Files [8] の続きを勉強する

<Shock Wave Effect

今度は以下に示したようなShock Wave Effectを作成します。

f:id:kazuhironagai77:20210912215116p:plain

使用するMaterialを以下の様に作成しました。

f:id:kazuhironagai77:20210912215132p:plain

こんなイメージです。

f:id:kazuhironagai77:20210912215151p:plain

何故か端が切れています。

Materialを読むと以下の部分でTexCoord[1]に値を足しているからTextureがずれるのは当然です。

f:id:kazuhironagai77:20210912215214p:plain

Textureの白い部分を縮小しました。

f:id:kazuhironagai77:20210912215228p:plain

端が切れなくなりました。

f:id:kazuhironagai77:20210912215243p:plain

ここからTutorialはほとんど説明しないで以下の形になったと言っています。

f:id:kazuhironagai77:20210912215256p:plain

しょうがないので色々数値を弄って以下の物を作成しました。

f:id:kazuhironagai77:20210912215310p:plain

こんな感じです。

f:id:kazuhironagai77:20210912215331p:plain

CGHOW氏の作成したTrailは線がとても細いんです。何をやっても回転を加えると私のは太くなってしまいます。

Tutorialでは紫色に代えていますが、ここはスキップしておきます。

<骸骨から出る粒々のEffectの作成>

今度は骸骨から出る粒々を再現します。

f:id:kazuhironagai77:20210912215425p:plain

以下のWidgetを使用しました。

f:id:kazuhironagai77:20210912215452p:plain

f:id:kazuhironagai77:20210912215458p:plain

f:id:kazuhironagai77:20210912215505p:plain

f:id:kazuhironagai77:20210912215511p:plain

これらの機能については後で調べます。

f:id:kazuhironagai77:20210912215526p:plain

実際のLevelではこんな感じです。

f:id:kazuhironagai77:20210912215545p:plain

うーん。綺麗ですね。

<Light Effectを骸骨に追加する>

今度は骸骨にLightを追加します。

f:id:kazuhironagai77:20210912215603p:plain

床が光るようになりました。

f:id:kazuhironagai77:20210912215616p:plain

因みにPreviewではこんな感じです。

f:id:kazuhironagai77:20210912215632p:plain

これはNiagaraのLight Renderingと同じEffectですね。

<Smoke Effectの追加>

今度はSmokeを追加します。

f:id:kazuhironagai77:20210912215654p:plain

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

Smokeに関しては十分勉強したのでここでは結果のみ示します。

<Monsterに蛍光色をつける>

これはスキップします。

<Rayを作成します>

以下の様なRayを追加します。

f:id:kazuhironagai77:20210912215715p:plain

これには以下の様なMeshを使用しているので今回はパスします。

f:id:kazuhironagai77:20210912215729p:plain

<Ring を追加します>

こんな感じのヤツです。

f:id:kazuhironagai77:20210912215749p:plain

この辺から気力が尽きてしまいました。

残りはまた来週やります。

4.Map1の作成

今までは、ゲームの機能を作成するために色々なActorを無差別に配置していましたが、先週、とうとうMap1がGame用、Map1_Testがテスト用に分割出来ました。今週はMap1を整理します。

そこで今週はMap1のLevel Designを行います。

こんな感じで要らないActorは全て排除しました。

f:id:kazuhironagai77:20210912215813p:plain

まず壁から直していきます。

f:id:kazuhironagai77:20210912215829p:plain

f:id:kazuhironagai77:20210912215838p:plain

f:id:kazuhironagai77:20210912215847p:plain

f:id:kazuhironagai77:20210912215855p:plain

f:id:kazuhironagai77:20210912215904p:plain

こんな感じです。

後、何をすべきなのかが分かりません。

木を加えて、簡易的な神殿めいた物を作成しました。

f:id:kazuhironagai77:20210912215933p:plain

更にNPCを一体配置します。

f:id:kazuhironagai77:20210912215947p:plain

そのNPC用のセリフを考えます。

f:id:kazuhironagai77:20210912220011p:plain

まだ途中ですが先に、このセリフを表示出来るようにします。

EnumのVillage NameにTutorial Nameを追加します。

f:id:kazuhironagai77:20210912220026p:plain

Headman Welcome WidgetのConversation Start EventのSwitch on Village NameのTutorial Villageに追加の実装をします。

f:id:kazuhironagai77:20210912220041p:plain

ここで先程作成したNPC用のセリフを読みこみます。

f:id:kazuhironagai77:20210912220108p:plain

これでいけるはずです。

テストします。

f:id:kazuhironagai77:20210912220128p:plain

f:id:kazuhironagai77:20210912220137p:plain

出来ていますね。

それではセリフを直していきます。

f:id:kazuhironagai77:20210912220154p:plain

全部の会話に対応出来るようにしました。

5.Characterの変更

今度はCharacterを変更しようと思います。

f:id:kazuhironagai77:20210912220217p:plain

2021-08-30のブログで述べていますが、

f:id:kazuhironagai77:20210912220231p:plain

たまたま半額セールしていたので買ってしまいました。

そしたらAnimationはついていませんでした。

後でTechnical Detailを読み直したら、

f:id:kazuhironagai77:20210912220255p:plain

と書かれていました。

Epic SkeletonにScaledはOKですがRiggedは駄目ってどういう意味なんでしょうか?

分からないのでSkeleton Assets: Anim Retargeting Different Skeletons | 03 | v4.8 Tutorial Series | Unreal Engine [9] で行われている方法でやってみます。

UE4_Mannequin_SkeletonのRetargeting Managerを開きSet up RigのSelect Rig にHumanoidを選択します。

f:id:kazuhironagai77:20210912220309p:plain

そしたらSaveしろとMessageが表示されます。

Tutorialによると以下のSaveを押せばいいそうです。

f:id:kazuhironagai77:20210912220333p:plain

押しました。

今度は、SK_Character_Fantasy_Skeletonを開いて

f:id:kazuhironagai77:20210912220348p:plain

Retargeting ManagerのSet up Rigを見ると

f:id:kazuhironagai77:20210912220407p:plain

全く同じ名称で1:1 で対応していました。

これは活けそうです。

ここでもSaveをします。

今度は

f:id:kazuhironagai77:20210912220427p:plain

を選んでRetarget Anim Assets を行います。

f:id:kazuhironagai77:20210912220442p:plain

あれ、Fantasy_Skeletonの方のMeshが表示されませんね。

SK_Character_Fantasy_Skeletonのこのイメージより

f:id:kazuhironagai77:20210912220458p:plain

Tポーズをしていると仮定して先に進みます。

UE4_Mannequin_SkeletonのポーズもTポーズに変更します。

f:id:kazuhironagai77:20210912220513p:plain

ここでSaveしろとTutorialでは言っていますが私のManage Retargeted Base PoseにはSaveボタンがありません。

f:id:kazuhironagai77:20210912220554p:plain

良く分からないですが、Select SkeletonのUE4_Mannequin_SkeletonのポーズもTポーズになったのでOKとします。

f:id:kazuhironagai77:20210912220610p:plain

何でTargetにFantasy_SkeletonのMeshが写らないんでしょうか?

一応、UE4Editorを再起動したんですが、変わりません。

これでRetargetをやってみます。

f:id:kazuhironagai77:20210912220624p:plain

出来ています。

NPC_PersonのAnimationの設定を以下の様に入れ替えると

f:id:kazuhironagai77:20210912220651p:plain

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

f:id:kazuhironagai77:20210912220709p:plain

王様、小っちゃい。

王様のサイズを1.5倍にしました。

f:id:kazuhironagai77:20210912220723p:plain

今度は王様、明後日の方を見ています。

王様の身長は変えずに横と縦だけ2倍にしてみました。

f:id:kazuhironagai77:20210912220742p:plain

今度はイイ感じです。

よく見るとやっぱりおかしいですが、まあ自分でモデルを作成する事は出来ないのである程度の所で妥協するしかありません。

6.Loading Screenの勉強の続き

6.1 先週までの流れ

新しいMapを読み込んでいる間に銀河鉄道内で会話をしている機能をRPGに追加したかったのでBackgroundでLevelをLoadする方法を調査していました。

その結果

  • UE4C++からBackgroundLoadする方法。
  • Load Stream Level ノードを使用する方法
  • Plug inであるAsync Loading Screenを使用する方法

の3つの方法がある事が分かりました。

最初のUE4C++からやる方法はAsync Loading Screens and Transition Levels | Unreal Fest Europe 2019 | Unreal Engine [10]で勉強しました。勉強の内容は2021-08-16のブログ2021-08-23のブログにまとめてあります。これは講演の内容を理解しただけで実際に自分で試してはいません。

次のLoad Stream Level ノードを使用する方法は、巨大なMapを複数のSub Levelに分割して作成してSeamlessに呼び込む場合でしかLoad Stream Level ノードの使用方法や機能の説明がなかったので、まずその場合におけるLoad Stream Level ノードの使用方法や機能の説明を勉強しました。

Load Stream Level ノードについて完全に理解したのでLoad Stream Level ノードを使用してLoading Screenを作成する方法をMathew Wadstein氏の HTF do I? Loading Screens using Level Streaming in Unreal Engine 4 [11] で勉強しました。

意外にこのTutorialが複雑で最後まで終わりませんでした。

今週はこのTutorialの続きからやっていきます。

6.2 HTF do I? Loading Screens using Level Streaming in Unreal Engine 4 [11]の復習

先週、勉強した内容をほとんど覚えていないので先週のブログを見ながらの復習からやります。

  • 準備編:Start ButtonのあるWidgetまでの作成
  • 本編:Start Buttonの実装
  • 本編2:Interfaceの追加によるEventの作成
  • 本編3:InterfaceからのEventを使用する事で、LevelWidget間の連絡が出来る様にする
  • 本編4:Event Load Next Streaming Levelの実装
  • 本編5:Animated Loading Loading ScreenEvent Load Loading Screenの実装

思い出してきました。Stream LevelのEventを、InterfaceをImplementする事で作成すると、そのEventはWidgetから呼び出せるようになるんでした。

f:id:kazuhironagai77:20210912220927p:plain

思い出しました。

今度、Animated Loading Map1を作成するんでした。

<Animated Loading Map1の作成>

Animated Loading Map1を作成する前に以下のActorをAnimated Loading Pers Levelに追加しました。

f:id:kazuhironagai77:20210912220950p:plain

Animated Loading Map1をStream Levelとして作成しました。

f:id:kazuhironagai77:20210912221003p:plain

Animated Loading Map1に赤いBlockを追加しました。

f:id:kazuhironagai77:20210912221017p:plain

Source CodeのAnimated Loading Map1を見ると単にPlayer が操作するキャラを生成しているだけです。

f:id:kazuhironagai77:20210912221033p:plain

Third Person Characterが生成される私のProjectは実装する必要はないです。

テストします。

UMG Splash Screen widgetが表示されます。

f:id:kazuhironagai77:20210912221053p:plain

本当のGameで言えばイントロ部分に当たるのでしょうか?

次にMain Menuが表示されます。

f:id:kazuhironagai77:20210912221116p:plain

ここでStart Gameを選択します。

するとLoading Screenが現れます。

f:id:kazuhironagai77:20210912221129p:plain

この時にBackgroundでAnimated Loading Map1がLoadされているはずです。

Animated Loading Map1のLoadが終わるとPersistent Level + Animated Loading Map1が表示されました。

f:id:kazuhironagai77:20210912221143p:plain

一応これで、Loading Screenを実行中にBackgroundでLevelをLoadする方法は分かりました。

6.3 Load Stream Level ノードを使用してLoading Screenを作成する方法のまとめ

理解するために全部やりましたが、結論はLoading Screen をWidgetで表示して

f:id:kazuhironagai77:20210912221206p:plain

その間にLoad Stream LevelノードでStream Levelを読み込むだけでした。

f:id:kazuhironagai77:20210912221221p:plain

はい。

6.4 Load Stream Level ノードを使用してLoading Screenを作成する方法の問題点と応用

この勉強をするまでStream Levelの存在自体、知らなかったです。その事とその使用方法について勉強出来た事は良かったですが、これでLoad出来るのはSub Levelだけです。全く別なLevelをLoadする時にこの方法が使用出来ない事も確認出来ました。

つまり私の「銀河鉄道に乗車中にBackgroundで次のLevelをLoadする。」事には、この方法は使えない訳です。

うーん。

しかし、Stream Levelの存在とその使用方法を学べたことはこれからのGame制作にかなり役に立ちます。

Landscape4で出現するMonsterを区域毎に分けて出現するやり方は実装するのに結構手間がかかりました。でもこれをStream Levelを使用して実装したら凄く簡単に出来たと思います。

7.  How To Make A Loading Screen In 5 Minutes Unreal Engine 4 Tutorial [12]を勉強する

7.1 How To Make A Loading Screen In 5 Minutes Unreal Engine 4 Tutorial [12] の概要を調べる

やっと最後のLoading Screenの作成方法であるPlug inを使用する方法まで来ました。以下のplug inを使用するそうです。

f:id:kazuhironagai77:20210912221315p:plain

まずは How To Make A Loading Screen In 5 Minutes Unreal Engine 4 Tutorial [12]を軽く見てみます。

Open Level ノードを使用しています。これでもAsync Loadingになるんでしょうか?

f:id:kazuhironagai77:20210912221329p:plain

Loading Screenに映像を使用するんでしょうか?Mp3 fileも手動でImportしています。

f:id:kazuhironagai77:20210912221343p:plain

Project SettingからAsync Loading Screenを選択しています。

f:id:kazuhironagai77:20210912221357p:plain

これって元からある機能なんでしょうか?それともAsync Loading Screen を使用した結果、使用出来るようになったんでしょうか?

最初に2秒くらいの映像が流れました。これが先程、手動でImportした映像のようです。

f:id:kazuhironagai77:20210912221411p:plain

Play画面が出た後、次のLevelに移動しました。

f:id:kazuhironagai77:20210912221425p:plain

Open Levelで新しいMapを読み込んでいる時に以下のイメージが表示されています。

f:id:kazuhironagai77:20210912221441p:plain

成程、AsyncしてLoading しています。

パラッと見た限りですが、Stream Levelではなく全く別のLevelをBackgroundでLoad出来るみたいですね。

7.2 How To Make A Loading Screen In 5 Minutes Unreal Engine 4 Tutorial [12] をやってみる

凄い簡単そうなので実際にやってみます。

取りあえず2つのMapを作成しました。

f:id:kazuhironagai77:20210912221500p:plain

f:id:kazuhironagai77:20210912221507p:plain

この2つはそれぞれ独立したMapです。

Tigger Boxを配置してその中に入ると反対のMapをLoadするようにします。

f:id:kazuhironagai77:20210912221522p:plain

勿論、使用しているNodeはOpen Levelです。

実際にPlayしてみるとこんな感じです。

f:id:kazuhironagai77:20210912221536p:plain

f:id:kazuhironagai77:20210912221544p:plain

ここに先程のPlug inを入れてテストしてみます。

あ、そうだ。

先程述べたProject SettingのAsync Loading Screenを調べておきます。

f:id:kazuhironagai77:20210912221559p:plain

やっぱりないですね。これはPlug inを入れたら表示されるようです。

f:id:kazuhironagai77:20210912221613p:plain

<Async Loading ScreenをImportする>

Market PlaceからAsync Loading Screenを手に入れます。

f:id:kazuhironagai77:20210912221631p:plain

うーん。

これはEngineにInstallするタイプなのか。

f:id:kazuhironagai77:20210912221701p:plain

4.26にInstallしました。

4.26のPlug inを開いてAsync Loading ScreenをEnabledにします。

f:id:kazuhironagai77:20210912221716p:plain

UE4Editorを再起動させます。

Project Setting のGame欄にAsync Loading Screenが新しく表示されました。

f:id:kazuhironagai77:20210912221730p:plain

<Async Loading Screenを使用してBackgroundでLevelをLoadする>

How To Make A Loading Screen In 5 Minutes Unreal Engine 4 Tutorial [12]の1.45分辺りを参考にしてImageをImportします。

Loading Screen用にImageを4つImportしました。

f:id:kazuhironagai77:20210912221748p:plain

Moveは無視して先に進みます。適切なMP3 fileが無いです。

多分なくても出来るでしょう。

Project SettingのAsync Loading Screenを開きます。

f:id:kazuhironagai77:20210912221802p:plain

こんな感じです。

f:id:kazuhironagai77:20210912221816p:plain

General欄から見て行きます。

f:id:kazuhironagai77:20210912221831p:plain

Startup Loading Screenはゲームが開始された時だけ流れるLoad画面だそうです。

f:id:kazuhironagai77:20210912221847p:plain

Default Loading Screenは新しいLevelがLoadされるたびに流れるLoad画面だそうです。

f:id:kazuhironagai77:20210912221900p:plain

今回はDefault Loading Screenの使用方法さえ分かれば十分です。

BackgroundのImageに先程ImportしたImageをセットしました。

f:id:kazuhironagai77:20210912221919p:plain

今度はTip WidgetのTip Textに文字を追加しました。

f:id:kazuhironagai77:20210912221932p:plain

これも表示されるのでしょうか?

興味深いです。

TutorialではLoading WidgetのLoading Icon TypeをCircular ThrobberからImage Sequenceに変更していますが私はこれでいいです。

f:id:kazuhironagai77:20210912221948p:plain

今度はLay outの設定です。

Tutorialでは下のBorder Backgroundの色を変えていますが、取りあえずはこのままで行きます。

f:id:kazuhironagai77:20210912222018p:plain

最後にMinimum Loading Screen Display Timeの値を5秒に変更します。

f:id:kazuhironagai77:20210912222032p:plain

これで設定は終りみたいです。

テストしようとしたら、TutorialでStand Alone Gameの時しか機能しないと言っています。

f:id:kazuhironagai77:20210912222054p:plain

はい。

それではテストします。

<Async Loading Screenのテスト>

Gameを開始したら以下の画面が現れました。Startup Loading Screenで何も指定していない時はDefault Loading Screenが呼ばれるようです。

f:id:kazuhironagai77:20210912222113p:plain

文字もCircular Throbberも見えません。Backgroundの色のせいでしょうか?

Game Play画面になりました。

f:id:kazuhironagai77:20210912222127p:plain

次のLevelに移動します。

Loading Screenが表示されました。

f:id:kazuhironagai77:20210912222141p:plain

これも文字もCircular Throbberも見えません。

Border Backgroundの色をオレンジに変えました。

f:id:kazuhironagai77:20210912222155p:plain

もう一回テストします。

f:id:kazuhironagai77:20210912222207p:plain

今度は文字もCircular Throbberも読めます。

出来ていますね。

うん。しかも凄い簡単ですね。

7.3 Async Loading Screenの機能を色々試す

色々弄ったんすがこれぐらいしか変化しないです。

f:id:kazuhironagai77:20210912222226p:plain

あんまり自由度がないのかなと思っていたら、こんな項目がありました。

f:id:kazuhironagai77:20210912222242p:plain

んー。

成程。色んなLayoutが選べるわけですね。

f:id:kazuhironagai77:20210912222259p:plain

Async Loading ScreenのDocument [13]を一寸だけ読む>

Documentにもっと詳しい解説が書かれているはず。

と探したらここにDocumentがあるそうです。

f:id:kazuhironagai77:20210912222319p:plain

見るとLayoutの項目が有り詳しく解説してありました。

f:id:kazuhironagai77:20210912222332p:plain

このDual Slide Layoutが格好良いです。

f:id:kazuhironagai77:20210912222348p:plain

話は飛びますが、Source Codeも全部公開してありました。

f:id:kazuhironagai77:20210912222401p:plain

Dual Slide Layoutを試した後でSource Codeも見てみます。

<Dual Slide Layoutを試す>

f:id:kazuhironagai77:20210912222504p:plain

にして色だけ変えてみました。

f:id:kazuhironagai77:20210912222517p:plain

テストします。

f:id:kazuhironagai77:20210912222532p:plain

サンプルの映像を見ると

  • Backgroundは半透明
  • Circular ThrobberLoadingは垂直に並んでいる。
  • I am loading screen2行以上に分けれるはず。

これを試してみます。

Tip TextにCtl+Shfitで行替えをして文字を追加しました。

f:id:kazuhironagai77:20210912222555p:plain

Background Imageを半透明にするのはそのまんまαの値を下げました。

f:id:kazuhironagai77:20210912222616p:plain

Circular ThrobberとLoadingを垂直に並べるのはLoading WidgetにあるLoading Widget TypeをVerticalにセットしてみます。

f:id:kazuhironagai77:20210912222632p:plain

はい。

f:id:kazuhironagai77:20210912222644p:plain

Circular ThrobberとLoadingは垂直に並びましたが、サンプルの絵と逆ですね。

以下のチェックを外してみます。

f:id:kazuhironagai77:20210912222659p:plain

お、Circular ThrobberとLoadingの位置が逆になりました。

f:id:kazuhironagai77:20210912222713p:plain

大体の操作の仕方は分かりましたね。

7.4 Async Loading ScreenのDocument [13]を読む

まずAboutが明瞭です。

  • Level間の移動中にUser Widget は破壊される。
  • LevelLoadMain Threadで行われLoad中は何も出来ない。
  • Level Streamingは別のGame ModePlayer Controllerを使用したLevel間では使用出来ない
  • Level Streamingを使用しない場合は、C++を使用する必要がある。
  • しかしC++の使用はDesignerには難しい。
  • 更にSlateフレームワークEngineModuleの理解が必要。

はい。

今まで勉強した内容がギュッと凝縮されています。

それじゃ少しだけCodeを見て行きます。

PrivateDependencyModuleNames.AddRange()にSlateとSlateCoreが使用されています。

f:id:kazuhironagai77:20210912222746p:plain

Hファイルはこんな感じになってました。

f:id:kazuhironagai77:20210912222802p:plain

Background WidgetとかDual Sidebar Layoutのようにそれぞれのクラスが何を担当しているのか位はこれ見ただけでも分かります。

SBackgroundWidget.h を見てみます。

f:id:kazuhironagai77:20210912222817p:plain

SCompoundWidgetを継承していますね。

2021-08-23のブログを見るとAction RPGRPG Loading ScreenでもSCompoundWidgetを継承しています。

f:id:kazuhironagai77:20210912222831p:plain

うーん。

Github上でコードを追っていくのは非常にムズイ。

今回の目的はUE4C++でLoading Screenを作成する事ではないので、あんまり深入りしない方がいいかもしれません。時間も無くなって来たのでこの辺で中止します。

8.Good Skyの復習

もう時間がないので今週も延期です。

9.まとめと感想

今週はそれぞれの課題で壁にぶつかった時にすぐにあきらめてしまっています。

何ででしょう?やる気がちょっと足りなかったんでしょうか?まあ何時でも絶好調ではいられないのでしょうがないのかもしれませんね。

10.参照(Reference

[1] Epic Games [Unreal Engine]. (2020, May 27). Building advanced effects in Niagara | Unreal Engine [Video]. YouTube. https://www.youtube.com/watch?v=syVSRDQxrZU

[2] CGHOW. (2021, March 19). All Forces Modules in UE4 Niagara Explained [Video]. YouTube. https://www.youtube.com/watch?v=iW867tJ93lU

[3] Epic Games. (n.d.-b). Niagara Overview. Unreal Engine Documentation. Retrieved September 12, 2021, from https://docs.unrealengine.com/4.26/en-US/RenderingAndGraphics/Niagara/Overview/

[4] gameDev Outpost. (2020, September 15). UE4 - Niagara Dynamic Inputs [Video]. YouTube. https://www.youtube.com/watch?v=utsXM2LGvPY

[5] cppreference.com. (n.d.). Expressions - cppreference.com. Retrieved September 12, 2021, from https://en.cppreference.com/w/cpp/language/expressions

[6] Epic Games. (n.d.-a). 4.2 - Inverse Square Falloff. Unreal Engine Documentation. Retrieved September 12, 2021, from https://docs.unrealengine.com/4.26/en-US/Resources/ContentExamples/Lighting/4_2/

[7] Epic Games. (n.d.-c). Particle Spawn Group. Unreal Engine Documentation. Retrieved September 12, 2021, from https://docs.unrealengine.com/4.26/en-US/RenderingAndGraphics/Niagara/EmitterReference/ParticleSpawn/

[8] CGHOW. (2019, January 6). Unreal Engine Skull Aura Tutorial | Download Project Files [Video]. YouTube. https://www.youtube.com/watch?v=V5u4iogpmQE&list=PLwMiBtF6WzsqXWJF-pjjkovVZM-04lzt_&index=2

[9] Epic Games [Unreal Engine]. (2015, September 28). Skeleton Assets: Anim Retargeting Different Skeletons | 03 | v4.8 Tutorial Series | Unreal Engine [Video]. YouTube. https://www.youtube.com/watch?v=xy9aLbZLdeA

[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] Wadstein, M. [Mathew Wadstein]. (2015, October 31). HTF do I? Loading Screens using Level Streaming in Unreal Engine 4 [Video]. YouTube. https://www.youtube.com/watch?v=QJVn2mW67YQ

[12] Uisco. (2021, March 3). How To Make A Loading Screen In 5 Minutes Unreal Engine 4 Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=KpXmcqSITOg

[13] Bui, T. (n.d.). GitHub - truong-bui/AsyncLoadingScreen: Async Loading Screen. GitHub. Retrieved September 12, 2021, from https://github.com/truong-bui/AsyncLoadingScreen