<前文>
(先週、用事があって前文だけ前の週に書いておきました。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の勉強の復習
- RPGのStoryの改善
- 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に関して一個記録するのを忘れていた内容がありました。それをここにまとめておきます。
SaturationとValueがほぼ1となると選択出来る色がかなり限られます。
Coinの色を単純にToon調にすると
SaturationとValueは1からは程遠い値になります。
これがアニメ調に見えない原因です。
2.2 CGHOW氏のTutorialの何かをやる
一寸、目を離したら、CGHOW氏のUE5 Previewを使用したTutorial、とんでも無く増えていました。
うーん。
一寸私のPCでUE5 Previewを使用してGPU全開でParticleを生成するEffectを作成するのは不安ですね。
一寸、前のTutorialでIceを作成しているEffectがありました。
あ。
今。思い出したんですが、元々、VFXの勉強の目的で魔法を表現すると言うのがありました。すっかり忘れていました。
探したら見つかりました。
2021-08-02のBlogで以下の様なまとめがありました。
これはこれで後でまとめ直す必要がありますね。
今、簡単に見直すと、砂以外のEffectの(今のGame業界で規準となっている)作成方法はそれなりには分かりますね。
でもこの辺をまとめ直すのも大切ですね。
決めました。
今週は、AOE ICE in UE4 Niagara Tutorial | Download Files [1]を勉強します。
2.3 AOE ICE in UE4 Niagara Tutorial | Download Files [1]を軽く見る
一回、軽く見ましたが結構複雑でした。
うーん。
全部、今週だけでやるのは無理でしょうね。以下に示したIce Pillarだけ作成する事にします。
作成方法を以下に簡単にまとめます。
<Static Mesh>
Static Meshの作成部分です。
このTutorialだと作成方法の説明はないです。
うーん。
正直、どうやってこの歪みを作成してるのか分かりません。
円柱を元に、Vertexを追加してそのVertexを少しだけ移動させると出来るのかもしれません。そんな感じで作成しています。
<Material>
以下に使用しているMaterialの実装を示します。
この部分はTutorialでかなり詳しい解説がされているのでそれを勉強しながら作成します。
<Niagaraの設定>
Niagaraの設定についてです。
かなり急ぎ足で解説しています。
うーん。
説明している全部のModuleを追うのは難しいかもしれません。
出来るだけ頑張って再現します。
2.4 AOE ICE in UE4 Niagara Tutorial | Download Files [1]を実装する
<Ice Pillarの3D Modelを作成する>
Blenderで以下の様なStatic Meshを作成しました。
うーん。
でも上から見ると
円柱の上面が一枚のMeshになっています。
これをそれぞれのVertex毎にEdgeで結んでMeshを分割したいんです。
色々調べたら出来ました。
うーん。でも何か違う。
最終的に以下の様になりました。
うーん。
やっている内に三角形と四角形のMeshが生成したんですが、どっかで3d Modelを作成する時はMeshは全部四角形にする必要があるって聞いた事があります。
ただTessellationの段階でVertexが構成する三角形が自動で生成されるはずで、その辺の関連性がどうなっているのか分からないです。
UE5にImportしました。
これを使用してやってみます。
<Materialの実装>
そっくりに作成しました。
Tutorialの解説に従って実装を見てみます。
Fresnelノードの実装です。
FresnelノードのPreviewです。
これかなり綺麗ですね。
次は以下の部分です。
結果です。
Tutorialの結果とは一寸だけ違いますね。
Dynamic ParameterのOffsetの値を下げてみました。
結果です。
うーん。
完璧に一致はしませんでしたが、何とかなりそうですね。
このままやって行きます。
更に200で割ります。
結果です。
Tutorialによると200で割る事でFade感を出すそうです。
確かに下に示したTutorialのPreviewに表示されているのはFade感があります。
私のは無いですね。もっと大きな値で割る事にします。
試しに1000で割ってみました。
その後、Smooth Stepノードに繋げています。
結果です。
あれ。
Fadeが無くなってしまいました。
Smooth Step ノードのMaxの値を上げてみました。
結果です。
戻りましたね。
<Niagaraの作成>
大体Tutorial通りの作成で出来たんですが、Scale Mesh Sizeノードを使用するとMeshが消えてしまいます。
中の実装を見ると
値が0になる可能性があるのはInput のInitial Mesh Scaleだけです。
Initial Mesh ScaleにPassする値を、
から
に変えてみました。
結果です。
出来ました。
うーん。
氷っぽいと言えば氷ですが、うーん。
<Scale Mesh Sizeノードを使用するとMeshが消える理由>
Scale Mesh Sizeノードを使用するとMeshが消える理由が分かりました。
Particle Spawn SectionのInitial Mesh Particle Moduleの
Mesh Scale Modeをセットするのを忘れていました。
以下の様にセットしたら
Particle Update SectionのScale Mesh Size Moduleの
Initial Mesh ScaleにScaleがセットされた状態でも
Meshが表示されるようになりました。
今週のNiagaraの勉強はここまでとします。
3.Material : Projectionの勉強の復習
3.1 先週の仮説の確認
先週、以下の仮説を思い付きました。
<Signノード>
<-1>
<Vertex Normalを掛ける>
が、確認する時間がなかったので今回それをやります。
もしこれらの仮説が正しいなら、Textureの向きを直すのに別にTutorial通りのやり方をする必要もなくなります。
逆に言えば、Tutorial通りのやり方をしている人は本当の意味でProjectionしたTextureの操作を理解していない。と言えるでしょうから時間をかけて検討する価値は十分あります。
3.2 ProjectionしたTextureに-1を掛ける
一番、単純なTextureに-1を掛ける場合から検討します。
Improved Tri-Planar Projectionを使用して実験します。
Improved Tri-Planar ProjectionはTextureにGridを使用しているので上下左右裏表がはっきり分かるからです。
Z軸にProjectionしているTextureに、以下の様に-1を掛けました。
結果です。
Top Viewです。
が
となりました。
あー。
そりゃそうだ。
Textureの色を構成しているRGBは0から1までの値なので-1を掛けたら0以下になるだけでした。
-1から1までの値で構成されているNormal Mapでやらないと駄目だったんです。
先週、作成したNormal MapのProjectionをResult ノードのBase Colorに繋ぎ直しました。
これを使って試験します。
Z軸にProjectionしたTextureのZの値に-1を掛けます。
予想が正しければ、以下の図が
となるはずです。
結果です。
Top Viewです。
が
となりました。
予測通りです。
Bottom Viewです。
が
になっています。
これも合っています。
当然ですが他の軸のTextureの向きは全く変化していません。一応、確認しました。
今度はX軸、Front ViewとBack Viewに-1を掛けてみます。
何もしていない状態のFront Viewです。
当然ですが、赤いです。変化が見やすいので-1はX軸に対して掛けます。
が
になるはずです。
結果です。
Front viewです。
X軸が逆になっています。
Back Viewです。
これも逆になっています。
予測の通りです。
他の面も確認しましたが、他の部分の変化は全くありません。
これらの実験から、Tri-Planar ProjectionでNormal MapをTextureとして使用した場合、それぞれのProjectionのTextureのRGBのどれかに-1を掛けるとそのRGBが示している軸の向きを反対にする機能がある事が確認出来ました。
3.3 ProjectionしたTextureにSign(以下の式)を掛ける
以下に示した実装を掛けます。
先週の仮説によれば、この実装を掛けると軸の負の部分だけ逆になるはずです。
先週のこの説明は正確性少し足りないので補足します。
負の軸だけ逆にする実装は実際には以下のものになります。
先週の実装はX軸のProjectionだけは向きが逆だったので-1を掛けています。のでその部分が正確ではないです。
更に、どのProjectionに対しても負のX軸の向きだけを変えたい場合は、Rの値を掛けます。この事をしっかり述べていなかったです。
3.2で-1を以下の場所に掛けた時、
という結果になりました。
と言う事は、上記の実装の計算結果が正の部分は1、負の部分が-1であるならば、
となって仮説が正しい事が証明出来ます。
それでは実装の計算を見てみましょう。
まずSignノードが繋がっています。
以下に示した様にSignノードの機能は全ての値を1か-1に変換します。
と言う事は可視化した時に黒い部分は-1、それ以外の色は1と言う事になります。
以下の実装でX軸の結果を可視化します。
尚、結果を分かり易くするために1の代わりに0を掛けています。
結果です。
見事にX軸の正が1、負が-1になっています。
今度は、Y軸の結果を可視化します。
見事にY軸の正が1、負が-1になっています。
良く考えたら負の値が-1であるかどうかは不明ですね。0かもしれませんし。
以下の方法で確認します。
X軸の負が-1なら0.5になっているはずです。
X軸の正の値は1.5ですが1以上は同じ値なので、左側の半分の赤さならX軸の負は0.5 であると言えるはずです。
つまり以下に示したこの部分の計算は
Projectionした軸の正に1、負に-1を掛けているだけでした。
その結果、以下に示した様に例えばZ軸にProjectionしたNormalのZ軸にこの実装を掛けると
以下の結果になります。
これも仮説の通りでした。
3.4 ProjectionしたTextureにVertex Normal WSノードを掛けたり足したりする
Vertex Normal WSノードを掛けた軸の負の値だけが反転します。
これはある条件でした試していないので、確認も必要です。
そこからやって行きます。
X軸にProjectionした場合にX軸にVertex Normal WSノードを掛けた時は
となります。
では、以下に示した様にX軸にProjectionした場合にY軸にVertex Normal WSノードを掛けた時はどうなるんでしょうか?
試してみます。
が
となりました。
うーん。
良く分かりません。
3番目の計算方法は良く分かりません。
これは保留する事にします。
3.4 1と2のみを使ってTri-PlanarのNormal MapのProjectionを作成してみる
1と2の技術のみを使用して先週作成したTri-PlanarのNormal MapのProjectionを作成してみます。
まず上下左右のあるTexture用のTri-PlanarのProjectionを作成しました。
Textureは既にNormal Mapに変更してあります。
まず軸の向きだけ直しました。
結果です。
今度はそれぞれの軸に対してのProjectionの向きの間違いを直して行きます。
この時点でぞれぞれの軸に対してProjectionしたNormal Mapの向きは以下の様になっているはずです。
確認しました。
この結果と同じでした。
ここから私独自のやり方でNormal Mapの向きを直します。
まず-1を掛けます。
x軸のyとz、Y軸のzに-1を掛けます。
すると以下の結果になるはずです。
実装しました。
結果です。
表にしました。
はい。
予想と同じ結果になりました。
次に、以下にSignノードを使用した実装によって軸の負だけ逆なTextureを直します。
試しにX軸だけやってみます。
以下に示した様に実装しました。
Front Viewです。
全部合っています。
Back Viewです。
これも全部合っていますね。
Y軸、z軸も同様に直しました。
Y軸の負から見た図です。Left Viewに当たります。
合っています。
Z軸の負から見た図です。Bottom Viewに当たります。
合っています。
うーん。出来たみたいですが確認します。
View ModeをWorld Normalにセットします。
結果です。
むむむ。
全部のProjectionの向きは合っていました。
しかし私の作成したNormal MapのProjectionは境界がはっきり見えています。
Tutorialのやり方だとどの向きから見ても正しいNormal Mapになっています。
以下にTutorial通りに作成したNormal Map用のTri-PlanarのProjectionとの比較を示しておきます。
おお。
やっぱり、今回理解出来なかった最後の式にもっと大きな秘密が有りそうです。
TutorialのTop Viewを見ると
左上は青の部分が多く
右下の部分が青の部分が小さくなっています。
うーん。
まだまだ奥が深いですね。
しかしもうそろそろ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つの要素がある。Painting、Specular Painting、そしてDark Outlineです。今週はこの中のPaintをやります。
- LightingはShader内で自分で作成するのでそのための設定をする必要がある
- Gradientを段々に変化させる
- 数学的に実装
- Textureを使用した方法
- UEでの実装方法
大体理解しました。技術的、数学的に理解するのが難しい所はなさそうです。やってみます。
4.2 Toon Shader Paint - Shader Graph Basics - Episode 38 [2]を実装する
まずResult NodeのShading Modelの設定をUnlitにします。
UEやUnityはLightingはEngineが勝手に計算します。のでそれを止めるための処置です。
まず最初のDot Productの部分です。
UEではDirectional Lightの方向を得る事が出来ないので0.7、0.7、0.7で代用します。
計算結果の値が-1から1までなので0~1に変更します。
いつもの計算です。
結果です。
この計算結果をTextureのU値にして以下に示したようにTexture Sampleノードに繋ぎます。
使用するTextureは以下に示した様に64x64で自分で作成しました。
以下に示した様にTutorialのとは多少形が違いますが、これで試してみます。
SRGBをOffにします。
Compression Settingsの設定をUser Interface 2Dにします。
これを選択する事でFormat の設定が
となります。
Unityの解説ではTiling MethodをClampにしろ。と言っていたんですがUEでは何も言いませんね。
一応、Clampにしておきます。
このTextureをTexture Sampleにセットして以下に示した実装を足します。
結果です。
おお。
綺麗な段々が出来ています。
以下の部分の値を変える事で別の段々を表示する事が出来ます。
0.2に変えました。
0.3です。
以上でした。
<計算で色の段々を作成する方法>
UEの実装の方ではUnityで紹介されていた計算で色を段々にする方法が実装されていなかったのでそれも実装しました。
以下のような結果になりました。
色を付けました。
結果です。
うーん。黒い部分は要らないです。
Lerp ノードで試してみます。
結果です。
うーん。
等間隔なのは納得出来ないですが、こっちの方が良いですね。
肌色っぽい色で作成してみました。
うーん。
かなり良いかもしれません。
まだ、考察する時ではないので今週のToon Shadingの勉強はここまでとします。
5.RPGのStoryの改善
5.1 Start MenuのSkipの作成
まずはSkip Buttonを表示するためのWidgetを作成します。
以下のWidgetが表示されたらSkip Buttonは消える様にしました。
Skip Buttonを押したらStart Menu Widgetが、Animationが終わる前に表示されるようにします。
Skip Buttonを押すと以下のEvent dispatcherが発動します。
更にLevel BP内でそのEvent Dispatcherに以下の実装をBindします。
これでSkip Buttonを押したら直ぐにStart Menu Widgetが表示されるはずです。
更にSkip Buttonが押された時は、2回Start Menu Widgetを作成しないように以下の実装も追加しました。
テストします。
Skip Buttonが押されてから以下のWidgetが表示されるまで2秒位かかります。何でなんでしょう?
Start Menu Widgetの Event ConstructでAnimationをPlayするようにセットされているせいでした。
Skip ButtonをClickした時としない時で実装を変更しました。
どっちを選択するかは以下に示したようにExpose on Spawnに新しい変数を追加する事で決定します。
テストします。
Skip Buttonを押すと直ぐにStart Menu が表示されます。
後ろのAnimationやBGMの変更は来週やります。
<操作の説明の直し>
直しました。
<Game を始めるボタンの直し>
直しました。
<Playerの操作するキャラの職業と所持金を直す>
直しました。
弟子になっています。
金貨の枚数は0枚です。
<昼と夜の時間>
歩数で変化するのは実装方法を考える必要があるので、取りあえずは時間で管理します。
Map1のLevel BPの変数であるTime of Dayの値を
30分に変更しました。
これで一日の長さが30分になるはずです。
テストのためにPlayしていたんですが道具屋で道具が売れない事に気が付きました。
これも後で直します。
15分位で暗くなりました。
あんまりGameをしない私は15分位Gameをしただけでほんの少しですが気持ち悪くなりました。
宿屋に泊まれるようにします。
宿屋の主人を配置しましたが色々オカシイです。
まずSoldierと表示されています。
ここは名前を表示するのか職業を表示するのか決める必要があります。
会話ボタンを選択すると以下に示した様に神殿のWidgetが表示されてしまいます。
これは間違いです。後で直します。
泊まるを押すと所持金がないので「冷やかしなら帰りな!」と表示されます。
この時のPlayerはまだMonsterを倒す手段がないのでお金を稼ぐ事は出来ないはずです。
このセリフで良いのかを検討する必要があります。
<裏道にItemを配置する>
裏道にItemを配置します。
門の出口に回復薬を一個配置しました。
その少し奥にNPCも一体配置しました。
セリフはまだ考えていません。
更に武器を拾える場所への入り口にもNPCを配置しました。
今の所、これらのItemやNPCは静的に配置していますが、後で動的に生成するように変更します。
更にこれらのNPCのセリフも後で追加します。
<剣を拾っても剣が消えないバグ>
もうどんな仕組みでItemを作成していたのか覚えていません。その辺の確認から始めます。
Sub Levelの3-3のEvent Begin Playで以下の様に生成していました。
Spawn Items関数の中を見ると
Boolean関数SpawnがTrueの時だけItemを生成するようになっています。
Pickup Item Widgetの拾うボタンを押すと
以下のコードが実行されますが、
この中の以下のNodeが上手く働いていないようです。
Target 先にはMy Dropped Itemがあります。
My Dropped ItemはこのWidgetが生成される時にGame Mode Base BPのDropped Item Contentからパスされています。
Game Mode Base BPのDropped Item Contentが他に使用されている箇所を探します。
Dropped Item Base BP
内で見つかりましたが、
何と、Game Mode BPではなくGame Instance BP にあるDropped Item ContentにItemの値をセットしていました。
むむ。
ひょっとしてこれが間違いか?
取りあえずGame Instance のDropped Item Contentを参照する様にしました。
テストします。
Itemの剣を取ると
消えました。
直った?
うーん。地面に落ちているItemを拾って実装する方法をまだ完全に思い出していないのであんまり自信はないです。
これは来週、もう一回検証します。
<警告を直す>
警告を表示するBPが2個セットされているだけでした。
直しました。
<Levelの上がる速度を遅くする>
Levelが上がる為に必要な経験値を以下の様に変更しました。
Playerの操作するキャラのLevel Upを管理するData Tableの
設定を以下の様に変更しました。
テストします。
4体のMonsterを倒した所でLevelが2に成りました。
Monsterと戦って思ったのが、Monsterを倒してもお金が貰えない事です。
後で、お金が貰えるようにします。
<最初の魔法について>
色々試してみるのが良いと思ったのでやってみます。
魔法の性能を管理しているData TableであるMagics
の値を以下の様に変えました。
使用するのに必要なMPを前の2倍にする代わりにダメージも2倍にしました。
テストして確認します。
出来ていました。
実際にPlayして確認したのですが実際に魔法が使用出来る様になるまでに10分近くかかりました。
結構遊べます。
<戦闘後の報酬について>
これ、毎回もらえないとPlayするのが大変苦しいです。
このままにしておきます。
調べたらボタンを別なWidgetで作成していて直すのが結構面倒です。
ので今回は直すのは延期します。
ただしボタンの見た目だけ直しました。
むー。
返って読みづらくなってしまいました。
<道具屋の直し>
今回、道具屋で直すのは
- 職業で買える道具を変える。
- 道具を売れるようにする。
- 切符は普通の切符だけ買えるようにする。
の3つです。
<<職業で買える道具を変える>>
職業で買える武器を変えた武器屋のやり方は当然、すっかり忘れてしまったのでそれの復習からやります。
何と、専用のData Tableを作成していました。
これでどの職業ならどの武器が買えるのかをチェックしていました。
うーん。
成程。
これのItem版をまず作成します。
出来ました。
以下の部分のItem版を作成します。
出来ました。
テストします。
出来ていますね。
<<道具を売れるようにする>>
まず武器はどうやって売っているのかを確認します。
以下のWidgetが武器の売りを担当していました。
まずこれをCopyして道具用に改良します。
「出る」ボタンをClickした時にOffにする以下の変数の意味が分かりません。
調べます。
以下のWidgetで使用されていました。
何と、武器を装備する時ためのボタンと武器を売る、更に武器を買う為のボタンが全てこのWidgetから作成されていました。
そして上記のWeapon Shop Sellはこのボタンが押された時に、武器屋で武器を売るときに押された事を示すのが目的でした。
うーん。
道具を売る為のボタンのWidgetは別に作成します。
以下の様になりました。
所持品に追加するためのボタンWidgetを作成します。
まず武器のボタンのように全部を一まとめにする事は止めます。
止めますが、道具を売る以外の、道具を使用する、道具を買う。を管理しているWidgetがあるはずです。それをまず見つけます。
ありました。
Designは全く同じにします。
ボタンを押したら、Itemの金額をPlayerの財布に追加して、ItemそのものはPlayerの道具袋から消します。
武器屋で武器を売った時はその後で更にあるWidgetを消しています。
これが何をしているのかが不明です。調べます。
CursorをButtonの上に乗せた時に表示されるWidgetでした。
同様の機能は道具のボタンにもありますので、この機能を追加します。
追加しました。Item Widgetにある実装と全く同じやり方でやりました。
最後にShop Sell Widgetの
Create widgetに先程作成したボタンであるItem Sell Widgetを選択します。
テストします。
回復薬を2個持っている状態で道具屋に行きました。
回復薬を1個売りました。
金貨の枚数が5枚になりました。
更に回復薬にCursorを合わせると回復薬の説明をするWidgetも表示されています。
出来ています。
<<切符は普通の切符だけ買えるようにする>>
これは既に直しています。
職業が弟子の時に、道具屋を訪れると
しか買う事が出来ません。
<<職業を表示させる>>
道具屋で買い物をする時は、Playerの操作するキャラの職業が表示されません。
武器屋で買い物をする時です。
出来ました。
<原因不明のバグを直す>
何でこのErrorが起きたのかは覚えていませんが、Errorの原因がVictory Music変数の中身が無いからだったはずです。
ので以下の実装を追加しました。
これは戦闘で勝った後で何もしないでいたら起きたバグかもしれません。
それでテストしてみます。
バグが再現出来ませんでした。
良く分からないですが、取りあえずOKとしておきます。
<おまけ>
長年の疑問だった赤線で囲ったStatic Meshが暗闇でも暗くならない理由も分かりました。
ずっとShading ModelがUnlitだと思っていたんですが違いました。
手前の暗くて良く見えない瓶のMaterialとの違いはたった一つ
Emissive ColorにTextureを繋いでいるかどうかでした。
分かってしまえば、余りにも簡単です。
6.Open Worldの検証
6.1 先週のまとめ
以下に先週のまとめを載せておきます。
今週と言うか、これからやりたい事は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まで勉強しています。
それぞれの内容について以下に簡単にまとめます。
この週のBlogで初めてWorld Compositionについて知りました。
World Composition And Basic Level Streaming - Unreal Engine 4 Tutorial [3] でWorld Compositionについて勉強しています。
これしかWorld CompositionについてのTutorialはやっていないんですね。今回の勉強では公式のTutorialとかも調べるべきですね。
Sub Level一個の大きさと、Loadする距離はどの位が適当なのかが分からないと言っています。
もうここでMap1に対してSub Levelを作成してWorld Compositionを使用出来ないのか検討しています。
Section(Component)のサイズを64m^2にして36個のSub Levelを作成しています。
そこにMap1のHeight MapをImportしました。
普通に出来ました。
その後、Unloadの値を決めています。
更に他のTutorialも少しだけここで勉強しています。いますが最初のTutorialで勉強した内容以上のものは得られなかったみたいです。
後、どうせUE5でWorld Partitionを勉強しないといけないので今更UE4のWorld Compositionを一生懸命勉強する必要もないと書いています。これはその通りです。
この週は、Map1のLandscapeをWorld Compositionに変更するためにはどうやるのが良いのかについて考えています。
MapのLandscapeを消して、新しいLandscapeを先週(2021-10-03のBlog)実施した方法でやるのが一番簡単だと書いてあります。
それが出来るのかどうかを、Map1をImportした別なProjectで試しています。
Landscapeの生成場所が自動で決められてしまうので、その位置を自分で変更する事が出来ないみたいな事が書かれていますが、これって出来たはずです。
どのTutorialで見たのかは覚えていませんがLandscapeは自由に動かせたはずです。
それよりも面白いのがWorld CompositionはUE4までの機能でUE5からはWorld Partitionを使用するようになるのでWorld Compositionの勉強はほどほどにすべきだと、ここでも主張しています。
主張してはいますが、結構真剣に勉強しています。
これも勉強するためのコツなのかもしれません。あんまりPressureを与えるとそれに見合う成果が出ないとやる気が無くなってしまいます。しかしこの部分はあんまり大切じゃないのでほどほどの勉強で良い。と言われると安心して勉強出来る効果があるのかもしれません。
実際のRPGを作成しているProject内のMap1をWorld Compositionで作り替えています。
生成したLandscapeの位置を前のLandscapeと全く同じ位置に配置しようとしています。
この為に敢えてActorを配置したりしているんですが、今読み直すと今一このやり方が分かりません。計算が合ったり外れたりしているんですがその理由も分かりません。もう一回同じ方法でLandscapeを作成したら思い出すかもしれません。
ここでWorld Compositionを使用して新しく作成したMap1のLandscapeにBugが見つかります。
こういうやつです。
結局、このBugの直し方分かりませんでした。
後、MonsterなどのActorの動的な生成について検討しています。
Playerの操作するキャラが生成された場所がSub LevelだとLevelが生成される前にキャラが生成されて地面から落っこちてしまいます。
別なLevelに移動して戦闘を行うと言う事はどのGameでもあんまりやっていないんでしょうか?
こういうRPGの作成についての基本的な事についての教科書があるとありがたいんですが。
Playerの操作するキャラが生成された場所がSub LevelだとLevelが生成される前にキャラが生成されて地面から落っこちてしまいます。
この問題を解決するためにPlayerの操作するキャラが別なLevelに移った場合、3秒間空を浮いているようにしました。3秒あったらSub Levelが生成されます。
正し戦闘用のLevelに移動する時だけは、3秒間空を浮いている必要はないので、それを外しています。
更にMonsterを静的に生成させたりしています。
まとめとしてWorld CompositionのSub Levelはかなり大きく作成した方が良いみたいな事が書かれています。
ここでは動的に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を選択して
Import Tiled Landscapeを開きます。
ここでまず
で、ここで読み込んでいるFileのExtensionが
.r16なんです。
うーん。こんなFileどうやって作成したのかしらん。
前回、このTutorialを勉強したのは2022-02-06でした。その時のBlogを読み直しましたが、この事には気が付いていませんでした。
その次にMaterialをセットしてそのMaterialにあるそれぞれのLayerに対してのHight Mapを読み込ませています。
うーん。
となるとWorld Machineの設定通りのMapを生成しているみたいですね。
こいつの意味をまた忘れてしまいました。
調べ直しました。
これ読むと64平方メートルのSectionが4つComponentに入っている。そしてそのComponentは8x8ある。と解釈出来ます。64m * 2 * 8 = 1024 mですが
生成されるLandscapeの一辺のサイズは7km です。
この辺の関係性が良く分かりません。
と言うか逆にこの辺の関係性さえ理解出来れば、16km^2のMapの作成は出来る様になりそうです。
もう一回World Machineの設定から見直してみます。
<World Machineの設定>
Project Settingで
に設定していますが、Previewには
こんな感じで表示されています。実際に作成したLandscapeそのものは7Km と言う可能性もありそうです。
Resolutionは1009にセットしています。
Exportした時にどっちが基準になるんでしょうか?
ResolutionのサイズでUE4のLandscapeのサイズも決まったりするんでしょうか?
56 kmなのでTileは7 x 7であると言っています。Tile一辺の大きさは8m何でしょうか?
今度はTiles per Sideの値を変えています。
Resolutionの方は1009に変更していました。
うーん。
この設定だと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する方法は忘れていました。
これの使用方法は未だに分からないです。
Vertex Weldingのテストです。
うーん。出来ています。
最終的な形状です。
一応、全部の機能の確認をしました。
7.2 User Guideの「6. File Input and Output [5] 」を勉強する
今週は以下の機能を勉強するみたいです。
<File Output>
File Outputが
でした。
<Height fields>
ここで言うHeight FieldはHeight Mapの事みたいです。
Height Outputを選択して
Layout Viewを開くと以下の詳細が表示されます。
多分、これがTutorialの以下の部分に対応していると思われます。
試しにWrite Diskを押して見たら以下のPNG Fileが作成されました。
<Terrain Meshes>
以下のDeviceについての解説と思われますが、
このDeviceに接続できるPortが見つかりません。
Layout Viewを開くと以下の詳細が表示されます。
これとTutorialの
が対応しているんでしょうか?
最初のMesh Typeは無いですね。
DeviceをDouble Clickしたら以下のBoxが表示されました。
ほぼ同じです。
<Bitmaps>
以下に示したヤツの解説です。
以下の部分の機能について解説しています。
開いて見たら以下に示したImageが表示されました。
<File Input>
以下のDeviceの事のようです。
File InputのInput Propertiesを開きました。
TutorialではこのPropertiesの設定について解説していますが、今一良く分かりません。
8.雪山のMapの作成
8.1 複数のTextureを混ぜてMaterialに変化をつける
2022-03-14のBlogを見るとTexture Repetitionを無くすために以下の4つの方法を使用しています。
この中の最後の方法である「複数のTextureを混ぜてMaterialに変化をつける」を実装します。
これのやり方、全く覚えていなかったんですが、2022-03-14のBlogに簡単にまとめられていました。
成程。
丁度、Layer Snow Bが丸々空いています。
ここに作成する事にします。
何と、Material Attribute Nodeを直接Lerp ノードに繋ぐ事は出来ません。
うーん。一から作成するしかないみたいです。
新しいMaterial Functionを作成しました。
Snow LayerのMaterial FunctionとDirt Layer のMaterial FunctionをそのままCopyして
Perlin NoiseでLerpします。
Perlin Noiseは以下の様に実装しました。
以下に示した実装を追加します。
追加しました。
更に、Input Functionの名前を分かり易いように変更します。
最終的には以下の様になりました。
こんな感じで接続しました。
LandscapeにセットしてあるこのMaterialのInstanceのParameterは以下の様に変化しました。
テストしたらBlendしたLayerが真っ黒になってしまいました。
うーん。
Lerpのalphaの値を0にしてみました。
あれ。白くなっています。
今度は1にしました。
あれ?
出来ている。
分かりました。
OpacityにBlendを繋ぐと以下の様になります。
うーん。何で?
TutorialであるHow to HIDE Texture REPETITION in Unreal Engine - UE4 Tutorial [6] を見てみます。
普通にLayer Blendの前で
あれ?LerpノードじゃなくてBlend Material Attributeノードを使用しています。
うーん。
作り直します。
結果です。
同じ結果ですね。
うーん。
何かこれと同じ事が起きてそれを直した記憶があります。
Tutorialから探したんですが見つかりませんでした。
仕方ありません。
前の実装に戻します。
OpacityだけLerpを外しました。
Parameterを調節して以下の様になりました。
こんな感じです。
うーん。
一応、OKとしましょう。
以下の様に塗り直しました。
こんな感じになりました。
うーん。これだと雪山というより一寸だけ雪が降った山って感じです。
<改良案>
今週の予定は終わったんですが、来週、崖用のLayerを追加した後でどの様に改良するのかについての考えをまとめておきます。
まず、Dirt Layerを今のSnowとDirtをBlendしたLayerに変更します。
そして今、SnowとDirtをBlendしたLayerは氷のLayerを作成してそれで代用します。
9.Game Design:ポケモン+HxHの念能力( 戦闘システムの作成)
9.1 Switch(右→中央)の魔法を実装する
<魔法使用の流れ>
まず全体の流れを追います。
W Player Make Decision WidgetでPlayerは使用する魔法を選びます。
一応、Switchの魔法用のボタンも追加しました。
魔法のボタンを選択するとGame Mode BPのPlayer Magic Name変数に適切な値がセットされます。
Game Mode BPのPlayer Magic Name変数はtypeがMagic NameというEnumなので
そこにSwitchも追加しました。
Switchの魔法を選択したらGame Mode BPのPlayer Magic Name変数にSwitchがセットされるようにします。
この後、W Player Make Decision Widgetの決定ボタンを押すと
次のPhaseに移行します。
この後、色々なPhaseを追加しますが、関係ないので記録はしません。
次に大切なのは、Event Player Action Phaseです。
ここで、Event To Level Player Monster Fightが呼ばれます。
このEvent Dispatcher のBindはLevel BP内で行われています。
Player Monster Attack にBindしています。
このPlayer Monster AttackでPlayer Use Magic関数が実行されます。
Player Use Magic 関数の実装です。
ここにSwitchの魔法を追加すれば良い訳です。
<PlayerのMonsterの位置を指定する変数を全部調べる>
まず、Game Mode BPの変数3つです。
これらの変数のTypeはNameなのでMonsterの名前だけ保持しています。
次に、Level BP内で以下の3つの変数でMonster BPを管理します。
これらの変数のTypeはMonster BPなのでほぼすべてのMonsterの情報をここで管理しています。
最後にLevel BPのSet Monster BP to Widget関数で
W_Player Make Decisionの
以下の変数の値を指定します。
ただしこれらはW_Monster ParameterというWidgetで以下の様な変数を持っています。
以下の実装でMonster BP変数に値を移しています。
一応、見つかったのがこの三か所なのでこの三か所を交換する実装をこれから作成します。
<Monsterを交換するための実装をする>
Game Mode BPにあるMonsterの名前を交換します。
Level BPにあるMonster BPを交換します。
最後にW_Player Make DecisionのW_Monster Parameterを交換します。
テストします。
以下のMonsterが交換します。
交換しません。
更に次のPhaseに移行もしなくなりました。
Print Stringで調べます。
中身は交換されているようです。
うーん。
先に進まない理由は直ぐに分かりました。
以下のEvent Player’s Monster’s Turn End で
交換魔法を使用した時の接続を忘れていました。
直しました。
直りました。
次のTurnに移行しています。
更に次のTurnになったらWidgetのMonsterの配置も正しい形に直っています。
分かりました。
以下の様に最後のWidgetの部分はMonster BPを交換しました。
結果です。
Widgetに表示されるMonsterの位置が交換されるようになりました。
後は召喚されたMonsterの3d Modelが交換されないBugを直すだけです。
これは来週やる事にします。
10.Blenderの勉強
10.1 先週までの復習
<Selection Method>
毎日、復習すると言ってあれから全然やっていません。
LoopやRingの選択を追加した途端に、何かやる気が無くなってしまいました。人間ってどっか心の深い所でこれは必要じゃないと判断するともうやる気が出てこないのかもしれません。
LoopやRingはAlt、もしくはAlt + Ctrlを押した状態でEdgeやFaceを選択します。それだけです。
RingとLoopの違いより縦にLoopするのか横にLoopするのかが大切な気がします。上記の状態で本当は横にLoopして欲しかったです。
隣の面を選択してLoopをしたら横にLoopしました。
こっちの方が実践的かもしれません。
Edgeの場合です。
Ctrl + Altを押しながらEdgeを選択します。Ringに当たります。
Altの場合です。Loopに当たります。
Edgeの時はLoopとRingの違いは分かり易いですね。
Edgeが全部繋がっているのがLoop、繋がっていないのがRingです。
CircleやBoxによるFaceの選択は、CやBを押して左クリックして選択します。
LassoはCtrlを押しながら右クリックしてDragでした。
Edgeの最短距離の選択は、Edgeの選択、Ctrlを押しながら別のEdgeを左Clickで選択です。
分からなくなったらCtrlか Alt、もしくは両方を押したら全部何とかなりそうです。
<2022-02-14のBlogの復習>
UV Editingの以下のオレンジの点を動かす時に押す、Keyを忘れていました。
Gです。
Shift + Spaceで以下のboxが表示されます。
このやり方もすっかり忘れていました。
だた、このboxって
と機能的には同じです。忘れても何とかなりますね。
Pivot Pointの表示方法です。Period Keyを押すだけです。
これも忘れていました。
<2022-02-21のBlogの復習>
BevelとかShrink とFlattingは、復習はしますが覚えなくても良い事にします。
3D Cursorの動かし方について結構忘れています。
- Shift+MouseのRight Clickで移動
- Shift + S で以下の図を表示します
<2022-02-28のBlogの復習>
これ超重要です。
後は、Selection Methodとかの解説ですね。
この後の週は復習だけして終わっています。まあやらないよりは全然マシなんで、卑下する必要は全く無いですので、このまま続けていきます。
10.2 Imphenzia氏のLearn Low Poly Modeling in Blender 2.9 / 2.8 [7]の続きを勉強する
前回はLasso Selectionまで勉強したんでその続きからやります。
<選択した面を増やしたり少なくしたりする方法>
以下のGeometryで一面だけ選択しています。
Ctrl を押しながらNumber Padにある+ Keyを押します。
選択面が増えました。
今度はCtrl を押しながらNumber Padにある- Keyを押します。
選択面が減りました。
Tutorialによるとこの技術を利用する事で、以下に示した様な雪が積もった状態を簡単に作成出来るそうです。
<Random な面を選択する>
これはそのままTool BarのSelectから選択していました。
結果です。
興味深いけど何に使用するんでしょうか?
<似ている面を選択する>
Shift + Gで似ている面を選択するそうです。
Shift + Gを押したら以下のBoxが表示されました。
ここから似ている要素を選択するみたいです。
試しにAreaを選択したら以下のようになりました。
<Checker Deselect>
F3を押してChecker Deselectedを選択します。
以下に示した様なEvery other faceを選択をします。
これは城の塀や
台所の床を作成するのに使用出来ます。
<選択した面を隠す>
Hを押すと選択した面が画面上から消えます。
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だそうです。
MouseのWheelを回す事でLoop Cutの数を増やせます。
Mouseの左ボタンを押すと位置を移動出来ます。右ボタンは中心にセットします。
更に以下の部分の歪みの直し方が紹介されていました。
LoopでEdgeを全部選択し、SでScaleします。ただしScaleするのはZだけなのでZを押します。
Edgeがまっすぐになりました。
Tutorialでは以下のようなBoxを作成していました。
<Knife Tool>
Kを押すだけだそうです。
以下の様にVertexとEdgeが追加されました。
Tutorialでは以下に示した様なFaceを作成して別な色を適用していました。
ふーん。でも余計なPolygonを増やすだけじゃない。と思ったんですが。ここからExtrudeをして以下の様なBoxになりました。
うーん。これは凄い。
この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