UE4の勉強記録

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

「Unreal Engine 4.xを使用してRPGを作成する」の足りない部分を作成する Map1の複製の作成など

f:id:kazuhironagai77:20210830001334p:plain

<前文>

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

<専門家や上司に対する考え方の違い>

これはキリスト教でもプロテスタントが主流のアメリカ特有の話なのかもしれませんが、アメリカ人は専門家の話を信用しません。自分がどう思うかが重要でその判断を下すのに専門家の意見は参考、あくまで参考にしますが、頭ごなしに信用する事は絶対にありません。

大多数の常識のある日本人が専門家の意見を自分の考えより優先させるのと対照的です。

先週話した通り、アメリカを含めたキリスト教文化圏の教育システムは、質問、考える(調べる)、回答、で組み立てられてます。

この考えた結果の回答が、質問した司祭が用意していた回答と違っていた事から喧嘩になって、戦争になって最終的には、国を追い出されてアメリカと言う壮大な国が建国される羽目になったわけです。

それがみんなが良く言う「元々、プロテスタントの人達は、カソリックの司祭の言う事に対して、盲目的に聞く事を良しとせず、納得いく答えを貰うまで抗議したが、最終的には国を追い出されて住む場所がなくなって仕方なくアメリカ大陸に移民したのが始まりです。」な訳です。

だからアメリカ人は、少なくとも私が会った全てのアメリカ人がそうだったですが、絶対に自説を曲げません。そして自分の思った正しい事を実行します。子供でも老人でも例外はありません。

「自分では悪いと思っても会社の命令なので…」なんて考えるアメリカ人は(少なくとも私が会った全てのアメリカ人に関しては)絶対にありません。

日本人にはにわかには信じがたい話ですが、そうなんです。

そしてここからが大切な話になります。

大多数の日本人が、私が今した話が信じられないように、アメリカ人もまた「自分では悪いと思っても会社の命令なので…」と考える人がいるなんて信じられないんです。

最近のコロナに関しても日本のコロナの専門家で世界の大多数の専門家の意見と180°反対の意見を言っている人達がいましたが、アメリカ人はそんな専門家がいる事自体はまあ信じられるんですが「専門家が言ったから、自分では間違っていると思ったけど聞くしかなかった。」と考える人がいる事は絶対に信じられません。

喫煙なんか特にそうです。

ここまで書いて、専門家の意見と会社や上司の意見がゴッチャになってしまっている事に気が付きましたが、言わんとする事は一緒で、自分の意思より優先する他人の意見が存在するか否かです。

アメリカで、絶体絶命な事態になった時に「上司に言われたからそうした。」とか「専門家がしろと言った。」という言い訳はあまり通じません。と言うか日本人がそこから感じる深刻さは全くアメリカ人には理解出来ません。

此処まで説明した通り、アメリカ人には「自分では悪いと思っても会社の命令なので…」と言う発想がないからです。

じゃどうすれは、アメリカ人に「自分は悪くないのに上司や専門家によって強制されてやらされているだ。」っと暗にほのめかす事が出来るのかと言う事ですが、

まず「法律で決まってる。」と主張する事です。

法律で定められていたら「この人は悪くないけど強制されているんだ。」感がアメリカ人にもぐっと伝わります。

でもそんなに都合のよい法律なんでないですよね。

で次の策ですが「(不本意ながら)契約があるのでやらざる得なかった。」です。

これはどんな場面でも言えて「この人は悪くないけど強制されているんだ。」感はぐっと広がります。

はい。

「何でそんな事をしたんですか?」とアメリカ人から尋問される窮地に陥った場合「上司に言われたからそうした。」とか「専門家がしろと言った。」と心に浮かんだらそれをそのまま言うのはちょっと待って下さい。

そして私がここに書いている内容を思い出して「法律で決まってる。」もしくは「契約があるのでやらざる得なかった。」と言い換える事にしましょう。

そうする事で貴方を尋問しているアメリカ人たちも貴方の置かれた立場は複雑で本当のBad guyは別にいる事が何となく理解出来るはずです。

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

<本文>

1. 今週の予定

今週は以下の事をやっていきます。

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

2.Niagara の勉強

今週は何を勉強するのか、まだ決めていません。

2.1 CGHOW氏のTutorial [1]をみる

CGHOW氏のTutorial [1]をみたら沢山のシリーズがありました。

f:id:kazuhironagai77:20210830001534p:plain

先週、勉強したのは以下のTutorialシリーズに含まれるもので、他のTutorialシリーズとどう違うのかが良く分かりません。

f:id:kazuhironagai77:20210830001602p:plain

それぞれのTutorialシリーズがどんな内容なのかを軽く調べる事にします。

For Patreon

これはCGHOW氏をPatreonで支援している人達のために作成されたTutorialのシリーズのようです。

f:id:kazuhironagai77:20210830001622p:plain

Patreonってずっとパトロンの英語名だと思っていたんですが、パトロンの英語はPatronでした。

Patreonのメンバーになるための会費はいくらなのかも一応調べておきます。

f:id:kazuhironagai77:20210830001649p:plain

一番安いのはひと月5$で一番高いのでも20$ですね。

UEのVFXの専門家になる人は絶対勉強すべきですが、私はどうしましょう。

取りあえずはFreeの教材だけで勉強します。

UE4 HLSL

f:id:kazuhironagai77:20210830001718p:plain

一番最初のTutorialをみると、HLSLの基本をUE5 のNiagaraを使用して作成する方法を教えるTutorialだそうです。ここではUE4と書かれていますが、UE5と言っていますね。

大変興味深いです。

最初にShadertoy [2]と言う名前のサイトの紹介がありました。

f:id:kazuhironagai77:20210830001741p:plain

何これ。初めて知りました。

ここに自分で作成したShaderを載せる事が出来るんでしょうか?

これは後で読んで置く事にします。

同じような別のサイトも紹介されていました。こちらはvertexshaderart.com [3]と言う名前のサイトです。

f:id:kazuhironagai77:20210830001756p:plain

こんなサイトが有ったんですね。

ひょっとして日本語でも同様のサイトがあるんでしょうか?

探したらありそうですね。

WebGLが生まれてもう10年経ったんでしたっけ。こんな所で花を咲かせていたんですね。感動です。

一番最初のTutorialをもう少しだけみると以下に示したCustom Hlslノードの使用方法についての解説をしています。

f:id:kazuhironagai77:20210830001812p:plain

多分ですがこのTutorialシリーズはこのCustom HLSLの書き方についてのTutorialだと思います。

面白そうですが、この辺はNiagaraの基本を理解した後で、勉強すれば良いと思います。

<Introduction to Niagara

f:id:kazuhironagai77:20210830001830p:plain

これは私が先週、勉強したシリーズとどう違うのでしょうか?

f:id:kazuhironagai77:20210830001911p:plain

中身を見たら一目瞭然でした。Sprite、GPU Spriteと基本から教えています。

成程と思ったらCurl Noiseがありました。Curl Noiseって基本だったんですね。

f:id:kazuhironagai77:20210830001934p:plain

一番最初のTutorialが作成されたのが2020年でEmitterの形を見ると今のNiagaraとあんまし変わっていません。

f:id:kazuhironagai77:20210830002002p:plain

こっちのTutorialで勉強した方が楽かもしれません。

これか、公式のDocumentであるNiagara Visual Effects [4] 、

f:id:kazuhironagai77:20210830002017p:plain

もしくはgameDevOutpost氏のUE4-VFX [5] 、

f:id:kazuhironagai77:20210830002033p:plain

のどれかで勉強すればNiagaraの基本の勉強は十分でしょう。

RPG Game Effect in Unreal Engine Niagara

f:id:kazuhironagai77:20210830002055p:plain

マジですか?

一番私が勉強したいEffectじゃないですか?

後でじっくり見る事にしましょう。

Unreal Engine VFX (UE4 Niagara VFX)

f:id:kazuhironagai77:20210830002131p:plain

中を見ると同じTutorialが4個も5個も入っていてどんな基準でこのシリーズに分類されているのか良く分かりません。

TutorialだけじゃなくVFXを紹介しただけの短い動画も入っています。

Unreal Engine Effects in Marketplace

f:id:kazuhironagai77:20210830002206p:plain

これが私が先週、勉強したTutorialが載っていたシリーズですが、ここには今までCGHOW氏が作成したNiagaraのTutorialが全部入っているみたいですね。

364個のTutorialがあります。

Unreal Engine VFX Tutorial

f:id:kazuhironagai77:20210830002244p:plain

こっちはCascadeのTutorialも含まれていました。

Cascadeの勉強する教材が見つからないと思っていたらここに沢山ありました。

これは大発見です。

2.2 Intro to Niagara | Curl Noise | Point Attractor | Sine | Unreal Engine Niagara Tutorial [6] の勉強

本当はRPG Game Effect in Unreal Engine Niagaraシリーズのどれかを勉強したかったんですが、一個良さそうなのを開いて見たら、かなり複雑な事をサラッと済ましていたので止めました。

Introduction to Niagaraシリーズから勉強する事にします。

となるとやっぱり先週勉強したCurl NoiseについてのTutorialをやってみたいですね。

Intro to Niagara | Curl Noise | Point Attractor | Sine | Unreal Engine Niagara Tutorial [6]を勉強します。

Curl Noiseについては12分11秒当たりから解説が始まっています。

取りあえずそこだけ勉強します。

新しいNiagara systemを作成しCurl Noiseと名付けます。

TutorialのNiagara systemの作成方法はちょっと今のVersionとは違うみたいですね。

結果、以下に示したようなNiagara systemのStackのみが表示されているものが作成されていたので

f:id:kazuhironagai77:20210830002308p:plain

Empty Systemを選択して作成してみます。

f:id:kazuhironagai77:20210830002349p:plain

全く同じものが出来ました。

f:id:kazuhironagai77:20210830002402p:plain

次にDefault Emitterを追加しました。

何時もTutorialに使用しているヤツだそうですが、勿論、私には初耳です。

Tutorialに表示されたヤツをみるとRenderに何もセットされていませんが、全くModuleがないわけでもありません。

f:id:kazuhironagai77:20210830002420p:plain

どうせEmpty Emitterと同じだろうと思ってEmpty Emitterを作成したら全く違いますね。

f:id:kazuhironagai77:20210830002435p:plain

しかも今のVersionには無いModuleも結構使用しています。

仕方ないのでEmptyを代わりに使用して続行します。

RenderにSpriteを追加してMaterialにM_Radialを追加しています。

M_RadialがないのでEmptyにDefaultでセットされている

f:id:kazuhironagai77:20210830002502p:plain

をそのまま使用します。

Tutorialでは今度はSpawn Rate ModuleをEmitter Update Categoryに追加してSpawn Rateの値を200にセットします。

f:id:kazuhironagai77:20210830002523p:plain

こんな感じのイメージがReviewに表示されています。

f:id:kazuhironagai77:20210830002539p:plain

同様にSpawn Rateを追加してSpawn Rateの値を200にセットしてみます。

f:id:kazuhironagai77:20210830002554p:plain

うーん。まあいいですわ。次に行きます。

Add Velocity ModuleをParticle Spawn Categoryに追加します。

f:id:kazuhironagai77:20210830002609p:plain

f:id:kazuhironagai77:20210830002615p:plain

こんな感じです。

f:id:kazuhironagai77:20210830002631p:plain

大体、Tutorialのイメージと同じです。のでこれで行きます。

そしたら、Velocityは要らない。Random Momentumが欲しいとなってVelocityを消してしまいました。

TutorialによるとCascadeにはOrbit ModuleというRandom MomentumをParticleに追加出来るModuleがあるそうです。

f:id:kazuhironagai77:20210830002647p:plain

もしくはGPUに変えてVector FieldのLocal Vector Fieldを使用する方法もあります。

f:id:kazuhironagai77:20210830002704p:plain

Niagara Systemの場合は、それらの代わりにCurl Noise Force Moduleを使用します。

成程。

ここでCurl Noiseの登場ですか。

TutorialではPan Noise Fieldにチェックを入れて以下の設定にセットしています。

f:id:kazuhironagai77:20210830002718p:plain

こんな風に下の方のParticleがばらけています。

f:id:kazuhironagai77:20210830002734p:plain

同じ値で試してみます。

f:id:kazuhironagai77:20210830002757p:plain

下の方は僅かにばらけていますが、全体の形は微妙に違います。

Spawn Rateを20にまで落としたら以下の様に最後の部分がばらけるようになりました。

f:id:kazuhironagai77:20210830002811p:plain

でも何か違います。

Tutorialのは最後のばらけ方がランダムなんですが、私のは一直線です。

まあ、いいです。今回はTutorialと同じEffectを作成するために勉強しているのではなく、Curl Noise Force Moduleの使用方法を勉強するのが目的ですから。

うーん。

ちょっと結論から書いてしまうんですが、この後も色々な調整はするんですが、Curl Noise Force Moduleについての解説はこれだけでした。

これだけでは視聴者はCurl Noise Force Moduleの使用方法について全く理解出来ないですよね。

うーん。

CGHOW氏のTutorialは実際のNiagaraの実装について学ぶには良いのかもしれませんが、個々のModuleのロジックについては余りと言うか全然解説してくれてないですね。

例えば今回、私が知りたかったのは、先週意味が分からなかったFrequencyの機能ですが、全く何の解説もしてくれていません。

CGHOW氏のTutorialは勉強方法を考えないとそこから何も学べない事態になりかねないですね。

少しやり方を考えます。

2.3 Niagaraの勉強方法についての検討

まず、NiagaraというかUE4のParticle Systemを使用したVFXの勉強方法として私は、

  • 基本編と応用編に分けて勉強すべき
  • 基本編では、SpriteRibbonなどのそれぞれのRendering方法についての理解や個々のModuleの機能について理解する
  • 応用編では、どんなEffectが炎や氷のVFXを作成するために必要なのかを勉強し、具体的な作成方法を学ぶ。

と言う考え方で進めて来て、かなりNiagaraについても根本から理解出来て来ています。

例えばgameDev Outpost氏のUE4 – VFX [5] は私の言う基本編で勉強すべき内容と完全に一致しています。gameDev Outpost氏も明言はしていませんが、Niagaraの学習方法に対して私と同様の考え方を持っていると考えらます。

一方で、CGHOW氏は全く基本については説明しません。でもいつでも説明しない訳ではなく、例えば2021-08-16のブログで説明したように

f:id:kazuhironagai77:20210830002843p:plain

滅茶苦茶分かり易く説明する時もあります。

これ多分なんですが、CGHOW氏にとってはParticle Systemの基本なんでとっくの昔にマスターしちゃったんで、他の人がその部分が分からないって事に気が付いてないんだと思います。

もしくはアメリカの大学教授のように教え方が上手ければ年収何千万円もらえるならともかく、YouTubeで無料で教えるわけですから、そこそこ教えて後は自分で何とかしろみたいな感じなのかもしれません。

後、考えられるのは、インドでNiagaraの基礎だけ教えるTutorialを作ってもGame会社から評価されないってのもあるかと思われます。Game会社にとってはそれこそCurl Noiseの計算方法なんてどうでもよくて、最終Productだけ見せろって要求ばっかりしてくるので結果的にそうなってしまったのかもしれません。

まあ、どちらにしてもYouTubeで現状あるNiagaraのtutorialで最も優れたものの一つである事は間違いないですから、何とかしてこのTutorialを完全に理解出来るようにしたいです。

もう一つの問題としてNiagaraはまだ発展途上であってVersionが変わるとModuleもどんどん変化してしまう事が挙げられます。

これは理論的には、本当にModuleの機能を理解していれば多少の形が変化しても理解出来るはずですが、実際は無理でした。

それで特にですがCGHOW氏のTutorialをやる場合はVersionが同じNiagaraでやる方が良い気がします。

もう一つ、CGHOW氏のTutorialを勉強する時は、私の言う応用編を勉強する気持ちでやるべきかもしれません。基礎は凄く説明してくれている時もありますが無い時もあります。基礎を学ぶつもりで動画を見てて今回みたくほとんど説明がない事態に遭遇すると絶望感が半端ないです。

後、今まで勉強した内容を振り返る時なのかもしれません。

今 、見直したらParticle Systemの勉強を始めたのが2021-04-26のブログからです。丁度4カ月前です。一端、勉強した事を全部まとめて総括して、自分の足場を確認すべき時だと思います。

3.Cascadeの勉強

CGHOW氏のCascadeのTutorialが沢山ある事が分かったのでその内のどれかをやる事にします。

Unreal Engine Skull Aura Tutorial | Download Project Files [7] は約50分の動画と大変長いですが、他の動画と比べてよく説明しているみたいです。コメント欄に、此処までは出来たけどその先に進めません。とかもう少し詳しい解説をお願いします。みたいなのがあまりないからです。

出来る所までやっていきます。

f:id:kazuhironagai77:20210830002918p:plain

これを作成します。

3.1 最初のEmitterを作成する

まずMayaを使用して以下のSkullを作成しています。

f:id:kazuhironagai77:20210830002937p:plain

これは自分では作成出来ないので、球か立方体のStatic Meshで代用しましょう。

f:id:kazuhironagai77:20210830002951p:plain

Cubeで代用する事にします。

次にParticle Systemを作成してp_Skull_Auraと名付けています。

f:id:kazuhironagai77:20210830003005p:plain

全く同じ物を作成しました。

f:id:kazuhironagai77:20210830003158p:plain

名前をSkullsに変更した後、Data TypeをMesh Dataに変更します。

f:id:kazuhironagai77:20210830003213p:plain

しました。

ここまでは簡単ですね。

この調子で最後まで行ってくれるとうれしいです。

Mesh Data ModuleのMeshにSkullをセットしています。

f:id:kazuhironagai77:20210830003228p:plain

SkullのMeshはないので、Mesh Data ModuleのMeshに立方体のStatic Meshをセットします。

f:id:kazuhironagai77:20210830003244p:plain

あれ。Previewに何も表示されなくなりました。

以下に示した様に色を変えて見ましたが何も表示されません。

f:id:kazuhironagai77:20210830003259p:plain

此処でつまずくの?

色々調べた結果、元にしたCubeが大きすぎて写らないみたい事が分かりました。

うーん。しょうがない。

Infinity_Blade_AssetsにあったSkeleton Headを使用する事にします。

f:id:kazuhironagai77:20210830003313p:plain

f:id:kazuhironagai77:20210830003319p:plain

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

f:id:kazuhironagai77:20210830003335p:plain

これでいきます。

実際に配置してみたらこんなに大きいです。

f:id:kazuhironagai77:20210830003350p:plain

Initial Size Moduleなどで変更出来るんでしょうか?

25から5に下げて見ました。

f:id:kazuhironagai77:20210830003405p:plain

小っちゃくなっていますね。

f:id:kazuhironagai77:20210830003420p:plain

更に3まで下げて見ました。

f:id:kazuhironagai77:20210830003450p:plain

これでやってみます。

Initial Velocity ModuleのVelocityを以下の値にセットします。

f:id:kazuhironagai77:20210830003517p:plain

しました。

今度はSkullがCharacterの周りで回転するようにするそうです。

速度を以下のように変化させます。

f:id:kazuhironagai77:20210830003541p:plain

しましたが、何故したのかはまだ分かりません。

後、Locked AxesのXYZの意味が分かりません。

Spawn Rate ModuleのSpawnを以下のように変更しました。

f:id:kazuhironagai77:20210830003604p:plain

f:id:kazuhironagai77:20210830003609p:plain

Skullが一個だけ生成されるようになりました。

f:id:kazuhironagai77:20210830003630p:plain

Initial Velocity ModuleでLocked Axesの値をXYZにした理由が説明されていました。

f:id:kazuhironagai77:20210830003646p:plain

は、Locked AxesがNoneでx=2000、y=2000、z=2000の場合と同じだそうです。

そしてVelocity /Life Moduleを追加します。

f:id:kazuhironagai77:20210830003727p:plain

更にInitial Location Moduleを追加して

f:id:kazuhironagai77:20210830003750p:plain

Yに400を指定します。

f:id:kazuhironagai77:20210830003806p:plain

Velocity /Life ModuleのVelocity Over Lifeを以下の様にセットします。

f:id:kazuhironagai77:20210830003821p:plain

何でこれで骸骨が中心に対して公転するようになるのか今一分かりませんが、結果は

f:id:kazuhironagai77:20210830003857g:plain

回転してます。

ちょっとだけ2次元で考えてみます。

最初の状態は、x=2000、y=2000と同じであるとすると以下のようなベクトルになっています。

f:id:kazuhironagai77:20210830004038p:plain

これはt=0の場合、x=-1、y=0が乗算されます。つまりx=-2000、y=0になります。

f:id:kazuhironagai77:20210830004104p:plain

T=0.25の場合、x=0、y=1が乗算されます。つまりx=0、y=2000になります。

f:id:kazuhironagai77:20210830004119p:plain

T=0.5 の場合、x=1、y=0が乗算されます。つまりx=2000、y=0になります。

f:id:kazuhironagai77:20210830004141p:plain

T=0.75 の場合、x=0、y=-1が乗算されます。つまりx=0、y=-2000になります。

f:id:kazuhironagai77:20210830004156p:plain

最後にt=1 の場合、x=-1、y=0が乗算されます。つまりx=-2000、y=0になります。

f:id:kazuhironagai77:20210830004213p:plain

つまり最初に戻ります。

この考えで合っているかどうかは不明です。Tutorialの説明を見る限りはこの説明で正しい気はしています。

今度は骸骨の向きを変更します。

以下の動画を見ると分かりますが骸骨は常に正面を向いています。骸骨が外側を見るようにします。

f:id:kazuhironagai77:20210830004240g:plain

Required ModuleのScreen Alignmentの値をPSA Squareから

f:id:kazuhironagai77:20210830004306p:plain

PSA Velocityに変更します。

f:id:kazuhironagai77:20210830004321p:plain

すると骸骨が外側を見るようになりました。

f:id:kazuhironagai77:20210830004341g:plain

この辺の理屈は分かりません。

PSA Velocityと言うくらいだから、Meshが速度のVectorの向きに沿うようになると言う事なんでしょうか?

Cursorを重ねたら解説が表示されました。

f:id:kazuhironagai77:20210830004405p:plain

うーん。カメラに向かってと解説されていますがどのカメラに対して何でしょうか?

次にLife Time ModuleのLife Timeを以下の設定に変更して

f:id:kazuhironagai77:20210830004421p:plain

Required ModuleのDurationのEmitter Durationの値を以下の様に変更します。

f:id:kazuhironagai77:20210830004435p:plain

骸骨の回転がゆっくりになりました。

Tutorialと骸骨の向きが違いますね。

Tutorialでは骸骨は進行方向を向いていますが、私のは外側を向いています。

Tutorialの骸骨。進行方向をむいています。

f:id:kazuhironagai77:20210830004453p:plain

私の骸骨。外側を向いています。

f:id:kazuhironagai77:20210830004506p:plain

後で直し方は考えます。

次は骸骨の数を4つに増やします。

Required ModuleのDurationのEmitter Durationを1に戻します。

f:id:kazuhironagai77:20210830004519p:plain

これで骸骨が2つになります。

更にSpawn ModuleのRateの値を2にします。

f:id:kazuhironagai77:20210830004532p:plain

Spawn ModuleのBurstからは生成しないので0に戻します。

f:id:kazuhironagai77:20210830004545p:plain

結果です。

f:id:kazuhironagai77:20210830004559p:plain

4つの頭蓋骨が生成されています。

f:id:kazuhironagai77:20210830004639p:plain

この後はこの骸骨のためのMaterialを作成するそうなので微調整を行います。

まず、骸骨の回転が速すぎます。

Initial Velocity ModuleのStart Velocityの値を1000に変更します。

f:id:kazuhironagai77:20210830004654p:plain

骸骨が回転する円の半径が半分になってしまったので、Lifetime ModuleのLife Timeを倍の4.0にします。

f:id:kazuhironagai77:20210830004707p:plain

すると骸骨が8個になってしまったので、Spawn Rate ModuleのSpawnを1に戻します。

f:id:kazuhironagai77:20210830004721p:plain

こんな感じです。

f:id:kazuhironagai77:20210830004741g:plain

骸骨が一瞬だけ横を向くんですが、何なんでしょうこれ。後で直します。

骸骨の回転の中心がParticle Systemの中心と全然違う箇所にあります。

f:id:kazuhironagai77:20210830004819p:plain

この原因はInitial Location ModuleのLocationの値が400だからだと思います。

f:id:kazuhironagai77:20210830004835p:plain

これを‐400に直します。

f:id:kazuhironagai77:20210830004849p:plain

直りました。

実際のMap上で見ると骸骨、大きすぎます。

f:id:kazuhironagai77:20210830004903p:plain

サイズを半分にします。

f:id:kazuhironagai77:20210830004918p:plain

なんとサイズを半分にしたら回転の半径が二倍に増えてしまいました。

手前に写っている骸骨はサイズが半分に成っているにもかかわらず、カメラに前の2倍も近づいているため元の大きさと変わらないように見えます。

Initial Velocity ModuleのStart Velocityの値を500にします。

f:id:kazuhironagai77:20210830004934p:plain

やっぱり骸骨が一瞬だけ横を向くのは気になります。

骸骨の向きは、Required ModuleのScreen Alignmentによって指定されているはずです。

f:id:kazuhironagai77:20210830005009p:plain

そして現在、PSA Velocityに指定されているのでParticleのVelocityによってParticleの向きは決定されるはずです。

そのParticleのvelocityはInitial Velocity ModuleとVelocity/Life Moduleによって以下の様に指定されています。

f:id:kazuhironagai77:20210830005024p:plain

f:id:kazuhironagai77:20210830005030p:plain

ここでVelocity/Life Moduleの0の時の値と1の時の値を見ると、同じです。つまりParticleは重なるはずです。この時に何故か骸骨が一瞬だけ横を向くんバグが発生するんでしょうか?

分かりせんね。

今の知識ではまだ直せませんね。この問題は。

次に行きます。

3.2 Skull用のMaterialを作成する

Materialを作成します。名前はM_skullとします。

f:id:kazuhironagai77:20210830005052p:plain

Viewportの表示をskeleton Headに変更します。

f:id:kazuhironagai77:20210830005107p:plain

やり方は簡単で、skeleton Headを選択した状態で、

f:id:kazuhironagai77:20210830005121p:plain

ViewportのTeapotを選択します。

f:id:kazuhironagai77:20210830005137p:plain

以下に示した様にskeleton HeadのMeshが表示されます。

f:id:kazuhironagai77:20210830005150p:plain

この機能始めて知りました。これからはガンガン使用していきます。

後、ずっとPreviewと呼んでいましたがViewportが正しい名前でした。

f:id:kazuhironagai77:20210830005204p:plain

いきなりFresnelノードとLinear Interpolationノードを追加しました。

f:id:kazuhironagai77:20210830005219p:plain

更にMaterialの設定をTranslucent、Unlit、そしてTwo Sideに変更しました。

f:id:kazuhironagai77:20210830005240p:plain

Shading Modelの設定にUnlitがあるのは知りませんでした。

こっちがUnlitです。

f:id:kazuhironagai77:20210830005254p:plain

こっちはDefault Litです。

f:id:kazuhironagai77:20210830005308p:plain

結構違いますね。Default LitにはBase ColorとAmbient Occlusionがあります。

話は変わりますが、RPGGameに配置してるAssetで陰影が表示されないものがあります。

f:id:kazuhironagai77:20210830005322p:plain

前に調べた時、これらのAssetに使用されている全てのMaterialはNormalが指定されていない。

f:id:kazuhironagai77:20210830005336p:plain

からNormalがない事が原因ではないのか?

と推測しました。

でもShading ModelでUnlitが指定出来るならそれが原因かもしれません。それでそこを確認してみます。

f:id:kazuhironagai77:20210830005505p:plain

Default Litでした。Assetで陰影が表示されないものとこのShading ModelをUnlitにする事は関係なさそうです。

OpacityにConstant Nodeを繋げます。Constant Nodeの値は1にします。

f:id:kazuhironagai77:20210830005521p:plain

Emissive Colorには以下の実装を行いました。

f:id:kazuhironagai77:20210830005535p:plain

Materialはまだ本格的な勉強はしていないので、この形の実装も始めて見るものです。

Fresnelを使用していると言う事は端だけ表示される感じになるんでしょうか?

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

f:id:kazuhironagai77:20210830005601p:plain

うーん。想像とは全然違いました。

Fresnel Nodeについてちょっとだけ勉強します。

<Fresnel Node

Mathew Wadstein 氏のWTF Is? Material - Fresnel in Unreal Engine 4 [8] で勉強します。

まずFresnelの発音から解説しています。Sは発音しませんと言っています。あえてここで説明すると言う事はFresnelと言う名前はアメリカでは珍しいんでしょうか?

気になるので発音をもう少しだけ調べて見ます。IPAによる発音記号はfrəˈnɛlと記されていました。

Googleの発音では

f:id:kazuhironagai77:20210830005646p:plain

と表示されました。日本語で敢えて言えば、フレネェウって感じでしょうか?

日本語ではフレネルとなっていますね。かなり英語の発音には近いですね。フランス人ですので英語の発音に近かったとしてもだからどうしたと言う感じですが。

それでは肝腎の内容ですが、カメラに対してMeshのNormal Vectorが垂直に近づく程、値が大きく(1に近づく)ようになります。

以下の例で言えば、球の端の部分です。

f:id:kazuhironagai77:20210830005725p:plain

球の正面のNormal Vectorはカメラに対して水平だから値は0じゃないのか?なのに黒くないじゃないか?となりますが、その辺はFresnelにある二つのParameterの値によって変わってきます。

f:id:kazuhironagai77:20210830005742p:plain

DefaultではExponentInは5にセットされていますが、これを0にすると

f:id:kazuhironagai77:20210830005755p:plain

全部赤くなります。

ExponentIn=1

f:id:kazuhironagai77:20210830005835p:plain

1の時は球の正面は黒いですね。

ExponentIn=2

f:id:kazuhironagai77:20210830005848p:plain

2の時はgradationが出来ていますね。

ExponentIn=3

f:id:kazuhironagai77:20210830005901p:plain

数字が大きくなると内円の部分が大きくなるのと内円の色が薄くなる傾向が見られます。

ExponentIn=5

f:id:kazuhironagai77:20210830005915p:plain

Defaultの状態です。

ExponentIn=8

f:id:kazuhironagai77:20210830005930p:plain

かなり内円が大きくなってほとんど外円と重なってしまいました。

ExponentIn=10

f:id:kazuhironagai77:20210830005943p:plain

8の時とあまり変わらいですね。

次のParameterであるBase Reflect Fractionですが、Mathew Wadstein 氏の説明によると光が物質内で反射される割合を示しているそうです。

反射されない物質なら0だそうです。

Base Reflect Fraction=0、ExponentIn=5

f:id:kazuhironagai77:20210830005956p:plain

こっちの方が分かり易いですね。

Base Reflect Fraction=0、ExponentIn=1

f:id:kazuhironagai77:20210830010009p:plain

の場合です。

Base Reflect Fractionの変化をExponentInを10に固定して見て行きます。

Base Reflect Fraction=0、

f:id:kazuhironagai77:20210830010023p:plain

内円は真っ暗です。

Base Reflect Fraction=0.01、

f:id:kazuhironagai77:20210830010111p:plain

内円がかなり明るくなりました。外円も明るくなっているのかは分からないですね。

Base Reflect Fraction=0.02、

f:id:kazuhironagai77:20210830010125p:plain

内円はもっと明るくなりました。

Base Reflect Fraction=0.04、

f:id:kazuhironagai77:20210830010138p:plain

内円はもっと明るくなりました。

これでBase Reflect Fractionの傾向も判明しました。値が大きくなると内円が明るくなります。

それでここまでやって思い出したんですが、私、このFresnel Refection を量子化学のSpectroscopyのクラスで勉強してました。

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

今理解しているかと言われると「もう忘れちゃった。」としか答えられません。が、一回は理解した記憶があります。後でMaterialの勉強する時はしっかり式から理解出来るようにします。

最後のParameterのNormalですが、これはMeshが本来持っているNormal Vectorとは違うNormal Vectorを使用する時に使うそうです。ので今回はパスします。

<Materialの作成の続き>

試しなのか、CGHOW氏、Emissive Colorの実装を以下の様に変更して

f:id:kazuhironagai77:20210830010157p:plain

黄金のSkullを作成しました。

f:id:kazuhironagai77:20210830010212p:plain

凄い、絶句ものの美しさです。

私もそっくりまねて実装してみました。

f:id:kazuhironagai77:20210830010225p:plain

何か全然違いますね。まあ元々使用しているMeshが違うのでしょうがないですね。

色々値を弄ってみましたがこれが限界でした。

f:id:kazuhironagai77:20210830010250p:plain

結局、CGHOW氏は以下の実装に戻してしまいました。

f:id:kazuhironagai77:20210830010305p:plain

後で、Cascadeの方から値を変化させるんでしょうね。

3.3 最初のEmitterを作成するの続き

Required ModuleのMaterialをM_skullに変更しました。

f:id:kazuhironagai77:20210830010323p:plain

Tutorialのは完全に真っ黒ですが、

f:id:kazuhironagai77:20210830010337p:plain

私の方は元のMaterialが使用されたままになっています。

f:id:kazuhironagai77:20210830010350p:plain

Skeleton HeadをDuplicateしてMaterialをM_skullに変更したStatic Meshを作成して

f:id:kazuhironagai77:20210830010403p:plain

それをP_Skull_AuraのSkull EmitterのMeshにセットしました。

f:id:kazuhironagai77:20210830010427p:plain

そしてColor Over Life Moduleの設定を先程のGoldの値にセットします。

f:id:kazuhironagai77:20210830010454p:plain

こんな感じです。

f:id:kazuhironagai77:20210830010510p:plain

あれ、また後ろの髑髏が前に写っています。Ribbonの時と同じ現象が起きています。

f:id:kazuhironagai77:20210830010525p:plain

真ん中にSK_Mannequinを配置してみます。

f:id:kazuhironagai77:20210830010539p:plain

それなりには雰囲気が出て来ました。

これで最初のEmitterの作成は終わりのようです。

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

3.4 今週のCascadeの勉強のまとめと感想

CGHOW氏のUnreal Engine Skull Aura Tutorial | Download Project Files [7] の最初のEmitterの作成までやりました。このTutorialは大変分かり易かったです。

大体、CGHOW氏のTutorialの仕組みが分かって来ました。Tutorialによっては初心者向けに非常に詳しく解説したり、上級者向けに簡単に解説したりしているんです。だから自分のLevelにあったTutorialを選択する必要があるんです。

そして基礎を学ぶよりも実際にゲームで使用するVFXの作成方法、つまり応用を学ぶ所と考えるべきですね。

後、UE4のVersionは揃えた方がいいですね。ちょっとしたNiagaraの違いで訳わからなくなる可能性があります。

<Effectの違いはMeshの違い>

全く同じMaterialを使用していてもCGHOW氏のSkullは以下ので

f:id:kazuhironagai77:20210830010604p:plain

私のはこうなりました。

f:id:kazuhironagai77:20210830010617p:plain

やっぱり優れたMeshを使用する事は綺麗なEffectの作成に絶対必要です。

<Fresnel Nodeについて>

Fresnel Nodeの使用方法については良く理解出来ました。

やっぱり一個一個試してみるのが理解するコツですね。

実際の計算方法についてもMaterialを勉強する時は、復習したいです。

<骸骨が一瞬だけ横を向くバグ>

これ非常に見苦しいんですが直し方が分かりません。

<骸骨を公転させる方法について>

これももっと楽なやり方があると思います。全体を理解したら別な方法で実装します。

以上です。

4.Map1の修正の続き

Map1とMap1_Testで共有している全てのDataを別々にします。

先週、作成しなかったDataは

f:id:kazuhironagai77:20210830010728p:plain

と村のNPCとの会話です。

f:id:kazuhironagai77:20210830010741p:plain

それぞれどこで使用してるかを確認します。

4.1 Item Spawn Dataの使用状況

まずはItem Spawn Dataです。

f:id:kazuhironagai77:20210830010802p:plain

Map1とMap1_Testしか使用してませんね。使用方法は全く同じはずなので、Map1_Testを見てみます。

Event BeginPlay関数内で、Itemを動的に生成するための実装部でItem Spawn Dataが使用されています。

f:id:kazuhironagai77:20210830010815p:plain

それだけです。

いやいや、Itemを拾ったらそのItemは2度と生成されないのだから、Itemを拾った時にもItem Spawn DataにAccessする必要があるはずです。

なんで検索には引っかからないのか不明ですが、それを探します。

ありました。

Pick up Item WidgetのRemove Picked Item()関数内で使用しています。

f:id:kazuhironagai77:20210830010829p:plain

このWidgetからItem Spawn Dataを検索してみると、以下に示してたように沢山引っかかって来ました。

f:id:kazuhironagai77:20210830010843p:plain

どうやらUE4 Editorでは検索を開始するBPによって検索結果は変わるみたいですね。多分ですがWidgetからある変数を使用している時はWidgetから検索しないと、だめみたいです。

ある変数の使用箇所を調べるのに、検索で出て来た所だけを確認して全部調べた気になっていると危ない事が分かりました。

以下の二つのWidgetでItem Spawn Dataを使用してました。

一体何に使用しているのかを調べたら、Game をSaveする時とLoadする時でした。

f:id:kazuhironagai77:20210830010902p:plain

f:id:kazuhironagai77:20210830010910p:plain

はぁー。すっかりSaveする時とLoadする時の事を忘れていました。

Priest_Welcome Widgetを開いて見るとやっぱりSaveする時に使用していました。

f:id:kazuhironagai77:20210830010924p:plain

セーブボタンを押した時に実行されるコードです。

f:id:kazuhironagai77:20210830010939p:plain

この中のFrom Game Instance to Save Game関数を開くとItem Spawn Dataを使用しています。

f:id:kazuhironagai77:20210830010956p:plain

もしItemのSpawn するDataを他のMapに作成するとこの部分を増やす必要がありますね。

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

最後はStart Menu WidgetのLoadに使用してます。

f:id:kazuhironagai77:20210830011013p:plain

ここです。

f:id:kazuhironagai77:20210830011027p:plain

Load Gameを開くと

f:id:kazuhironagai77:20210830011041p:plain

Item Spawn Dataがある訳ではなくChange Item Spawn Data in Game Instance関数があり

f:id:kazuhironagai77:20210830011054p:plain

その関数内でItem Spawn Dataが使用されています。

4.2 Item Spawn Dataの改造について

それぞれのMapにItem Spawn Dataを作成する予定です。

ただItem Spawn DataにそのItemがSpawnされるMapのデータを含ませる事で、一個のArrayで全部のItemを管理出来ないのか検討してみます。

Item Spawn Data はArrayでBaseになっているStructureはItem Spawn Dateです。以下にその要素を示します。

f:id:kazuhironagai77:20210830011112p:plain

ここにLevel名を追加すれば出来そうです。

ただしArrayの元になっているStructureの構成を変化させた場合、前のStructureで作成されたArrayのDataは全部消えてしまった気がします。

後、Data Tableに書かれたデータを外部に保存して新たにImportすると凄い楽だった気がします。これも調べて見ます。

<Data Tableの元になっているStructureの構成を変化させる>

Testと言う名前のStructureを作成しました。

f:id:kazuhironagai77:20210830011134p:plain

中身は以下の様にしました。

f:id:kazuhironagai77:20210830011147p:plain

これを元にArrayをGame Instanceに作成します。

f:id:kazuhironagai77:20210830011200p:plain

作りました。

更に中身も追加します。

f:id:kazuhironagai77:20210830011232p:plain

この状態で変数Test Structの元になっているStructureであるTestに新しい要素を追加します。

f:id:kazuhironagai77:20210830011247p:plain

Game InstanceからCompileをクリックしたらUE4 Editorがクラッシュしてしまいました。

UE4 Editorを開いてGame Instanceに作成したarray 、Test Structを確認したら

f:id:kazuhironagai77:20210830011301p:plain

先程、作成した要素が普通に追加されていました。

Structureに新しい要素を追加する時は、追加した後、一端UE4Editorを閉じて、もう一度開けば大丈夫みたいです。

<Data Tableに書かれたデータを外部に保存して新たにImportする方法>

これは2020-05-24のBlogにやり方がまとめられていました。

f:id:kazuhironagai77:20210830011322p:plain

よくこんな細かい事を覚えていたと思います。

ただ、この方法はArrayには使用出来ません。Data Tableに対してのみです。

4.3 NPCとの会話

NPCとの会話はNPC_Person BPのVillage Name とOccupationによって決定します。

f:id:kazuhironagai77:20210830011344p:plain

f:id:kazuhironagai77:20210830011350p:plain

これはMap1で新しくNPCを配置する時にこの二つを変更すれば良いだけです。

これは時に何もする必要はないですね。

4.5 Item Spawn Dataの調査のまとめ

Item Spawn Dataは二つの解決策があります。それぞれに長所と短所があり、どちらを選択してもかなりのコードを変更する必要が出て来ます。それぞれの長所と短所、直す必要があるコードについてまとめます。

<Map1用とMap1_Test様に別々のArrayをGame Instanceに作成する方法>

長所です。

  • この方法は現在、Game Instanceに存在しているItem Spawn Dataをそのまま使用出来ます。

短所です。

  • Map2個の内はまだいいかMapが増えるたびに新しいArrayGame Instanceに作成する必要がある。
  • 勿論、それに伴ってItem Spawn Dataに関係している全てのコードを書き変える必要が出て来る。

この方法を採用した時、直さなくてはならないコードを書き出します。

  • Map1_TestにおけるEvent BeginPlay関数内で、Itemを動的に生成するための実装部を書きなおす必要があります。

f:id:kazuhironagai77:20210830011438p:plain

  • Priest_Welcome WidgetからSaveをする時

f:id:kazuhironagai77:20210830011508p:plain

この2つは新たなMapを追加するたびに書きなおす必要があります。

<StructであるItem Spawn Dateにあらたな要素、Level名を追加する>

長所です。

  • 一回作成出来れば、後から何個mapが追加されても何も変更する必要がない。

短所です。

  • Structを書き変えた時に発生するErrorが未知
  • 書き変えるコードが比較的多い

この方法を採用した時、直さなくてはならないコードを書き出します。

  • Map1Map1_TestにおけるEvent BeginPlay関数内で、Itemを動的に生成するための実装部を書き直す必要があります。

f:id:kazuhironagai77:20210830011555p:plain

  • Priest_Welcome WidgetSaveをする時(以下の実装を見ると変更しないでも大丈夫かもしれません。)

f:id:kazuhironagai77:20210830011622p:plain

  • Start Menu WidgetからLoad する時

f:id:kazuhironagai77:20210830011648p:plain

<結論>

二つのやり方を厳正に比較した所、「StructであるItem Spawn Dateに新たな要素、Level名を追加する」方法の方が優秀であると考えられます。このやり方でやる事にします。ただし一週間だけ寝かします。もっと良い考えが浮かぶかもしれませんし、何かの大きな問題に気が付くかもしれませんので。

なので今週のRPGの製作はこれだけです。

4.6 NPCのキャラクターについて

現在、NPCのキャラについてはSK_Mannequinで代用しています。

f:id:kazuhironagai77:20210830011741p:plain

いつかはこれらをしっかりしたMeshに代える必要があります。

NPCだけで14種類必要です。

f:id:kazuhironagai77:20210830011755p:plain

Third Person Character BPに書かれている職業を見ると現時点で23種類必要です。

f:id:kazuhironagai77:20210830011807p:plain

候補を探して見ました。

f:id:kazuhironagai77:20210830011823p:plain

f:id:kazuhironagai77:20210830011830p:plain

このPolygonシリーズが親和性が高そうです。

ただし、この会社、コメント欄に

f:id:kazuhironagai77:20210830011858p:plain

と書かれていてあまり評判は良くないみたいです。

現状、これぐらいしか見つかりません。これで妥協するのも必要かもしれません。

5.Loading Screenの勉強の続き

5.1 先週の復習

現在、制作中のこのRPGでは、別なMapに移動する時は銀河鉄道に乗車している事にしました。

なのでLoad中は電車内の会話を表示するようにしたいんです。出来ればAnimationで。Load時間が短い時は「○○駅を発車しました。○○駅に到着しました。」と出ます。Load時間が長い時は「異音を検知したため低速運行を行っています。」みたいな連絡が表示される訳です。

それで先週はBackgroundでLoadする方法について勉強しました。

まずUE4C++からBackgroundでLoadする方法を勉強しました。

主に使用したTutorialはAsync Loading Screens and Transition Levels | Unreal Fest Europe 2019 | Unreal Engine [9]です。

次にBPでBackgroundでLoadする勉強をしました。

その一環としてUnreal Engine 4 - Easy Loading Screen Tutorial - Blueprints Only [10]を勉強しましたが、そこでLoad Stream Levelノードを使用すればBackgroundでLoad出来る事が分かりました。

f:id:kazuhironagai77:20210830011940p:plain

所がこのノードの使い方を直接、説明したサイトやDocumentが見つからなかったんです。

更にSub Levelについても良く分からなかったんです。いやSub Levelの設定の仕方とかは分かったんですが、Sub Levelって何?普通のLevelとどう違うの?と言う根本的な所が分かりませんでした。

よくよく調べて見ると、このノードやSub Levelは、元々、巨大なMapを分割して作成してSeamlessに繋ぐために開発されたものでした。

最後にPlug-inを使用してLoadする方法を一寸だけ勉強しました。

最後に、Mathew Wadstein氏のTutorialでLoad Stream Levelノードを使用したLoadの作成方法を解説した動画、HTF do I? Loading Screens using Level Streaming in Unreal Engine 4 [14] が見つかったのでこれも勉強したいと述べています。

5.2 SeamlessなMapについて

Load Stream Levelノードを勉強するためには、先にSeamlessなMapの接続方法を勉強すれば良いとなりましたので、その作成方法を教えてるTutorialを探すと、

などがありました。

最初のTutorialであるUE4 - Tutorial - Level Streaming! [11]は、Dean Ashford氏が作成したものです。Dean Ashford氏のTutorialにはCascadeの勉強でも散々お世話になっています。

YouTubeの評価を見ると

f:id:kazuhironagai77:20210830012025p:plain

となっています。かなり良いTutorialと思われます。

次のTutorialであるHTF do I? Level Streaming using Blueprint Nodes in Unreal Engine 4 [12]はMathew Wadstein氏が作成したものです。BPのノードの機能や使用方法が分からない時は、いつもMathew Wadstein氏のTutorialにお世話になっています。

今回は特にLoad Stream Levelノードを理解するのが目的です。

このTutorialで勉強するのはかなり重要でしょう。

最後のTutorialであるLevel Streaming with Blueprints Unreal 4 [13]ですが、Shaun Foster氏が作成したものですが、多分ですが、今まででこの人のTutorialを見た事はないです。でも何かよさげ*なので試しに見てみます。

*全然関係ないですが、よさげを若者言葉として排斥する勢力があるみたいですが、私は絶対反対です。よさげはきちんとした日本語で、若者言葉じゃないです。昔からありました。またよさげのげは、気って意味です。良い気が出ていると言う意味です。これについてはかなり言いたい内容なのでいつか前文でまとめます。

5.3 Level Streaming with Blueprints Unreal 4 [13] を勉強する

Shaun Foster氏のLevel Streaming with Blueprints Unreal 4 [13]から勉強します。

最初からここに公式のDocumentがありますと説明していました。

f:id:kazuhironagai77:20210830012117p:plain

あれ。何で先週は見つからなかったんでしょうか?

もう一回探してみます。

公式のDocumentにLevel Streaming [15]がありました。

f:id:kazuhironagai77:20210830012132p:plain

更に、Collaborate with Sublevels [16]もありました。

f:id:kazuhironagai77:20210830012145p:plain

それでこの人のTutorialはこの辺のDocumentを読んだ前提で話しているみたいで付いていけません。

先にこのdocumentを読む事にします。

後、Comment欄で

f:id:kazuhironagai77:20210830012159p:plain

と回答しています。やっぱりUE5ではLoadの方法は根本から変更されているみたいですね。

5.4 Level Streaming Overview  [17]を勉強する

作戦変更です。公式のDocumentであるLevel Streaming Overview  [17]を勉強する事にします。

Level Streaming OverviewのRemarkには以下の様に書かれています。

f:id:kazuhironagai77:20210830012224p:plain

Streaming Levelとは先週、よく意味が分からないと言っていたSub Levelの事だと思います。

だとすると、このRemarkは「Sub LevelはLevel Streaming Volumeを使用するかBPかC++でprogrammingする事でLoad出来ます。」と読めます。

この解釈が正しければ、BPでSub LevelをLoadする場合にLoad Stream Levelノードが使用されているはずです。

f:id:kazuhironagai77:20210830012238p:plain

<The Persistent Level

Persistent Levelについての解説です。要するにPersistent LevelはSub Levelに対しての親Levelのようです。

Landscapeはどこで管理するんでしょうね。大きなLandscapeを作成してこのPersistent Levelで管理するんでしょうか。それとも沢山のLandscapeをそれぞれのSub Levelで管理するんでしょうか?

<Streaming Levels

Streaming Levelと言う言い方がまずしっくりきません。Sub Levelの方が実態を表しています。しかし公式がStreaming Levelと呼んでいる以上、これからはStreaming Levelと呼ぶ事にします。

Streaming Levelの管理はLevels Windowによって行われるそうです。

Levels Windowって何?と調べて見たら、以下のヤツでした。

f:id:kazuhironagai77:20210830012301p:plain

Menu画面にあるWindowからLevelsを選択すると開けます。

f:id:kazuhironagai77:20210830012330p:plain

Streaming Level はpersistent Levelと重ねて作成する事も可能ですし、別々に作成する事も可能だそうです。

これが知りたかった。

Level Streaming with Blueprints Unreal 4 [13] では、Streaming LevelをPersistent Levelに重ねて作成していたんです。このやり方を始めて見た私は「えっ。これがseamless なLevelの作成なの?」と困惑しました。Streaming LevelはPersistent Levelに重ねても良いし、重ねなくても良いんですね。

それぞれのStreaming LevelはAlways Loaded かBlueprintのどちらかをLevels Windowから選択出来るそうです。

どうやって。と思ったらこちらも公式のDocumentであるManaging Multiple Levels [18] で説明されていました。

f:id:kazuhironagai77:20210830012347p:plain

Always Loadedにセットされていると、Persistent Levelと同一のLevelと見なされるみたいですね。

このDocumentによる解説では、Always Loadedにセットされている限りLevel Streaming Volumeを使用してもBPかC++でprogrammingしても無視されるとあります。

ふーん。です。

ふーん。ですが「それならPersistent Levelのままでよくない。」と思いました。そしたらそれについてもこのDocumentにしっかり説明がありました。

その説明によると、今のGameはmapが大変広大で、複数のLevel Designerが同時に同じmapを制作するのが普通だそうです。そうしないと期限までにGame が完成しないらしいです。ただしUE4では複数で同じLevelにaccessして同時にそのLevel内の何かを変更する事は出来ないので、Streaming Levelで分割する事で、それぞれのLevelを同時に制作出来るようにしたそうです。

うーん。納得です。

となると、Level Streaming Volume、Programmingのどちらを使用するにしてもStreaming LevelのSeamlessなLoadをするためにはChange Streaming MethodはBlueprintにセットしないといけないと言う事ですね。

段々理解してきました。

<Dynamic Streaming Methods

私は、ActorをLevel上に配置した場合は、その「Actorを静的に生成した。」と言っています。そしてBPやUE4C++からActorを生成した場合は動的と呼んでいます。これはProgrammingの概念としても正しいはずです。

でも動的なStreamingって?何なんでしょう。

「じゃあ静的なStreamingもあるんですか?」って思ったんですが、要するにLevel Streaming Volumeを使用するかC++やBPのProgrammingを使用するかしてPlay中に新しいLevelを作成する事を動的と呼んでいるんでした。

それなら納得です。

<Level Streaming Volumes

いつ、Stream Levelを生成するかですが、Level Streaming Volumeは簡単です。View PointにLevel Streaming Volumeが侵入したらそのStream Levelを生成します。

はい。

これでいいですね。というかこれ以上の方法ってあるんでしょうか?

正しこのDocumentにはどうやったらLevel Streaming Volumeでセット出来るのかの説明はありませんでした。リンク先のLevel Streaming Volumes [19] で実際に使用する方法が解説されているみたいです。

Seamlessな広大なMapを生成するだけならここで、Level Streaming VolumesによるStream Levelの生成方法の勉強に突入しますが、今回の目的はあくまでLoad Stream Levelノードについての勉強です。

恐らくLoad Stream Levelノードを使用するであろう、Programmingを使用してのLevel Streaming を解説する次の節を続けて読んでいきます。

< Scripted Level Streaming >

いきなり下記の説明がありました。

f:id:kazuhironagai77:20210830012423p:plain

説明を読んだ限りでは、Level Streaming Volumeよりも複雑なstream LevelのLoadやUnloadをしたい時は、Load Stream Level やUnload Stream Level, 更にはGet Streaming Level function やCreate Instanceを使って自分で作成して下さい。とありました。

5.5 UE4 - Tutorial - Level Streaming! [11] を勉強する

大体理解しちゃったので、先程の「5.2 SeamlessなMapについて」で調べたTutorialを見ても理解出来るはずです。

UE4 - Tutorial - Level Streaming! [11]を見直します。

早速知らない事一つです。

Persistent Levelの下にStream Levelを新たに作成したい時はLevels WindowのLevelsの三角の部分をクリックしてCreate Newを選択すれば良いです。

f:id:kazuhironagai77:20210830012442p:plain

二つStream Levelを追加しました。

f:id:kazuhironagai77:20210830012455p:plain

Stream2が水色ですが、これはStream2が選択されている事を示してます。

Stream1を選択した状態で、

f:id:kazuhironagai77:20210830012508p:plain

Cubeを配置します。

f:id:kazuhironagai77:20210830012554p:plain

するとこのCubeはStream1に配置されます。

試しにStream1を見えないようにすると

f:id:kazuhironagai77:20210830012607p:plain

先程配置したCubeも消えています。

f:id:kazuhironagai77:20210830012620p:plain

Levels Windowにある以下の表示の部分をクリックするとそれぞれのLevel BPが開くそうです。

f:id:kazuhironagai77:20210830012634p:plain

試してみます。

f:id:kazuhironagai77:20210830012648p:plain

開きました。

これはLockだそうです。これがLockされた状態だとそのLevel内に配置されたものを編集する事は出来ないそうです。

f:id:kazuhironagai77:20210830012703p:plain

そのLevelが最後にSaveされた時から何らかの変更があった時は鉛筆のマーク、最後にセーブされた時から何の変更もない時はフロッピーディスクのマークになるそうです。

f:id:kazuhironagai77:20210830012719p:plain

ちなみにこのIconをDouble ClickするとSaveされます。

f:id:kazuhironagai77:20210830012732p:plain

このMessageがうざいので消そうとBuild Light Onlyを実行したら

f:id:kazuhironagai77:20210830012752p:plain

Errorになってしまいました。

World Outlinerを見たらそれぞれのLevelで同じActorを持っていました。

f:id:kazuhironagai77:20210830012806p:plain

f:id:kazuhironagai77:20210830012812p:plain

Tutorialではこうなってなかったんですが何ででしょう?

作り直しました。

今度はEmpty Levelを選択しました。

f:id:kazuhironagai77:20210830012826p:plain

今度は上手くいきました。

f:id:kazuhironagai77:20210830012839p:plain

Build Light Onlyも出来ました。

Tutorialとは少し違いますが、cubeとFloorもそれぞれStream1とStream2に配置しました。

f:id:kazuhironagai77:20210830012900p:plain

ここでLevel Streaming Volumesの使用方法についての説明をしてくれるのかと思ったらいきなりBPを開いてコードを書き始めました。どうやらこのTutorialではLevel Streaming Volumesの使用方法についての解説はなさそうです。

Persistent Levelを選択したまま、Trigger Boxを追加します。

そしてPersistent LevelのLevel Blueprintを開き以下のコードを追加します。

f:id:kazuhironagai77:20210830012915p:plain

やっとLoad Stream Levelノードが来ました。

もうこのノードの使用方法は大体ですが判明していますね。

やっぱりLoad Stream Levelノードの使い方を理解するためにはSeamlessなLoadについて勉強する必要があったんですね。

テストします。

Stream1に配置されているcubeは消えています。

f:id:kazuhironagai77:20210830012938p:plain

目の前にあるTrigger Boxに触れるとStream1が生成され、

f:id:kazuhironagai77:20210830012956p:plain

Cubeが現れました。

f:id:kazuhironagai77:20210830013009p:plain

今度はUnload Stream Levelの場合です。Trigger Boxから出たらStream1が消えるようにしました。

テストします。

Trigger Boxに入りました。

Cubeが発生しました。

f:id:kazuhironagai77:20210830013027p:plain

Trigger Boxから出ました。

Cubeは消えました。

f:id:kazuhironagai77:20210830013041p:plain

はい。

残りは同じ事をStream2で繰り返してるだけですのでスキップします。

5.6 HTF do I? Level Streaming using Blueprint Nodes in Unreal Engine 4 [12]を勉強する

もうLoad Stream Levelノードの使用方法は理解してしまったので、特にこのTutorialを見る必要はないんですが一応、理解に漏れがないか確認する意味で見ておきます。

What is Level StreamingというTutorialがあるのでLevel Streaming自体が分からない人はそっちを見て下さいと言っています。

調べたらありました。WTF Is? Level Streaming in Unreal Engine 4 [20] と言う名前でした。

これ見たら全て解決してたんでしょうか?

Always Loadedを使用した場合はBPではなくVolumeによって決定されると言っています。

f:id:kazuhironagai77:20210830013105p:plain

うーん。

少なくとも私が理解した限りではLevel Streaming Volumeを使用する時もBPにセットしないといけないはずです。これは要確認です。

以下の方法で既にLoadしたLevelかどうか確認しています。

f:id:kazuhironagai77:20210830013120p:plain

このやり方はいずれ使用する事になるでしょう。記録しておきます。

Actorを別なMapに間違って配置してしまった時の直し方についての説明がありました。

  1. そのActorを選択して切り取ります。
  2. 望みのMapを選択します。
  3. そこでPasteします。

これでActorは正しいMapに配置されるそうです。

以上です。

5.7 「Loading Screenの勉強の続き」のまとめ

Load Stream Levelノードの使用方法については完全に理解しました。Sub Levelについても同じです。Sub Levelとは言わずにStream Levelと言うみたいです。

Level Streaming Volumeを使用する場合は、確認が必要です。来週テストしてみます。

残念ながら、Load Stream Levelノードを使用したLoading Screenの勉強までは出来ませんでした。これは来週やります。

HTF do I? Loading Screens using Level Streaming in Unreal Engine 4 [14]も来週勉強します。

後、勿論、

f:id:kazuhironagai77:20210830013154p:plain

の使用方法についても来週勉強します。

6.Good Skyの復習

時間が無くなってしまいました。

7.まとめと感想

Niagaraの勉強以外は結構上手く出来ました。この調子で来週もがんばります。

来週は以下の勉強を予定しています。

  • Particle Systemの勉強
  • RPGの作成
    • Item Spawn Dataの複製
    • Loading Screenの勉強の続き
    • Good Skyの復習

以上です。

8.参考文献(Reference

[1] CGHOW. (n.d.). CGHOW. YouTube. Retrieved August 29, 2021, from https://www.youtube.com/c/cghow/playlists

[2] Beautypi. (n.d.). Shadertoy BETA. Shadertoy. Retrieved August 29, 2021, from https://www.shadertoy.com/

[3] vertexshaderart.com. (n.d.). vertexshaderart.com. Retrieved August 29, 2021, from https://www.vertexshaderart.com/

[4] Epic Games. (n.d.-d.). Niagara Visual Effects. Unreal Engine Documentation. Retrieved August 29, 2021, from https://docs.unrealengine.com/4.26/en-US/RenderingAndGraphics/Niagara/

[5] gameDevOutpost. (n.d.). UE4 - VFX. YouTube. Retrieved August 29, 2021, from https://www.youtube.com/playlist?list=PLomQNLPOWtzYXU_pRIUVVEV9uY7bjENZ5

[6] CGHOW. (2020, March 14). Intro to Niagara | Curl Noise | Point Attractor | Sine | Unreal Engine Niagara Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=I3G_rOQArQU&list=PLwMiBtF6WzsoNsDquipGfD-uLUb-fyRSV&index=7

[7] 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=1

[8] Wadstein, M. [Wadstein]. (2016, February 8). WTF Is? Material - Fresnel in Unreal Engine 4 [Video]. YouTube. https://www.youtube.com/watch?v=PLwEwIYX454

[9] 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

[10] Reids Channel. (2019, December 15). Unreal Engine 4 - Easy Loading Screen Tutorial - Blueprints Only [Video]. YouTube. https://www.youtube.com/watch?v=lzGcVDUDU5g

[11] Ashford, D. [Dean Ashford]. (2017, November 9). UE4 - Tutorial - Level Streaming! [Video]. YouTube. https://www.youtube.com/watch?v=XE2x4TZHxHg

[12] Wadstein, M. [Wadstein]. (2015, October 30). HTF do I? Level Streaming using Blueprint Nodes in Unreal Engine 4 [Video]. YouTube. https://www.youtube.com/watch?v=7JCBKCZbKh0

[13] Foster, S. [ Shaun Foster]. (2019, January 1). Level Streaming with Blueprints Unreal 4 [Video]. YouTube. https://www.youtube.com/watch?v=gPHcWOsCL0c

[14] Wadstein, M. [Mathew Wadstein]. (2015b, October 31). HTF do I? Loading Screens using Level Streaming in Unreal Engine 4 [Video]. YouTube. https://www.youtube.com/watch?v=QJVn2mW67YQ

[15] Epic Games. (n.d.-b). Level Streaming. Unreal Engine Documentation. Retrieved August 29, 2021, from https://docs.unrealengine.com/4.26/en-US/BuildingWorlds/LevelStreaming/

[16] Epic Games. (n.d.-a). Collaborate with Sublevels. Unreal Engine Documentation. Retrieved August 29, 2021, from https://docs.unrealengine.com/4.26/en-US/Basics/Levels/CollaborateWithSublevels/

[17] Epic Games. (n.d.-c). Level Streaming Overview. Unreal Engine Documentation. Retrieved August 29, 2021, from https://docs.unrealengine.com/4.26/en-US/BuildingWorlds/LevelStreaming/Overview/

[18] Epic Games. (n.d.-e). Managing Multiple Levels. Unreal Engine Documentation. Retrieved August 29, 2021, from https://docs.unrealengine.com/4.26/en-US/Basics/Levels/LevelsWindow/

[19] Epic Games. (n.d.-d). Level Streaming Volumes. Unreal Engine Documentation. Retrieved August 29, 2021, from https://docs.unrealengine.com/4.26/en-US/BuildingWorlds/LevelStreaming/StreamingVolumes/

[20] Wadstein, M. [Mathew Wadstein]. (2015a, October 30). WTF Is? Level Streaming in Unreal Engine 4 [Video]. YouTube. https://www.youtube.com/watch?v=ix1PDCr86lI