UE4の勉強記録

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

「Unreal Engine 4.xを使用してRPGを作成する」の足りない部分を作成する 雪山Mapの作成 Part 3

f:id:kazuhironagai77:20220403211922p:plain

<前文>

(先週、用事があって前文だけ前の週に書いておきました。2週間前は結構ホットなネタだったんですが、今はどうなんでしょう?もう常識になってしまったんでしょうか?)

アメリカ右派とロシア支持>

私は、アメリカ生活が長かったので政治的な思想は左派寄りなんですが日本に返ってくるとかなり右寄りになります。人間活動は住んでいる環境に影響受けるのは当然ですが、Minorityとしてアメリカで生活している時は、左派が何でも正しく思えて、日本で日本人として暮らしていると途端に右翼的な考えが正しく思えてきます。

そう言う訳で、政治思想ってやつはどんなに強く信条しているように見えても、それは所詮鏡に写った幻想と認識しています。環境が変わったら直ぐに変化するものなんです。

それでも一つだけ言えるのはFOX NEWSに代表されるアメリカ右派の考え方は間違っていると言う事です。

彼らの考え方に共通なのは中途半端な知識(特に科学法則)に基づいて評価、計画、実行するんです。

それは彼等の受けた教育が大学中退レベルで止まっているせいです。彼らの大学中退レベルの知識で評価、計画、実行したらそれりゃ必ず失敗します。その失敗から学ぶのならその先があるんですが、失敗すると彼らは必ず、有色人種をAffinity Actionで入れないといけないのでそれで計画通りの質を確保する事が出来ないので失敗した。と彼らに都合の良い言い訳を信じてその先を学ぼうとはしません。

それで同じ事を繰り返してずっと失敗し続けます。

しかしYouTubeなんかを見る層の90%の教育レベルは大学中退と同程度なので、FOX NEWSに代表されるアメリカ右派の考え方は物凄く受けが良いんです。彼らの想像上の世界では、FOX NEWSに代表されるアメリカ右派の唱える理想への実現方法は、何回失敗を繰り返しても単なる妄想ではなく実現可能かつ理想への最適手段に見えます。

そう言う訳で、FOX NEWSに代表されるアメリカ右派の考え方は常に間違っていますが、決して無くならないです。

そのFOX NEWSが今、猛烈にPushしているのがロシア支持です。

私は基本的に「FOX NEWSに代表されるアメリカ右派の考え方は常に間違えである。」と考えているので、FOX NEWSを見る事は無いです。ので彼らがどんな主張をしているのか最近まで全く知らなかったんですが、とんでもなくロシアを支持しているんです。

彼らの主張をまとめると以下の様になります。

  • アメリカとロシアが戦争したら第三次世界大戦になる。
  • 今の時点で既にアメリカ政府はウクライナに武器を供給している。これはロシアから見れば、アメリカがロシアに宣戦布告しているのと同じである。
  • バイデンの息子はウクライナ政府から違法な献金や旨みのあるBusinessを請け負っている。
  • バイデンは自分の息子の利権を守るために、いずれロシアとの戦争にアメリカ人の若者の命を差し出すはず。
  • 我々、アメリカ人は若者の命をバイデンのウクライナにおける利権を守るための戦いから守るため、更にアメリカがロシアと第三次世界大戦にならないために絶対にロシアの見方に立って行動すべき。もしくはこの戦争は無視して絶対に関わらないでいるべき。

となっています。

これ読むと、何で私が、高卒レベルと言わずに敢えて大学中退レベルといっているのが分かると思います。兎に角、一見するだけでは正しく見えるんです。

もしこれが、産油国と言っても過言ではないTexas州の電気の供給すら出来ずに大寒波が襲ってきてるときに大停電を起こして州民を凍死寸前まで追い込んでおいて自分たちだけはMexicoに逃げ込んだり、Pro Lifeと言って中絶を完全に禁止しておきながら孤児の面倒は全く見ない、アメリカ右派の精神的な支柱であるFOX NEWSが言っていなかったらある程度は信じたかもしれません。

普段、左派よりのNewsやRedditしか見ない私は、アメリカの言論界に、ウクライナ、ロシア戦争に対して左派と全く正反対の意見が右派から出て来ている事を知りませんでした。恐らく、大多数の日本人も知らないと思います。

私は彼らの意見は常に間違っていると思っていますが、FOX NEWSに代表されるアメリカ右派の考え方を信じる人達はアメリカ国内に40~50%はいるでしょう。

つまり40~50%のアメリカ人は実はロシア側を支持しているんです。

こういう事を知っておく事は日本人としても大切です。

と言う事で今週は、ロシアを支持する右派アメリカ人たちの紹介をしました。

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

<本文>

1.今週の予定

今週も以下の内容をやっていきます。

  • Niagara: CGHOW氏のTutorialをやる
  • Material :Projectionの勉強の復習
  • RPGStoryの改善
  • Open Worldの検証
  • World Machineの勉強
  • 雪山のMapの作成
  • Game DesignポケモンHxHの念能力(戦闘システムの作成)
  • Blenderの勉強

2.Niagara: CGHOW氏のTutorialをやる

2.1 先週までの復習

一週間、お休みしたら何が目的なのか忘れてしまいした。

2022-03-14のBlogを見直したら、一年間Niagaraを勉強して来たので、これからはCGHOW氏のTutorialを勉強した後で、更にアニメ風のEffectに自分で改良してみる。とみたいな感想が書かれていました。

先々週は、試しにCoinのEffectのCoinの部分をアニメ風に改造してみたんですが、かなり上手くいかない。

その理由に以下の問題点が出て来ました。

  • 黒枠、もしくは線画の作成が上手く出来ない
  • Toon Shadingを被せると、地味になる。

これらは、Materialの問題なのでMaterialで解決する事になりました。

<単純なToon Shadingだけではアニメ調にならない>

先々週のBlogを読み直していてToon Shadingに関して一個記録するのを忘れていた内容がありました。それをここにまとめておきます。

f:id:kazuhironagai77:20220403212049p:plain

SaturationとValueがほぼ1となると選択出来る色がかなり限られます。

Coinの色を単純にToon調にすると

f:id:kazuhironagai77:20220403212108p:plain

SaturationとValueは1からは程遠い値になります。

これがアニメ調に見えない原因です。

2.2 CGHOW氏のTutorialの何かをやる

一寸、目を離したら、CGHOW氏のUE5 Previewを使用したTutorial、とんでも無く増えていました。

f:id:kazuhironagai77:20220403212137p:plain

うーん。

一寸私のPCでUE5 Previewを使用してGPU全開でParticleを生成するEffectを作成するのは不安ですね。

一寸、前のTutorialでIceを作成しているEffectがありました。

f:id:kazuhironagai77:20220403212157p:plain

あ。

今。思い出したんですが、元々、VFXの勉強の目的で魔法を表現すると言うのがありました。すっかり忘れていました。

探したら見つかりました。

2021-08-02のBlogで以下の様なまとめがありました。

f:id:kazuhironagai77:20220403212212p:plain

これはこれで後でまとめ直す必要がありますね。

今、簡単に見直すと、砂以外のEffectの(今のGame業界で規準となっている)作成方法はそれなりには分かりますね。

でもこの辺をまとめ直すのも大切ですね。

決めました。

今週は、AOE ICE in UE4 Niagara Tutorial | Download Files [1]を勉強します。

2.3 AOE ICE in UE4 Niagara Tutorial | Download Files [1]を軽く見る

一回、軽く見ましたが結構複雑でした。

うーん。

全部、今週だけでやるのは無理でしょうね。以下に示したIce Pillarだけ作成する事にします。

f:id:kazuhironagai77:20220403212236p:plain

作成方法を以下に簡単にまとめます。

<Static Mesh

Static Meshの作成部分です。

f:id:kazuhironagai77:20220403212300p:plain

このTutorialだと作成方法の説明はないです。

うーん。

正直、どうやってこの歪みを作成してるのか分かりません。

円柱を元に、Vertexを追加してそのVertexを少しだけ移動させると出来るのかもしれません。そんな感じで作成しています。

<Material

以下に使用しているMaterialの実装を示します。

f:id:kazuhironagai77:20220403212325p:plain

この部分はTutorialでかなり詳しい解説がされているのでそれを勉強しながら作成します。

Niagaraの設定>

Niagaraの設定についてです。

f:id:kazuhironagai77:20220403212347p:plain

かなり急ぎ足で解説しています。

うーん。

説明している全部のModuleを追うのは難しいかもしれません。

出来るだけ頑張って再現します。

2.4 AOE ICE in UE4 Niagara Tutorial | Download Files [1]を実装する

<Ice Pillarの3D Modelを作成する>

Blenderで以下の様なStatic Meshを作成しました。

f:id:kazuhironagai77:20220403212410p:plain

うーん。

でも上から見ると

f:id:kazuhironagai77:20220403212435p:plain

円柱の上面が一枚のMeshになっています。

これをそれぞれのVertex毎にEdgeで結んでMeshを分割したいんです。

色々調べたら出来ました。

f:id:kazuhironagai77:20220403212457p:plain

うーん。でも何か違う。

最終的に以下の様になりました。

f:id:kazuhironagai77:20220403212515p:plain

うーん。

やっている内に三角形と四角形のMeshが生成したんですが、どっかで3d Modelを作成する時はMeshは全部四角形にする必要があるって聞いた事があります。

ただTessellationの段階でVertexが構成する三角形が自動で生成されるはずで、その辺の関連性がどうなっているのか分からないです。

UE5にImportしました。

f:id:kazuhironagai77:20220403212535p:plain

これを使用してやってみます。

<Materialの実装>

そっくりに作成しました。

f:id:kazuhironagai77:20220403212610p:plain

Tutorialの解説に従って実装を見てみます。

Fresnelノードの実装です。

f:id:kazuhironagai77:20220403212630p:plain

FresnelノードのPreviewです。

f:id:kazuhironagai77:20220403212648p:plain

これかなり綺麗ですね。

次は以下の部分です。

f:id:kazuhironagai77:20220403212709p:plain

結果です。

f:id:kazuhironagai77:20220403212725p:plain

Tutorialの結果とは一寸だけ違いますね。

f:id:kazuhironagai77:20220403212745p:plain

Dynamic ParameterのOffsetの値を下げてみました。

f:id:kazuhironagai77:20220403212812p:plain

結果です。

f:id:kazuhironagai77:20220403212830p:plain

うーん。

完璧に一致はしませんでしたが、何とかなりそうですね。

このままやって行きます。

更に200で割ります。

f:id:kazuhironagai77:20220403212847p:plain

結果です。

f:id:kazuhironagai77:20220403212905p:plain

Tutorialによると200で割る事でFade感を出すそうです。

確かに下に示したTutorialのPreviewに表示されているのはFade感があります。

f:id:kazuhironagai77:20220403212923p:plain

私のは無いですね。もっと大きな値で割る事にします。

試しに1000で割ってみました。

f:id:kazuhironagai77:20220403212942p:plain

その後、Smooth Stepノードに繋げています。

f:id:kazuhironagai77:20220403212959p:plain

結果です。

f:id:kazuhironagai77:20220403213017p:plain

あれ。

Fadeが無くなってしまいました。

Smooth Step ノードのMaxの値を上げてみました。

f:id:kazuhironagai77:20220403213036p:plain

結果です。

f:id:kazuhironagai77:20220403213054p:plain

戻りましたね。

Niagaraの作成>

大体Tutorial通りの作成で出来たんですが、Scale Mesh Sizeノードを使用するとMeshが消えてしまいます。

f:id:kazuhironagai77:20220403213122p:plain

中の実装を見ると

f:id:kazuhironagai77:20220403213139p:plain

値が0になる可能性があるのはInput のInitial Mesh Scaleだけです。

Initial Mesh ScaleにPassする値を、

f:id:kazuhironagai77:20220403213153p:plain

から

f:id:kazuhironagai77:20220403213210p:plain

に変えてみました。

結果です。

f:id:kazuhironagai77:20220403213243g:plain

出来ました。

f:id:kazuhironagai77:20220403213321p:plain

うーん。

氷っぽいと言えば氷ですが、うーん。

<Scale Mesh Sizeノードを使用するとMeshが消える理由>

Scale Mesh Sizeノードを使用するとMeshが消える理由が分かりました。

Particle Spawn SectionのInitial Mesh Particle Moduleの

f:id:kazuhironagai77:20220403213346p:plain

Mesh Scale Modeをセットするのを忘れていました。

以下の様にセットしたら

f:id:kazuhironagai77:20220403213409p:plain

Particle Update SectionのScale Mesh Size Moduleの

f:id:kazuhironagai77:20220403213426p:plain

Initial Mesh ScaleにScaleがセットされた状態でも

f:id:kazuhironagai77:20220403213442p:plain

Meshが表示されるようになりました。

f:id:kazuhironagai77:20220403213500p:plain

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

3.Material : Projectionの勉強の復習

3.1 先週の仮説の確認

先週、以下の仮説を思い付きました。

Signノード>

f:id:kazuhironagai77:20220403213531p:plain

<-1>

f:id:kazuhironagai77:20220403213552p:plain

<Vertex Normalを掛ける>

f:id:kazuhironagai77:20220403213614p:plain

が、確認する時間がなかったので今回それをやります。

もしこれらの仮説が正しいなら、Textureの向きを直すのに別にTutorial通りのやり方をする必要もなくなります。

逆に言えば、Tutorial通りのやり方をしている人は本当の意味でProjectionしたTextureの操作を理解していない。と言えるでしょうから時間をかけて検討する価値は十分あります。

3.2 ProjectionしたTextureに-1を掛ける

一番、単純なTextureに-1を掛ける場合から検討します。

f:id:kazuhironagai77:20220403213641p:plain

Improved Tri-Planar Projectionを使用して実験します。

f:id:kazuhironagai77:20220403213701p:plain

f:id:kazuhironagai77:20220403213712p:plain

Improved Tri-Planar ProjectionはTextureにGridを使用しているので上下左右裏表がはっきり分かるからです。

Z軸にProjectionしているTextureに、以下の様に-1を掛けました。

f:id:kazuhironagai77:20220403213728p:plain

結果です。

Top Viewです。

f:id:kazuhironagai77:20220403213746p:plain

f:id:kazuhironagai77:20220403213801p:plain

となりました。

あー。

そりゃそうだ。

Textureの色を構成しているRGBは0から1までの値なので-1を掛けたら0以下になるだけでした。

-1から1までの値で構成されているNormal Mapでやらないと駄目だったんです。

先週、作成したNormal MapのProjectionをResult ノードのBase Colorに繋ぎ直しました。

f:id:kazuhironagai77:20220403213820p:plain

f:id:kazuhironagai77:20220403213836p:plain

これを使って試験します。

Z軸にProjectionしたTextureのZの値に-1を掛けます。

f:id:kazuhironagai77:20220403213853p:plain

予想が正しければ、以下の図が

f:id:kazuhironagai77:20220403213911p:plain

となるはずです。

f:id:kazuhironagai77:20220403213927p:plain

結果です。

Top Viewです。

f:id:kazuhironagai77:20220403213945p:plain

f:id:kazuhironagai77:20220403214002p:plain

となりました。

予測通りです。

Bottom Viewです。

f:id:kazuhironagai77:20220403214020p:plain

f:id:kazuhironagai77:20220403214040p:plain

になっています。

これも合っています。

当然ですが他の軸のTextureの向きは全く変化していません。一応、確認しました。

今度はX軸、Front ViewとBack Viewに-1を掛けてみます。

何もしていない状態のFront Viewです。

f:id:kazuhironagai77:20220403214057p:plain

当然ですが、赤いです。変化が見やすいので-1はX軸に対して掛けます。

f:id:kazuhironagai77:20220403214117p:plain

f:id:kazuhironagai77:20220403214135p:plain

になるはずです。

結果です。

Front viewです。

f:id:kazuhironagai77:20220403214156p:plain

X軸が逆になっています。

Back Viewです。

f:id:kazuhironagai77:20220403214222p:plain

これも逆になっています。

予測の通りです。

他の面も確認しましたが、他の部分の変化は全くありません。

これらの実験から、Tri-Planar ProjectionでNormal MapをTextureとして使用した場合、それぞれのProjectionのTextureのRGBのどれかに-1を掛けるとそのRGBが示している軸の向きを反対にする機能がある事が確認出来ました。

3.3 ProjectionしたTextureSign(以下の式)を掛ける

以下に示した実装を掛けます。

f:id:kazuhironagai77:20220403214248p:plain

先週の仮説によれば、この実装を掛けると軸の負の部分だけ逆になるはずです。

f:id:kazuhironagai77:20220403214304p:plain

先週のこの説明は正確性少し足りないので補足します。

負の軸だけ逆にする実装は実際には以下のものになります。

f:id:kazuhironagai77:20220403214325p:plain

先週の実装はX軸のProjectionだけは向きが逆だったので-1を掛けています。のでその部分が正確ではないです。

更に、どのProjectionに対しても負のX軸の向きだけを変えたい場合は、Rの値を掛けます。この事をしっかり述べていなかったです。

3.2で-1を以下の場所に掛けた時、

f:id:kazuhironagai77:20220403214352p:plain

という結果になりました。

f:id:kazuhironagai77:20220403214409p:plain

と言う事は、上記の実装の計算結果が正の部分は1、負の部分が-1であるならば、

f:id:kazuhironagai77:20220403214428p:plain

となって仮説が正しい事が証明出来ます。

それでは実装の計算を見てみましょう。

f:id:kazuhironagai77:20220403214448p:plain

まずSignノードが繋がっています。

以下に示した様にSignノードの機能は全ての値を1か-1に変換します。

f:id:kazuhironagai77:20220403214504p:plain

と言う事は可視化した時に黒い部分は-1、それ以外の色は1と言う事になります。

以下の実装でX軸の結果を可視化します。

f:id:kazuhironagai77:20220403214523p:plain

尚、結果を分かり易くするために1の代わりに0を掛けています。

結果です。

f:id:kazuhironagai77:20220403214541p:plain

見事にX軸の正が1、負が-1になっています。

今度は、Y軸の結果を可視化します。

f:id:kazuhironagai77:20220403214602p:plain

見事にY軸の正が1、負が-1になっています。

良く考えたら負の値が-1であるかどうかは不明ですね。0かもしれませんし。

以下の方法で確認します。

f:id:kazuhironagai77:20220403214622p:plain

X軸の負が-1なら0.5になっているはずです。

f:id:kazuhironagai77:20220403214642p:plain

X軸の正の値は1.5ですが1以上は同じ値なので、左側の半分の赤さならX軸の負は0.5 であると言えるはずです。

つまり以下に示したこの部分の計算は

f:id:kazuhironagai77:20220403214705p:plain

Projectionした軸の正に1、負に-1を掛けているだけでした。

その結果、以下に示した様に例えばZ軸にProjectionしたNormalのZ軸にこの実装を掛けると

f:id:kazuhironagai77:20220403214723p:plain

以下の結果になります。

f:id:kazuhironagai77:20220403214739p:plain

これも仮説の通りでした。

3.4 ProjectionしたTextureにVertex Normal WSノードを掛けたり足したりする

f:id:kazuhironagai77:20220403214807p:plain

Vertex Normal WSノードを掛けた軸の負の値だけが反転します。

f:id:kazuhironagai77:20220403214823p:plain

これはある条件でした試していないので、確認も必要です。

そこからやって行きます。

X軸にProjectionした場合にX軸にVertex Normal WSノードを掛けた時は

f:id:kazuhironagai77:20220403214845p:plain

となります。

では、以下に示した様にX軸にProjectionした場合にY軸にVertex Normal WSノードを掛けた時はどうなるんでしょうか?

f:id:kazuhironagai77:20220403214905p:plain

試してみます。

f:id:kazuhironagai77:20220403214924p:plain

f:id:kazuhironagai77:20220403214941p:plain

となりました。

うーん。

良く分かりません。

3番目の計算方法は良く分かりません。

これは保留する事にします。

3.4 1と2のみを使ってTri-PlanarのNormal MapのProjectionを作成してみる

1と2の技術のみを使用して先週作成したTri-PlanarのNormal MapのProjectionを作成してみます。

まず上下左右のあるTexture用のTri-PlanarのProjectionを作成しました。

f:id:kazuhironagai77:20220403215005p:plain

Textureは既にNormal Mapに変更してあります。

まず軸の向きだけ直しました。

f:id:kazuhironagai77:20220403215019p:plain

結果です。

f:id:kazuhironagai77:20220403215041p:plain

今度はそれぞれの軸に対してのProjectionの向きの間違いを直して行きます。

この時点でぞれぞれの軸に対してProjectionしたNormal Mapの向きは以下の様になっているはずです。

f:id:kazuhironagai77:20220403215057p:plain

確認しました。

この結果と同じでした。

ここから私独自のやり方でNormal Mapの向きを直します。

まず-1を掛けます。

x軸のyとz、Y軸のzに-1を掛けます。

すると以下の結果になるはずです。

f:id:kazuhironagai77:20220403215114p:plain

実装しました。

f:id:kazuhironagai77:20220403215131p:plain

結果です。

f:id:kazuhironagai77:20220403215147p:plain

表にしました。

f:id:kazuhironagai77:20220403215205p:plain

はい。

予想と同じ結果になりました。

次に、以下にSignノードを使用した実装によって軸の負だけ逆なTextureを直します。

f:id:kazuhironagai77:20220403215222p:plain

試しにX軸だけやってみます。

以下に示した様に実装しました。

f:id:kazuhironagai77:20220403215239p:plain

Front Viewです。

f:id:kazuhironagai77:20220403215603p:plain

全部合っています。

Back Viewです。

f:id:kazuhironagai77:20220403215619p:plain

これも全部合っていますね。

Y軸、z軸も同様に直しました。

f:id:kazuhironagai77:20220403215639p:plain

Y軸の負から見た図です。Left Viewに当たります。

f:id:kazuhironagai77:20220403215657p:plain

合っています。

Z軸の負から見た図です。Bottom Viewに当たります。

f:id:kazuhironagai77:20220403215712p:plain

合っています。

うーん。出来たみたいですが確認します。

View ModeをWorld Normalにセットします。

f:id:kazuhironagai77:20220403215729p:plain

結果です。

f:id:kazuhironagai77:20220403215746p:plain

むむむ。

全部のProjectionの向きは合っていました。

しかし私の作成したNormal MapのProjectionは境界がはっきり見えています。

Tutorialのやり方だとどの向きから見ても正しいNormal Mapになっています。

以下にTutorial通りに作成したNormal Map用のTri-PlanarのProjectionとの比較を示しておきます。

f:id:kazuhironagai77:20220403215806p:plain

おお。

やっぱり、今回理解出来なかった最後の式にもっと大きな秘密が有りそうです。

TutorialのTop Viewを見ると

f:id:kazuhironagai77:20220403215830p:plain

左上は青の部分が多く

f:id:kazuhironagai77:20220403215851p:plain

右下の部分が青の部分が小さくなっています。

f:id:kazuhironagai77:20220403215914p:plain

うーん。

まだまだ奥が深いですね。

しかしもうそろそろProjectionの勉強は終わりにして次の勉強を始めます。

3.5 Tri-PlanarのProjectionを勉強してみて

今週はTri-PlanarのProjectionを総括するつもりだったですが、逆にまだまだ分からない要素が沢山ある事が逆に判明しました。のでまとめるのは止めておきます。今回のProjectionの勉強はここまでとしますが、また自分のMaterialに関する理解のLevelが上がった時にもう一回Challengeする事にします。

4.Materialの勉強:Toon Shading

今週は特別に更にBen 先生のToon Shader Paint - Shader Graph Basics - Episode 38 [2]を勉強します。

4.1 Toon Shader Paint - Shader Graph Basics - Episode 38 [2]を軽く見る

Unityで解説しています。

UEでも実装方法が紹介されていますが、UEだとDirectional Lightの光の角度の情報をUnityのMaterialの様に得る事は出来ないそうです。

何か最初から躓いてしまいましたが、以下に内容を簡単にまとめます。

  • Toon Shadingには3つの要素がある。PaintingSpecular Painting、そしてDark Outlineです。今週はこの中のPaintをやります。
  • LightingShader内で自分で作成するのでそのための設定をする必要がある

f:id:kazuhironagai77:20220403220013p:plain

  • Gradientを段々に変化させる

f:id:kazuhironagai77:20220403220044p:plain

  • 数学的に実装

f:id:kazuhironagai77:20220403220133p:plain

  • Textureを使用した方法

f:id:kazuhironagai77:20220403220155p:plain

  • UEでの実装方法

大体理解しました。技術的、数学的に理解するのが難しい所はなさそうです。やってみます。

4.2 Toon Shader Paint - Shader Graph Basics - Episode 38 [2]を実装する

まずResult NodeのShading Modelの設定をUnlitにします。

f:id:kazuhironagai77:20220403220224p:plain

UEやUnityはLightingはEngineが勝手に計算します。のでそれを止めるための処置です。

まず最初のDot Productの部分です。

f:id:kazuhironagai77:20220403220241p:plain

UEではDirectional Lightの方向を得る事が出来ないので0.7、0.7、0.7で代用します。

計算結果の値が-1から1までなので0~1に変更します。

f:id:kazuhironagai77:20220403220301p:plain

いつもの計算です。

結果です。

f:id:kazuhironagai77:20220403220341p:plain

この計算結果をTextureのU値にして以下に示したようにTexture Sampleノードに繋ぎます。

f:id:kazuhironagai77:20220403220403p:plain

使用するTextureは以下に示した様に64x64で自分で作成しました。

f:id:kazuhironagai77:20220403220422p:plain

以下に示した様にTutorialのとは多少形が違いますが、これで試してみます。

f:id:kazuhironagai77:20220403220439p:plain

SRGBをOffにします。

f:id:kazuhironagai77:20220403220456p:plain

Compression  Settingsの設定をUser Interface 2Dにします。

f:id:kazuhironagai77:20220403220513p:plain

これを選択する事でFormat の設定が

f:id:kazuhironagai77:20220403220545p:plain

となります。

Unityの解説ではTiling MethodをClampにしろ。と言っていたんですがUEでは何も言いませんね。

f:id:kazuhironagai77:20220403220605p:plain

一応、Clampにしておきます。

このTextureをTexture Sampleにセットして以下に示した実装を足します。

f:id:kazuhironagai77:20220403220627p:plain

結果です。

f:id:kazuhironagai77:20220403220645p:plain

おお。

綺麗な段々が出来ています。

以下の部分の値を変える事で別の段々を表示する事が出来ます。

f:id:kazuhironagai77:20220403220702p:plain

0.2に変えました。

f:id:kazuhironagai77:20220403220720p:plain

0.3です。

f:id:kazuhironagai77:20220403220739p:plain

以上でした。

<計算で色の段々を作成する方法>

UEの実装の方ではUnityで紹介されていた計算で色を段々にする方法が実装されていなかったのでそれも実装しました。

f:id:kazuhironagai77:20220403220803p:plain

以下のような結果になりました。

f:id:kazuhironagai77:20220403220822p:plain

色を付けました。

f:id:kazuhironagai77:20220403220844p:plain

結果です。

f:id:kazuhironagai77:20220403220902p:plain

うーん。黒い部分は要らないです。

Lerp ノードで試してみます。

f:id:kazuhironagai77:20220403220917p:plain

結果です。

f:id:kazuhironagai77:20220403220935p:plain

うーん。

等間隔なのは納得出来ないですが、こっちの方が良いですね。

肌色っぽい色で作成してみました。

f:id:kazuhironagai77:20220403220953p:plain

うーん。

かなり良いかもしれません。

まだ、考察する時ではないので今週のToon Shadingの勉強はここまでとします。

5.RPGStoryの改善

5.1 Start MenuのSkipの作成

まずはSkip Buttonを表示するためのWidgetを作成します。

f:id:kazuhironagai77:20220403221025p:plain

以下のWidgetが表示されたらSkip Buttonは消える様にしました。

f:id:kazuhironagai77:20220403221042p:plain

Skip Buttonを押したらStart Menu Widgetが、Animationが終わる前に表示されるようにします。

Skip Buttonを押すと以下のEvent dispatcherが発動します。

f:id:kazuhironagai77:20220403221057p:plain

更にLevel BP内でそのEvent Dispatcherに以下の実装をBindします。

f:id:kazuhironagai77:20220403221114p:plain

これでSkip Buttonを押したら直ぐにStart Menu Widgetが表示されるはずです。

更にSkip Buttonが押された時は、2回Start Menu Widgetを作成しないように以下の実装も追加しました。

f:id:kazuhironagai77:20220403221132p:plain

テストします。

Skip Buttonが押されてから以下のWidgetが表示されるまで2秒位かかります。何でなんでしょう?

f:id:kazuhironagai77:20220403221147p:plain

Start Menu Widgetの Event ConstructでAnimationをPlayするようにセットされているせいでした。

f:id:kazuhironagai77:20220403221202p:plain

Skip ButtonをClickした時としない時で実装を変更しました。

f:id:kazuhironagai77:20220403221217p:plain

どっちを選択するかは以下に示したようにExpose on Spawnに新しい変数を追加する事で決定します。

f:id:kazuhironagai77:20220403221232p:plain

テストします。

Skip Buttonを押すと直ぐにStart Menu が表示されます。

f:id:kazuhironagai77:20220403221259p:plain

後ろのAnimationやBGMの変更は来週やります。

<操作の説明の直し>

直しました。

f:id:kazuhironagai77:20220403221320p:plain

<Game を始めるボタンの直し>

f:id:kazuhironagai77:20220403221343p:plain

直しました。

f:id:kazuhironagai77:20220403221427p:plain

<Playerの操作するキャラの職業と所持金を直す>

f:id:kazuhironagai77:20220403221449p:plain

直しました。

f:id:kazuhironagai77:20220403221505p:plain

弟子になっています。

f:id:kazuhironagai77:20220403221523p:plain

金貨の枚数は0枚です。

f:id:kazuhironagai77:20220403221543p:plain

<昼と夜の時間>

f:id:kazuhironagai77:20220403221607p:plain

歩数で変化するのは実装方法を考える必要があるので、取りあえずは時間で管理します。

Map1のLevel BPの変数であるTime of Dayの値を

f:id:kazuhironagai77:20220403221626p:plain

30分に変更しました。

f:id:kazuhironagai77:20220403221642p:plain

これで一日の長さが30分になるはずです。

テストのためにPlayしていたんですが道具屋で道具が売れない事に気が付きました。

f:id:kazuhironagai77:20220403221702p:plain

これも後で直します。

15分位で暗くなりました。

f:id:kazuhironagai77:20220403222038p:plain

あんまりGameをしない私は15分位Gameをしただけでほんの少しですが気持ち悪くなりました。

宿屋に泊まれるようにします。

f:id:kazuhironagai77:20220403222111p:plain

宿屋の主人を配置しましたが色々オカシイです。

f:id:kazuhironagai77:20220403222129p:plain

まずSoldierと表示されています。

f:id:kazuhironagai77:20220403222148p:plain

ここは名前を表示するのか職業を表示するのか決める必要があります。

会話ボタンを選択すると以下に示した様に神殿のWidgetが表示されてしまいます。

f:id:kazuhironagai77:20220403222206p:plain

これは間違いです。後で直します。

泊まるを押すと所持金がないので「冷やかしなら帰りな!」と表示されます。

f:id:kazuhironagai77:20220403222228p:plain

この時のPlayerはまだMonsterを倒す手段がないのでお金を稼ぐ事は出来ないはずです。

このセリフで良いのかを検討する必要があります。

<裏道にItemを配置する>

f:id:kazuhironagai77:20220403222255p:plain

裏道にItemを配置します。

門の出口に回復薬を一個配置しました。

f:id:kazuhironagai77:20220403222311p:plain

その少し奥にNPCも一体配置しました。

f:id:kazuhironagai77:20220403222338p:plain

セリフはまだ考えていません。

更に武器を拾える場所への入り口にもNPCを配置しました。

f:id:kazuhironagai77:20220403222401p:plain

今の所、これらのItemやNPCは静的に配置していますが、後で動的に生成するように変更します。

更にこれらのNPCのセリフも後で追加します。

<剣を拾っても剣が消えないバグ>

f:id:kazuhironagai77:20220403222425p:plain

もうどんな仕組みでItemを作成していたのか覚えていません。その辺の確認から始めます。

Sub Levelの3-3のEvent Begin Playで以下の様に生成していました。

f:id:kazuhironagai77:20220403222446p:plain

Spawn Items関数の中を見ると

f:id:kazuhironagai77:20220403222503p:plain

Boolean関数SpawnがTrueの時だけItemを生成するようになっています。

Pickup Item Widgetの拾うボタンを押すと

f:id:kazuhironagai77:20220403222521p:plain

以下のコードが実行されますが、

f:id:kazuhironagai77:20220403222540p:plain

この中の以下のNodeが上手く働いていないようです。

f:id:kazuhironagai77:20220403222617p:plain

Target 先にはMy Dropped Itemがあります。

f:id:kazuhironagai77:20220403222639p:plain

My Dropped ItemはこのWidgetが生成される時にGame Mode Base BPのDropped Item Contentからパスされています。

f:id:kazuhironagai77:20220403222657p:plain

Game Mode Base BPのDropped Item Contentが他に使用されている箇所を探します。

Dropped Item Base BP

f:id:kazuhironagai77:20220403222719p:plain

内で見つかりましたが、

f:id:kazuhironagai77:20220403222741p:plain

何と、Game Mode BPではなくGame Instance BP にあるDropped Item ContentにItemの値をセットしていました。

むむ。

ひょっとしてこれが間違いか?

取りあえずGame Instance のDropped Item Contentを参照する様にしました。

f:id:kazuhironagai77:20220403222802p:plain

テストします。

Itemの剣を取ると

f:id:kazuhironagai77:20220403222819p:plain

消えました。

直った?

うーん。地面に落ちているItemを拾って実装する方法をまだ完全に思い出していないのであんまり自信はないです。

これは来週、もう一回検証します。

<警告を直す>

f:id:kazuhironagai77:20220403222847p:plain

警告を表示するBPが2個セットされているだけでした。

直しました。

<Levelの上がる速度を遅くする>

f:id:kazuhironagai77:20220403222914p:plain

Levelが上がる為に必要な経験値を以下の様に変更しました。

f:id:kazuhironagai77:20220403222931p:plain

Playerの操作するキャラのLevel Upを管理するData Tableの

f:id:kazuhironagai77:20220403222949p:plain

設定を以下の様に変更しました。

f:id:kazuhironagai77:20220403223005p:plain

テストします。

f:id:kazuhironagai77:20220403223037p:plain

4体のMonsterを倒した所でLevelが2に成りました。

Monsterと戦って思ったのが、Monsterを倒してもお金が貰えない事です。

後で、お金が貰えるようにします。

<最初の魔法について>

f:id:kazuhironagai77:20220403223102p:plain

色々試してみるのが良いと思ったのでやってみます。

魔法の性能を管理しているData TableであるMagics

f:id:kazuhironagai77:20220403223117p:plain

の値を以下の様に変えました。

f:id:kazuhironagai77:20220403223137p:plain

使用するのに必要なMPを前の2倍にする代わりにダメージも2倍にしました。

テストして確認します。

出来ていました。

実際にPlayして確認したのですが実際に魔法が使用出来る様になるまでに10分近くかかりました。

結構遊べます。

<戦闘後の報酬について>

f:id:kazuhironagai77:20220403223212p:plain

これ、毎回もらえないとPlayするのが大変苦しいです。

このままにしておきます。

f:id:kazuhironagai77:20220403223303p:plain

調べたらボタンを別なWidgetで作成していて直すのが結構面倒です。

f:id:kazuhironagai77:20220403223322p:plain

ので今回は直すのは延期します。

ただしボタンの見た目だけ直しました。

f:id:kazuhironagai77:20220403223343p:plain

むー。

返って読みづらくなってしまいました。

<道具屋の直し>

f:id:kazuhironagai77:20220403223411p:plain

今回、道具屋で直すのは

  • 職業で買える道具を変える。
  • 道具を売れるようにする。
  • 切符は普通の切符だけ買えるようにする。

の3つです。

<<職業で買える道具を変える>>

職業で買える武器を変えた武器屋のやり方は当然、すっかり忘れてしまったのでそれの復習からやります。

f:id:kazuhironagai77:20220403223445p:plain

何と、専用のData Tableを作成していました。

f:id:kazuhironagai77:20220403223502p:plain

これでどの職業ならどの武器が買えるのかをチェックしていました。

うーん。

成程。

これのItem版をまず作成します。

f:id:kazuhironagai77:20220403223520p:plain

出来ました。

以下の部分のItem版を作成します。

f:id:kazuhironagai77:20220403223542p:plain

出来ました。

f:id:kazuhironagai77:20220403223556p:plain

テストします。

f:id:kazuhironagai77:20220403223616p:plain

出来ていますね。

<<道具を売れるようにする>>

まず武器はどうやって売っているのかを確認します。

以下のWidgetが武器の売りを担当していました。

f:id:kazuhironagai77:20220403223639p:plain

f:id:kazuhironagai77:20220403223647p:plain

まずこれをCopyして道具用に改良します。

「出る」ボタンをClickした時にOffにする以下の変数の意味が分かりません。

f:id:kazuhironagai77:20220403223711p:plain

調べます。

以下のWidgetで使用されていました。

f:id:kazuhironagai77:20220403223729p:plain

何と、武器を装備する時ためのボタンと武器を売る、更に武器を買う為のボタンが全てこのWidgetから作成されていました。

そして上記のWeapon Shop Sellはこのボタンが押された時に、武器屋で武器を売るときに押された事を示すのが目的でした。

うーん。

道具を売る為のボタンのWidgetは別に作成します。

以下の様になりました。

f:id:kazuhironagai77:20220403223745p:plain

f:id:kazuhironagai77:20220403223754p:plain

f:id:kazuhironagai77:20220403223806p:plain

所持品に追加するためのボタンWidgetを作成します。

まず武器のボタンのように全部を一まとめにする事は止めます。

止めますが、道具を売る以外の、道具を使用する、道具を買う。を管理しているWidgetがあるはずです。それをまず見つけます。

f:id:kazuhironagai77:20220403223827p:plain

f:id:kazuhironagai77:20220403223837p:plain

ありました。

Designは全く同じにします。

ボタンを押したら、Itemの金額をPlayerの財布に追加して、ItemそのものはPlayerの道具袋から消します。

f:id:kazuhironagai77:20220403223908p:plain

武器屋で武器を売った時はその後で更にあるWidgetを消しています。

f:id:kazuhironagai77:20220403223921p:plain

これが何をしているのかが不明です。調べます。

f:id:kazuhironagai77:20220403223938p:plain

CursorをButtonの上に乗せた時に表示されるWidgetでした。

f:id:kazuhironagai77:20220403223959p:plain

同様の機能は道具のボタンにもありますので、この機能を追加します。

f:id:kazuhironagai77:20220403224016p:plain

追加しました。Item Widgetにある実装と全く同じやり方でやりました。

最後にShop Sell Widget

f:id:kazuhironagai77:20220403224033p:plain

Create widgetに先程作成したボタンであるItem Sell Widgetを選択します。

f:id:kazuhironagai77:20220403224049p:plain

テストします。

f:id:kazuhironagai77:20220403224107p:plain

回復薬を2個持っている状態で道具屋に行きました。

回復薬を1個売りました。

金貨の枚数が5枚になりました。

更に回復薬にCursorを合わせると回復薬の説明をするWidgetも表示されています。

出来ています。

<<切符は普通の切符だけ買えるようにする>>

これは既に直しています。

職業が弟子の時に、道具屋を訪れると

f:id:kazuhironagai77:20220403224142p:plain

しか買う事が出来ません。

<<職業を表示させる>>

道具屋で買い物をする時は、Playerの操作するキャラの職業が表示されません。

f:id:kazuhironagai77:20220403224207p:plain

武器屋で買い物をする時です。

f:id:kazuhironagai77:20220403224232p:plain

出来ました。

f:id:kazuhironagai77:20220403224252p:plain

<原因不明のバグを直す>

f:id:kazuhironagai77:20220403224314p:plain

何でこのErrorが起きたのかは覚えていませんが、Errorの原因がVictory Music変数の中身が無いからだったはずです。

ので以下の実装を追加しました。

f:id:kazuhironagai77:20220403224331p:plain

これは戦闘で勝った後で何もしないでいたら起きたバグかもしれません。

それでテストしてみます。

バグが再現出来ませんでした。

良く分からないですが、取りあえずOKとしておきます。

<おまけ>

長年の疑問だった赤線で囲ったStatic Meshが暗闇でも暗くならない理由も分かりました。

f:id:kazuhironagai77:20220403224351p:plain

ずっとShading ModelがUnlitだと思っていたんですが違いました。

f:id:kazuhironagai77:20220403224409p:plain

手前の暗くて良く見えない瓶のMaterialとの違いはたった一つ

f:id:kazuhironagai77:20220403224430p:plain

Emissive ColorにTextureを繋いでいるかどうかでした。

分かってしまえば、余りにも簡単です。

6.Open Worldの検証

6.1 先週のまとめ

以下に先週のまとめを載せておきます。

f:id:kazuhironagai77:20220403224503p:plain

今週と言うか、これからやりたい事は2つです。

Smart Poly氏のTutorialでそれぞれのSub Levelに対してHeight MapをImportしていたはずです。

まず16km^2のMapの作成方法ですが、以下の様に考えています。

4km^2のMapを最初に作成します。その後でSectionを追加してSub Levelを含めて16km^2のMapを作ります。

ただしこの方法だとHeight Mapを一度に読み込む事が出来ません。

それでSub Levelへ直接Height Mapを読み込むやり方をSmart Poly氏のTutorialから勉強します。

これがやりたい事の一つ目です。

もう一つはWorld Compositionの復習です。

これをやらないと何時まで経ってもWorld Compositionについての理解が曖昧なままになってしまいます。

6.2 World Compositionの復習

先にこっちをやります。といっても今週は今までの勉強の復習だけですが。

Blogを調べると2021-09-26のBlogから2021-11-22のBlogまで勉強しています。

それぞれの内容について以下に簡単にまとめます。

2021-09-26Blog

この週のBlogで初めてWorld Compositionについて知りました。

World Composition And Basic Level Streaming - Unreal Engine 4 Tutorial [3] でWorld Compositionについて勉強しています。

これしかWorld CompositionについてのTutorialはやっていないんですね。今回の勉強では公式のTutorialとかも調べるべきですね。

Sub Level一個の大きさと、Loadする距離はどの位が適当なのかが分からないと言っています。

2021-10-03Blog

もうここでMap1に対してSub Levelを作成してWorld Compositionを使用出来ないのか検討しています。

Section(Component)のサイズを64m^2にして36個のSub Levelを作成しています。

f:id:kazuhironagai77:20220403224542p:plain

そこにMap1のHeight MapをImportしました。

f:id:kazuhironagai77:20220403224559p:plain

普通に出来ました。

その後、Unloadの値を決めています。

f:id:kazuhironagai77:20220403224617p:plain

更に他のTutorialも少しだけここで勉強しています。いますが最初のTutorialで勉強した内容以上のものは得られなかったみたいです。

後、どうせUE5でWorld Partitionを勉強しないといけないので今更UE4のWorld Compositionを一生懸命勉強する必要もないと書いています。これはその通りです。

2021-10-10Blog

この週は、Map1のLandscapeをWorld Compositionに変更するためにはどうやるのが良いのかについて考えています。

MapのLandscapeを消して、新しいLandscapeを先週(2021-10-03のBlog)実施した方法でやるのが一番簡単だと書いてあります。

それが出来るのかどうかを、Map1をImportした別なProjectで試しています。

f:id:kazuhironagai77:20220403224646p:plain

Landscapeの生成場所が自動で決められてしまうので、その位置を自分で変更する事が出来ないみたいな事が書かれていますが、これって出来たはずです。

どのTutorialで見たのかは覚えていませんがLandscapeは自由に動かせたはずです。

それよりも面白いのがWorld CompositionはUE4までの機能でUE5からはWorld Partitionを使用するようになるのでWorld Compositionの勉強はほどほどにすべきだと、ここでも主張しています。

主張してはいますが、結構真剣に勉強しています。

これも勉強するためのコツなのかもしれません。あんまりPressureを与えるとそれに見合う成果が出ないとやる気が無くなってしまいます。しかしこの部分はあんまり大切じゃないのでほどほどの勉強で良い。と言われると安心して勉強出来る効果があるのかもしれません。

2021-10-17Blog

実際のRPGを作成しているProject内のMap1をWorld Compositionで作り替えています。

生成したLandscapeの位置を前のLandscapeと全く同じ位置に配置しようとしています。

この為に敢えてActorを配置したりしているんですが、今読み直すと今一このやり方が分かりません。計算が合ったり外れたりしているんですがその理由も分かりません。もう一回同じ方法でLandscapeを作成したら思い出すかもしれません。

2021-10-25Blog

ここでWorld Compositionを使用して新しく作成したMap1のLandscapeにBugが見つかります。

f:id:kazuhironagai77:20220403224715p:plain

こういうやつです。

結局、このBugの直し方分かりませんでした。

後、MonsterなどのActorの動的な生成について検討しています。

Playerの操作するキャラが生成された場所がSub LevelだとLevelが生成される前にキャラが生成されて地面から落っこちてしまいます。

別なLevelに移動して戦闘を行うと言う事はどのGameでもあんまりやっていないんでしょうか?

こういうRPGの作成についての基本的な事についての教科書があるとありがたいんですが。

2021-11-08Blog

Playerの操作するキャラが生成された場所がSub LevelだとLevelが生成される前にキャラが生成されて地面から落っこちてしまいます。

この問題を解決するためにPlayerの操作するキャラが別なLevelに移った場合、3秒間空を浮いているようにしました。3秒あったらSub Levelが生成されます。

正し戦闘用のLevelに移動する時だけは、3秒間空を浮いている必要はないので、それを外しています。

更にMonsterを静的に生成させたりしています。

まとめとしてWorld CompositionのSub Levelはかなり大きく作成した方が良いみたいな事が書かれています。

2021-11-14Blog

ここでは動的にMonsterを生成するための検証ならびに実装をしています。

もうWorld Compositionそのものとは別な内容です。

<Blogの復習の感想>

勉強に使用したTutorialがWorld Composition And Basic Level Streaming - Unreal Engine 4 Tutorial [3]だけだったのは驚きです。

残りの内容は大体覚えていました。

来週、World Composition And Basic Level Streaming - Unreal Engine 4 Tutorial [3]の復習をします。これでWorld Compositionそのものの勉強は十分なはずです。

6.3 Smart Poly氏のHow To Make A Massive Open World Map In Unreal Engine 4 [4]を復習する

今回、復習しておきたいのは、どうやってLandscapeを作成しているのかとSub LevelのHeight Mapの指定の仕方です。

まあ全部見ます。

軽く見直しましたが、かなり勘違いしておぼえている箇所が何個もありました。

その辺もまとめ直します。

まず、World CompositionそのものをHeight Mapから作成する方法です。

Levels WindowのImport Tiled Landscapeを選択して

f:id:kazuhironagai77:20220403224758p:plain

Import Tiled Landscapeを開きます。

f:id:kazuhironagai77:20220403224816p:plain

ここでまず

f:id:kazuhironagai77:20220403224849p:plain

で、ここで読み込んでいるFileのExtensionが

f:id:kazuhironagai77:20220403224906p:plain

.r16なんです。

うーん。こんなFileどうやって作成したのかしらん。

前回、このTutorialを勉強したのは2022-02-06でした。その時のBlogを読み直しましたが、この事には気が付いていませんでした。

その次にMaterialをセットしてそのMaterialにあるそれぞれのLayerに対してのHight Mapを読み込ませています。

f:id:kazuhironagai77:20220403224925p:plain

うーん。

となるとWorld Machineの設定通りのMapを生成しているみたいですね。

こいつの意味をまた忘れてしまいました。

f:id:kazuhironagai77:20220403224947p:plain

調べ直しました。

f:id:kazuhironagai77:20220403225002p:plain

これ読むと64平方メートルのSectionが4つComponentに入っている。そしてそのComponentは8x8ある。と解釈出来ます。64m * 2 * 8 = 1024 mですが

f:id:kazuhironagai77:20220403225033p:plain

生成されるLandscapeの一辺のサイズは7km です。

この辺の関係性が良く分かりません。

と言うか逆にこの辺の関係性さえ理解出来れば、16km^2のMapの作成は出来る様になりそうです。

もう一回World Machineの設定から見直してみます。

<World Machineの設定>

Project Settingで

f:id:kazuhironagai77:20220403225101p:plain

に設定していますが、Previewには

f:id:kazuhironagai77:20220403225117p:plain

こんな感じで表示されています。実際に作成したLandscapeそのものは7Km と言う可能性もありそうです。

Resolutionは1009にセットしています。

f:id:kazuhironagai77:20220403225134p:plain

Exportした時にどっちが基準になるんでしょうか?

ResolutionのサイズでUE4のLandscapeのサイズも決まったりするんでしょうか?

56 kmなのでTileは7 x 7であると言っています。Tile一辺の大きさは8m何でしょうか?

今度はTiles per Sideの値を変えています。

f:id:kazuhironagai77:20220403225152p:plain

Resolutionの方は1009に変更していました。

f:id:kazuhironagai77:20220403225209p:plain

うーん。

この設定だとLandscapeの一辺は56 kmになるはずです。

うーん。なんで8 kmになってしまったのか?

<仮説と検証について>

このTutorialで提供されているLandscapeのheight MapをUE4でImportする時に色々な設定でImportしてLandscapeの大きさの変化を観察します。それでUE4側の設定の仕組みが把握出来るはずです。

これは来週試す事にします。

7.World Machineの勉強

7.1 先週(2022-03-21)の復習

先週のWorld Machineの勉強はかなり大切な内容だったのでそれの復習をします。

Subtractする方法は忘れていました。

f:id:kazuhironagai77:20220403225243p:plain

これの使用方法は未だに分からないです。

f:id:kazuhironagai77:20220403225300p:plain

Vertex Weldingのテストです。

f:id:kazuhironagai77:20220403225316p:plain

f:id:kazuhironagai77:20220403225328p:plain

うーん。出来ています。

f:id:kazuhironagai77:20220403225348p:plain

最終的な形状です。

f:id:kazuhironagai77:20220403225405p:plain

一応、全部の機能の確認をしました。

7.2 User Guideの「6. File Input and Output [5] 」を勉強する

今週は以下の機能を勉強するみたいです。

f:id:kazuhironagai77:20220403225426p:plain

<File Output

File Outputが

f:id:kazuhironagai77:20220403225447p:plain

でした。

<Height fields

ここで言うHeight FieldはHeight Mapの事みたいです。

Height Outputを選択して

f:id:kazuhironagai77:20220403225513p:plain

Layout Viewを開くと以下の詳細が表示されます。

f:id:kazuhironagai77:20220403225537p:plain

多分、これがTutorialの以下の部分に対応していると思われます。

f:id:kazuhironagai77:20220403225553p:plain

試しにWrite Diskを押して見たら以下のPNG Fileが作成されました。

f:id:kazuhironagai77:20220403225609p:plain

<Terrain Meshes

以下のDeviceについての解説と思われますが、

f:id:kazuhironagai77:20220403225631p:plain

このDeviceに接続できるPortが見つかりません。

Layout Viewを開くと以下の詳細が表示されます。

f:id:kazuhironagai77:20220403225647p:plain

これとTutorialの

f:id:kazuhironagai77:20220403225704p:plain

が対応しているんでしょうか?

最初のMesh Typeは無いですね。

DeviceをDouble Clickしたら以下のBoxが表示されました。

f:id:kazuhironagai77:20220403225723p:plain

ほぼ同じです。

<Bitmaps

以下に示したヤツの解説です。

f:id:kazuhironagai77:20220403225746p:plain

以下の部分の機能について解説しています。

f:id:kazuhironagai77:20220403225806p:plain

開いて見たら以下に示したImageが表示されました。

f:id:kazuhironagai77:20220403225823p:plain

<File Input

以下のDeviceの事のようです。

f:id:kazuhironagai77:20220403225852p:plain

File InputのInput Propertiesを開きました。

f:id:kazuhironagai77:20220403225908p:plain

TutorialではこのPropertiesの設定について解説していますが、今一良く分かりません。

8.雪山のMapの作成

8.1 複数のTextureを混ぜてMaterialに変化をつける

2022-03-14のBlogを見るとTexture Repetitionを無くすために以下の4つの方法を使用しています。

f:id:kazuhironagai77:20220403225934p:plain

この中の最後の方法である「複数のTextureを混ぜてMaterialに変化をつける」を実装します。

これのやり方、全く覚えていなかったんですが、2022-03-14のBlogに簡単にまとめられていました。

f:id:kazuhironagai77:20220403225950p:plain

成程。

丁度、Layer Snow Bが丸々空いています。

f:id:kazuhironagai77:20220403230007p:plain

ここに作成する事にします。

何と、Material Attribute Nodeを直接Lerp ノードに繋ぐ事は出来ません。

f:id:kazuhironagai77:20220403230024p:plain

うーん。一から作成するしかないみたいです。

新しいMaterial Functionを作成しました。

Snow LayerのMaterial FunctionとDirt Layer のMaterial FunctionをそのままCopyして

f:id:kazuhironagai77:20220403230056p:plain

Perlin NoiseでLerpします。

f:id:kazuhironagai77:20220403230118p:plain

Perlin Noiseは以下の様に実装しました。

f:id:kazuhironagai77:20220403230136p:plain

以下に示した実装を追加します。

f:id:kazuhironagai77:20220403230150p:plain

追加しました。

f:id:kazuhironagai77:20220403230207p:plain

更に、Input Functionの名前を分かり易いように変更します。

最終的には以下の様になりました。

f:id:kazuhironagai77:20220403230233p:plain

こんな感じで接続しました。

f:id:kazuhironagai77:20220403230256p:plain

LandscapeにセットしてあるこのMaterialのInstanceのParameterは以下の様に変化しました。

f:id:kazuhironagai77:20220403230314p:plain

テストしたらBlendしたLayerが真っ黒になってしまいました。

f:id:kazuhironagai77:20220403230332p:plain

うーん。

Lerpのalphaの値を0にしてみました。

f:id:kazuhironagai77:20220403230353p:plain

あれ。白くなっています。

f:id:kazuhironagai77:20220403230409p:plain

今度は1にしました。

f:id:kazuhironagai77:20220403230431p:plain

あれ?

f:id:kazuhironagai77:20220403230447p:plain

出来ている。

分かりました。

f:id:kazuhironagai77:20220403230509p:plain

OpacityにBlendを繋ぐと以下の様になります。

f:id:kazuhironagai77:20220403230539p:plain

うーん。何で?

TutorialであるHow to HIDE Texture REPETITION in Unreal Engine - UE4 Tutorial [6] を見てみます。

f:id:kazuhironagai77:20220403230614p:plain

普通にLayer Blendの前で

f:id:kazuhironagai77:20220403230631p:plain

あれ?LerpノードじゃなくてBlend Material Attributeノードを使用しています。

うーん。

作り直します。

f:id:kazuhironagai77:20220403230647p:plain

結果です。

f:id:kazuhironagai77:20220403230701p:plain

同じ結果ですね。

うーん。

何かこれと同じ事が起きてそれを直した記憶があります。

Tutorialから探したんですが見つかりませんでした。

仕方ありません。

前の実装に戻します。

OpacityだけLerpを外しました。

Parameterを調節して以下の様になりました。

f:id:kazuhironagai77:20220403230718p:plain

こんな感じです。

f:id:kazuhironagai77:20220403230737p:plain

うーん。

一応、OKとしましょう。

以下の様に塗り直しました。

f:id:kazuhironagai77:20220403230827p:plain

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

f:id:kazuhironagai77:20220403230851p:plain

うーん。これだと雪山というより一寸だけ雪が降った山って感じです。

<改良案>

今週の予定は終わったんですが、来週、崖用のLayerを追加した後でどの様に改良するのかについての考えをまとめておきます。

まず、Dirt Layerを今のSnowとDirtをBlendしたLayerに変更します。

そして今、SnowとDirtをBlendしたLayerは氷のLayerを作成してそれで代用します。

9.Game DesignポケモンHxHの念能力( 戦闘システムの作成)

9.1 Switch(右→中央)の魔法を実装する

<魔法使用の流れ>

まず全体の流れを追います。

f:id:kazuhironagai77:20220403230928p:plain

W Player Make Decision WidgetでPlayerは使用する魔法を選びます。

f:id:kazuhironagai77:20220403230943p:plain

一応、Switchの魔法用のボタンも追加しました。

魔法のボタンを選択するとGame Mode BPのPlayer Magic Name変数に適切な値がセットされます。

f:id:kazuhironagai77:20220403231001p:plain

Game Mode BPのPlayer Magic Name変数はtypeがMagic NameというEnumなので

f:id:kazuhironagai77:20220403231019p:plain

そこにSwitchも追加しました。

f:id:kazuhironagai77:20220403231033p:plain

Switchの魔法を選択したらGame Mode BPのPlayer Magic Name変数にSwitchがセットされるようにします。

f:id:kazuhironagai77:20220403231052p:plain

この後、W Player Make Decision Widgetの決定ボタンを押すと

f:id:kazuhironagai77:20220403231110p:plain

次のPhaseに移行します。

f:id:kazuhironagai77:20220403231146p:plain

この後、色々なPhaseを追加しますが、関係ないので記録はしません。

次に大切なのは、Event Player Action Phaseです。

f:id:kazuhironagai77:20220403231216p:plain

ここで、Event To Level Player Monster Fightが呼ばれます。

f:id:kazuhironagai77:20220403231234p:plain

このEvent Dispatcher のBindはLevel BP内で行われています。

Player Monster Attack にBindしています。

f:id:kazuhironagai77:20220403231256p:plain

このPlayer Monster AttackでPlayer Use Magic関数が実行されます。

f:id:kazuhironagai77:20220403231311p:plain

Player Use Magic 関数の実装です。

f:id:kazuhironagai77:20220403231328p:plain

ここにSwitchの魔法を追加すれば良い訳です。

<PlayerのMonsterの位置を指定する変数を全部調べる>

まず、Game Mode BPの変数3つです。

f:id:kazuhironagai77:20220403231350p:plain

これらの変数のTypeはNameなのでMonsterの名前だけ保持しています。

次に、Level BP内で以下の3つの変数でMonster BPを管理します。

f:id:kazuhironagai77:20220403231406p:plain

これらの変数のTypeはMonster BPなのでほぼすべてのMonsterの情報をここで管理しています。

最後にLevel BPのSet Monster BP to Widget関数で

f:id:kazuhironagai77:20220403231431p:plain

W_Player Make Decisionの

f:id:kazuhironagai77:20220403231448p:plain

以下の変数の値を指定します。

f:id:kazuhironagai77:20220403231505p:plain

f:id:kazuhironagai77:20220403231513p:plain

ただしこれらはW_Monster ParameterというWidgetで以下の様な変数を持っています。

f:id:kazuhironagai77:20220403231533p:plain

以下の実装でMonster BP変数に値を移しています。

f:id:kazuhironagai77:20220403231550p:plain

一応、見つかったのがこの三か所なのでこの三か所を交換する実装をこれから作成します。

<Monsterを交換するための実装をする>

Game Mode BPにあるMonsterの名前を交換します。

f:id:kazuhironagai77:20220403231614p:plain

Level BPにあるMonster BPを交換します。

f:id:kazuhironagai77:20220403231631p:plain

最後にW_Player Make DecisionのW_Monster Parameterを交換します。

f:id:kazuhironagai77:20220403231647p:plain

テストします。

以下のMonsterが交換します。

f:id:kazuhironagai77:20220403231703p:plain

交換しません。

f:id:kazuhironagai77:20220403231718p:plain

更に次のPhaseに移行もしなくなりました。

f:id:kazuhironagai77:20220403231736p:plain

Print Stringで調べます。

f:id:kazuhironagai77:20220403231806p:plain

f:id:kazuhironagai77:20220403231818p:plain

中身は交換されているようです。

うーん。

先に進まない理由は直ぐに分かりました。

以下のEvent Player’s Monster’s Turn End で

f:id:kazuhironagai77:20220403231839p:plain

交換魔法を使用した時の接続を忘れていました。

f:id:kazuhironagai77:20220403231857p:plain

直しました。

f:id:kazuhironagai77:20220403231917p:plain

直りました。

次のTurnに移行しています。

f:id:kazuhironagai77:20220403231939p:plain

更に次のTurnになったらWidgetのMonsterの配置も正しい形に直っています。

分かりました。

以下の様に最後のWidgetの部分はMonster BPを交換しました。

f:id:kazuhironagai77:20220403232000p:plain

結果です。

f:id:kazuhironagai77:20220403232029p:plain

Widgetに表示されるMonsterの位置が交換されるようになりました。

後は召喚されたMonsterの3d Modelが交換されないBugを直すだけです。

f:id:kazuhironagai77:20220403232046p:plain

これは来週やる事にします。

10.Blenderの勉強

10.1 先週までの復習

<Selection Method

毎日、復習すると言ってあれから全然やっていません。

LoopやRingの選択を追加した途端に、何かやる気が無くなってしまいました。人間ってどっか心の深い所でこれは必要じゃないと判断するともうやる気が出てこないのかもしれません。

LoopやRingはAlt、もしくはAlt + Ctrlを押した状態でEdgeやFaceを選択します。それだけです。

f:id:kazuhironagai77:20220403232127p:plain

RingとLoopの違いより縦にLoopするのか横にLoopするのかが大切な気がします。上記の状態で本当は横にLoopして欲しかったです。

隣の面を選択してLoopをしたら横にLoopしました。

f:id:kazuhironagai77:20220403232148p:plain

こっちの方が実践的かもしれません。

Edgeの場合です。

Ctrl + Altを押しながらEdgeを選択します。Ringに当たります。

f:id:kazuhironagai77:20220403232207p:plain

Altの場合です。Loopに当たります。

f:id:kazuhironagai77:20220403232223p:plain

Edgeの時はLoopとRingの違いは分かり易いですね。

Edgeが全部繋がっているのがLoop、繋がっていないのがRingです。

CircleやBoxによるFaceの選択は、CやBを押して左クリックして選択します。

LassoはCtrlを押しながら右クリックしてDragでした。

f:id:kazuhironagai77:20220403232242p:plain

Edgeの最短距離の選択は、Edgeの選択、Ctrlを押しながら別のEdgeを左Clickで選択です。

f:id:kazuhironagai77:20220403232300p:plain

分からなくなったらCtrlか Alt、もしくは両方を押したら全部何とかなりそうです。

2022-02-14Blogの復習

UV Editingの以下のオレンジの点を動かす時に押す、Keyを忘れていました。

f:id:kazuhironagai77:20220403232321p:plain

Gです。

Shift + Spaceで以下のboxが表示されます。

f:id:kazuhironagai77:20220403232339p:plain

このやり方もすっかり忘れていました。

だた、このboxって

f:id:kazuhironagai77:20220403232400p:plain

と機能的には同じです。忘れても何とかなりますね。

Pivot Pointの表示方法です。Period Keyを押すだけです。

f:id:kazuhironagai77:20220403232418p:plain

これも忘れていました。

2022-02-21のBlogの復習>

BevelとかShrink とFlattingは、復習はしますが覚えなくても良い事にします。

3D Cursorの動かし方について結構忘れています。

  • ShiftMouseRight Clickで移動
  • Shift + S で以下の図を表示します

f:id:kazuhironagai77:20220403232447p:plain

2022-02-28のBlogの復習>

これ超重要です。

f:id:kazuhironagai77:20220403232515p:plain

後は、Selection Methodとかの解説ですね。

この後の週は復習だけして終わっています。まあやらないよりは全然マシなんで、卑下する必要は全く無いですので、このまま続けていきます。

10.2  Imphenzia氏のLearn Low Poly Modeling in Blender 2.9 / 2.8 [7]の続きを勉強する

前回はLasso Selectionまで勉強したんでその続きからやります。

<選択した面を増やしたり少なくしたりする方法>

以下のGeometryで一面だけ選択しています。

f:id:kazuhironagai77:20220403232547p:plain

Ctrl を押しながらNumber Padにある+ Keyを押します。

f:id:kazuhironagai77:20220403232604p:plain

選択面が増えました。

今度はCtrl を押しながらNumber Padにある- Keyを押します。

f:id:kazuhironagai77:20220403232621p:plain

選択面が減りました。

Tutorialによるとこの技術を利用する事で、以下に示した様な雪が積もった状態を簡単に作成出来るそうです。

f:id:kazuhironagai77:20220403232642p:plain

<Random な面を選択する>

これはそのままTool BarのSelectから選択していました。

f:id:kazuhironagai77:20220403232709p:plain

結果です。

f:id:kazuhironagai77:20220403232728p:plain

興味深いけど何に使用するんでしょうか?

<似ている面を選択する>

Shift + Gで似ている面を選択するそうです。

Shift + Gを押したら以下のBoxが表示されました。

f:id:kazuhironagai77:20220403232752p:plain

ここから似ている要素を選択するみたいです。

試しにAreaを選択したら以下のようになりました。

f:id:kazuhironagai77:20220403232810p:plain

<Checker Deselect

F3を押してChecker Deselectedを選択します。

f:id:kazuhironagai77:20220403232832p:plain

以下に示した様なEvery other faceを選択をします。

f:id:kazuhironagai77:20220403232849p:plain

これは城の塀や

f:id:kazuhironagai77:20220403232907p:plain

台所の床を作成するのに使用出来ます。

f:id:kazuhironagai77:20220403232926p:plain

<選択した面を隠す>

Hを押すと選択した面が画面上から消えます。

f:id:kazuhironagai77:20220403232950p:plain

Alt Hで元に戻せます。

ここまででSelection Methodは終です。

ここからMesh Editingが始まります。

10.3  Imphenzia氏のLearn Low Poly Modeling in Blender 2.9 / 2.8 [7]の続き(Mesh Editing)を勉強する

一応、節を分けました。

<Loop Cut

Ctrl + Rだそうです。

f:id:kazuhironagai77:20220403233016p:plain

MouseのWheelを回す事でLoop Cutの数を増やせます。

f:id:kazuhironagai77:20220403233032p:plain

Mouseの左ボタンを押すと位置を移動出来ます。右ボタンは中心にセットします。

更に以下の部分の歪みの直し方が紹介されていました。

f:id:kazuhironagai77:20220403233050p:plain

LoopでEdgeを全部選択し、SでScaleします。ただしScaleするのはZだけなのでZを押します。

f:id:kazuhironagai77:20220403233107p:plain

Edgeがまっすぐになりました。

Tutorialでは以下のようなBoxを作成していました。

f:id:kazuhironagai77:20220403233122p:plain

<Knife Tool

Kを押すだけだそうです。

以下の様にVertexとEdgeが追加されました。

f:id:kazuhironagai77:20220403233141p:plain

Tutorialでは以下に示した様なFaceを作成して別な色を適用していました。

f:id:kazuhironagai77:20220403233158p:plain

ふーん。でも余計なPolygonを増やすだけじゃない。と思ったんですが。ここからExtrudeをして以下の様なBoxになりました。

f:id:kazuhironagai77:20220403233215p:plain

うーん。これは凄い。

このTechniqueはStatic Meshのみに活用すべきでSkeletal Meshで使用するととんでもない歪みを生じるそうです。

はい。

Knife Toolを終わらせたいんですがやり方が分かりません。

調べたらEnterかSpaceを押せば良いそうです。

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

11.まとめと感想

先週、急な用事が入って勉強出来なかったんですが、たった一週間開けただけでかなり集中力が落ちてしまいました。

12.参照(Reference

[1] CGHOW. (2021, October 26). AOE ICE in UE4 Niagara Tutorial | Download Files [Video]. YouTube. https://www.youtube.com/watch?v=s37hilxvd_8

[2] Cloward, B. [Ben Cloward]. (2022, March 17). Toon Shader Paint - Shader Graph Basics - Episode 38 [Video]. YouTube. https://www.youtube.com/watch?v=SOYNf4sYNzY

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

[4] Smart Poly. (2020, May 19). How To Make A Massive Open World Map In Unreal Engine 4 [Video]. YouTube. https://www.youtube.com/watch?v=HQUC0Gejmo4&list=WL

[5] World Machine Software. (n.d.). 6. File Input and Output. World Machine Software User’s Guide. Retrieved April 3, 2022, from https://help.world-machine.com/topic/file-input-and-output/

[6] Unreal Sensei. (2020, August 7). How to HIDE Texture REPETITION in Unreal Engine - UE4 Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=yCRzOdo4b68

[7] Imphenzia. (2020, June 25). Learn Low Poly Modeling in Blender 2.9 / 2.8 [Video]. YouTube. https://www.youtube.com/watch?v=1jHUY3qoBu8