<前文>
<徹底的に追いつめられると、何故か土下座して許してもらおうとする日本人>
先週、突然気が付いたんですが、日本人が誤解しているアメリカ、特に日本文化とキリスト教文化の違いから生じる勘違いについて専門的に語っている人がいないんです。山本七平氏の「空気の研究」や井沢元彦氏の「逆説の日本史」のような第三者的な観点から日本文化の独自性について語っている人はいますが、その結果、日本にとって最も重要な国であるアメリカとの関係にどんな影響が生じるのか論じている人はいません。
これ、滅茶苦茶大切な事です。
それで在米歴10年の私が、それについて重点的に語る事にしました。
今週は、日本人と土下座に関してです。
日本人全体に言える事ですが、徹底的に追いつめられると、何故か土下座して謝って許してもらおうとします。
これってアメリカでは全く通じませんから。
戦後、キリスト教文化のrepentanceが歪んだ形で紹介されて、キリスト教では真剣に謝れば許してくれる的な解釈で日本文化に受け入れられたんだと思いますが、repentanceが通じるのはあくまで真摯に反省してそれまでの悪い行いを直す約束をした場合のみですから。
大体、キリスト教的な考えからしたら、悪い事をしていないのに、罪の告白をしたらそれ自体が大変な罪です。後、repentanceは神様に対してするモノで人間に対してするモノではありません。
長年の間、何で日本人は徹底的に追いつめられると、土下座して謝って許してもらおうとするのか、私には不思議でした。
知り合いの人から聞いた話ですが、その人の友人は元ラグビー部で身長が185cmもあったのに、ヤクザに殺された時に包丁で刺されまくっているのに、土下座して謝っていたそうです。
更に重要な問題ですが、土下座された方だって、ヤクザとかじゃなく常識的な人だったら困ってしまうでしょう。だって土下座されても何も問題は解決しないんですから。
そこで、気が付いたんですが、土下座って日本文化なんですよ。
先程の例でもヤクザと土下座なんて、もろに日本文化じゃないですか。
じゃあ、アメリカを含むキリスト教文化の国(もしくは会社でも、個人でも)との関係で徹底的に追いつめられたとき、土下座して謝って許して貰おうとするより良い方法があるんかよ?となりますが、あります。
それは徹底的に自分の無実を主張する事です。
日本人から見ると、不思議なアメリカを含むキリスト教文化の特徴の一つですが、正式な裁判を受ける権利を奪うのは大変な罪なんです。
アメリカ人は謝らないと言うのは嘘です。アメリカ人も日常生活では結構、頻繁に謝ります。
ただし絶体絶命な状態に追い込まれた時、つまり日本人が土下座するような状況になった時は、絶対に謝りません。それは謝ったら無罪を裁判で主張出来ないからです。
ほとんどの日本人にとってアメリカを含むキリスト教圏の関係者から徹底的に追いつめられる事は、現状ではないと思います。しかしもしそういう事態になって、もう土下座してでも良いから許してもらおうと思ったら、そこは踏みとどまって、無罪を主張する方法に変換して下さい。少なくとも土下座するよりはマシな結果になりますから。
それでは、今週の勉強を始めます。
<本文>
1.今週の予定
今週は以下の事についてやっていきます。
- Particle Systemの勉強
- Niagaraの勉強
- CGHOW氏のNebula Effect | UE4 Niagara Nebula [1]をやってみる。
- Cascadeの勉強
- 砂のEffectの作成
- Boundについての復習
- RPGの作成の続き
- 駅の実装のテスト(バグ出し)
- 切符を使用して銀河鉄道に乗る機能の実装
- 切符を道具として使用した場合の検討
- 別なマップに移動してる間に別なアニメーションを表示する方法についての調査
- Good Skyの復習
- Niagaraの勉強
2. Niagaraの勉強
一応、Niagaraの基本は理解したので、先々週から応用編としてCGHOW氏のTutorialの勉強を始めました。
しかし先々週から始めたTutorialは途中で雲にLight を照らす方法が分からなくてとうとう頓挫してしまいました。
頓挫してしまった理由の一つは、CGHOW氏のTutorialで2019以前に作成されたものは、現在のNiagaraと少し形状が違っていて単純に真似て作成する事が出来ない箇所があったからです。
ので今回はCGHOW氏が、2020年以降に作成されたTutorialで時間が短いものをやってみます。
2.1 CGHOW氏のNebula Effect | UE4 Niagara Nebula [1]をやってみる。
まず、EmptyのNSを作成しました。名前はTestです。
Emitter UpdateにSpawn Rate Moduleを追加しました。
Spawn Rateに1000をセットします。
Sprite が生成されました。
Particle Spawn CategoryにSphere Location Moduleを追加しました。
以下の様になりました。
正し、Tutorialは以下の様になっています。
うーん。
Sphere Radiusの半径を100から1000に変更してみます。
こんな感じになりました。
これでいきます。
そしたら、TutorialではこのSphere Location Moduleを外して、代わりにStatic Mesh Location Moduleを追加しました。
このTutorialによればStatic Mesh Location Moduleの機能は、Sphere Location Moduleと同じだが、Sphereの代わりに指定したMesh内にSpriteを発生させるそうです。
そして使用するMeshを指定するためにSample Static Mesh Moduleの使用が要求されます。
Sample Static Mesh Module内で使用するMeshを指定します。
Tutorialと同じMeshをセットしました。
Preview MeshとDefault Meshがどう違うのかは良く分かりませんね。調べようかと思ったら、それを調べるよりもっと大きな問題が起きてました。
Sphere Location Moduleを使用した時と同じように、Cube全体が光っています。
Tutorialでは以下のような感じなのに。
Sphere Location Moduleを使用した時と同じようにMeshのサイズを大きくしようとしたら、
そんな機能はついていません。
ではSpriteのサイズを小さくします。
あれ、SpriteのサイズってRendererで指定していませんでしたっけ。
どのModuleでSpriteのサイズを指定出来たのか忘れてしまいました。
Googleで検索したらgameDev Outpost 氏のUE4 - Niagara Adjusting Size [2] で説明されていました。
Initial Particle ModuleのSprite Attributesで指定できます。
Uniform Sprite Sizeを10から3に変更しました。
今まで、Initial Particle Moduleは何回も使用していたにも関わらずすっかり名前を忘れてしまってました。
結果を以下に示します。
大体、Tutorialと同じイメージになりました。
今度はParticle Update にCurl Noise Force Moduleを追加します。
Default値がTutorialの値と違います。
Previewのイメージはイイ感じです。Spriteのばらつき具合が良いです。
値をTutorialと同じにしてみます。
バラツキがなくなり一気に下に落ちて行っています。
Tutorialのイメージとは全然違います。Tutorialのイメージを以下に示します。
Curl Noise Force Module の値を色々いじって見ました。
以下の値の時に綺麗な挙動をします。
こんな感じです。
取りあえずこれでいきます。
今度は、Particle Update にDrag Moduleを追加します。
こんな感じになりました。
Initialize Particle ModuleでSpriteのサイズを1にしました。
のわあー。
結局、TutorialでもSpriteのサイズを変えてるじゃないか。
今度は、Emitter Properties ModuleのSim TargetからGPUを使用するように変更しました。
Tutorialではこの変更後何も起きていませんが、私の方では、以下の様な警告が出ています。
Bound ボタンを押して以下の様なBoundを作成しておきました。
勿論、警告は消えました。
勿論、GPUに変更した後はSpawn Rateを増やします。10000にセットしました。
こんな感じです。
Vortex Force Moduleを追加します。
ここまで来て大問題です。
Tutorialでは、以下のStatic Mesh をMayaで作成して使用しています。
これの作り方は分かりませんね。
ここは無視して先に進みます。
次はTextureに星雲のイメージを使用する方法を勉強します。
星雲のイメージ自体がないのでUnsplash [3] から以下のイメージをDownloadしました。
Materialを作成します。
Sprite RendererのMaterialにセットします。
以下の様なイメージになりました。
拡大すると分かりますが一つのParticle にTextureのImage全体が貼り付けられています。
Particle全体にこのTextureを貼りたいのです。そのために、
Materialの実装を以下の様に変更して、
Particle Spawn のSample Static Mesh ModuleとStatic Mesh Location Moduleを消去します。
そしてScratch Moduleを追加します。
Scratch Moduleの中身を以下の様に作成しました。
おお。初めてModuleの中身を作成しました。内容については後で検討します。
Scratch ModuleのMeshをセットして
Reviewを見ると、まだ一個のParticle に対してTexture全体を使用しています。
これを直すために、Scratch Moduleの実装を以下の様に変更しました。
これも内容については後で検討します。
全部のParticle に対してTexture全体を使用するようになりました。
出来た。と思ったら以下に示したTutorialのEffectと同じにするにはまだ色々追加する必要があるそうです。
元々、使用しているNebulaのTextureが違うし、Meshの形状も違うので全く同じになる訳がないので、ここからは話を聞く位の軽い感じでTutorialをやっていきます。
まず作成したEffectが3つありました。
一番左のEffectが今、私が作成したものと同じヤツだそうですが、以下の点が改良されているそうです。
- Particleの数を増やしている。
- Curl Noise Forceが追加されています。
- Scale Sprite Sizeで以下の様な値をセットしている
2番目のEffectは最初のEffectをDuplicateして作成しました。
そして以下の点を変更しました。
- Spawn Rateの数を減少します。
- 使用しているMaterialを以下の物に変更します。
- そのためParticle SpawnのInitialize Particle ModuleのColorの値を1以上にセットする事が出来ます。
最後のEmitterもDuplicateして作成します。
そして以下の点を変更しています。
- Sprite RendererのAlignmentをVelocity Alignedにセット。
- Initialize Particle ModuleのSprite Sizeの値を以下の様に変更
だそうです。
最後にこのTutorialで使用したStatic Meshの作成方法をMayaを使用して説明しています。
2.2 Nebula Effect | UE4 Niagara Nebula [1]をやってみての感想やまとめ
前回のSmokeのTutorialと比べるとかなり本格的なVFXでした。
実装面から言えば、
- GPUを使用している
- Sample Static Mesh Moduleを使用している(前半部分)
- Scratch Moduleを使用してオリジナルのModuleを作成している
という事を新たに学びました。
更に、使用するStatic MeshをMAYAを使用して自分で作成するなど、今まで勉強したモノよりかなり難易度の高いTutorialでした。
しかし、CGHOW氏のTutorialの作成方法は最初に、最終的には使用しないSample Static Mesh Moduleを使用して、視聴者にやりたい事を理解させて、その後でScratch Moduleを使用してオリジナルのModuleを作成する事で、私のような比較的初心者レベルでも付いてこれる様に工夫がされていました。
CGHOW氏は大学教授なんでしょうか?教え方が素人じゃないような気がします。これは勉強しがいのあるTutorialかもしれません。
2.3 来週の予定
来週はCGHOW氏の別なTutorialをやろうと思っていたのですが、今週、Nebula Effect | UE4 Niagara Nebula [1] をやってみて、余りに内容が濃かったので来週は復習や深堀をする事にします。
来週の予定としては、
- Moduleの勉強
- Static Mesh Location Moduleについて
- Curl Noise Force Moduleについて
- Drag Moduleについて
- Vortex Force Moduleについて
- Scratch Moduleについて
- GPUの使用について
- 一般的な概要について
- Boundについて
- Scratch Moduleの中身の実装について
- 最初のサラの状態で存在するノードの機能や役割を調べる。
-
- 左脇に表示されているToolについて調べる。
- このTutorialで追加したNodeとその役割について調べる。
- 作成したModuleの機能について解説する。
- 今回作成しなかった残りのEffectも作成する。
を行います。
3. Cascadeの勉強
3.1 砂のEffectの作成
CascadeのTutorialを探したんですが見つかりません。ので今回は以下のTutorialを見て砂のEffectの作成についての知見を高める事にします。
です。
サッと、最初の5分位見たのですが、両方とも単なるTutorialと言うより、砂の作成における理論と実践方法についての解説と言う感じでした。こういう勉強もたまには良いでしょう。
3.2 Sand Rendering in Journey [4] を見て
Thatgamecompany社のJohn Edwards氏がGDCで講演した内容です。GDCはGame Developer Conferenceの略です。
Sand Rendering in Journey(砂のレンダリングの旅)と言う題から、ゲームにおける砂のRenderingの歴史について語るのかと思ったら全然違いました。この会社が制作しているゲームの名前がJourneyだったんです。つまりそのゲームにおける砂のRenderingについての講演でした。
このゲームはPhyreEngineを使用して作成されたそうです。
PhyreEngineは初めて聞くGame Engineです。
ちょっと調べて見ます。
ぱっと見た所、9年前位で開発が止まっていますね。このゲームも2012年に制作されたようです。
まあでも、役に立つ話はあるでしょう。取りあえず聞いて行きます。
<砂のRenderingについて>
MIT Map Sharpening Effectについてです。遠くの景色をSmoothにする効果があるそうです。
これが元のイメージです。
こっちがMIT Map Sharpening Effectを使用した場合です。
遠くの景色がどこからなのかが分からないですが、砂が柔らかくなっている印象を受けます。特に人が立っている辺りの左右の砂が砂らしいです。
ただし太陽からの光を反射している箇所は、両方ともまるでビニール樹脂のようです。
Anisotropic maskingのEffectについてです。
Radioactive Oatmeal on the Silhouettesみたいと語っていますが、ギラギラ光り過ぎていると語りたいのでしょうか?
Anisotropic filteringってどんな技術でしたっけ。全く覚えていないです。
ちょっと調べます。
非常に簡単に言うと、見る角度によってあらゆる物体はちょっと歪んで見えます。その歪みを考慮してTextureを貼る事をAnisotropic filteringと言うみたいです。
実際の計算方法までは調べませんでした。
Filteringの歴史は、なし、Bi-linear、MIP、Tri-Linear、そしてAnisotropic filteringとなるみたいですね。上記のAnisotropic maskingはMIPかTri-Linearを加えた上にAnisotropic filteringを行っているんでしょうか?
Textureを歪ませて貼った結果、現実離れしたギラギラ感が発生してしまったと言う事が言いたいみたいですね。
それよりも私は太陽の光を反射している箇所のビニール感が気になります。
Glitter Specularです。
John Edwards氏の説明にあるようにAnisotropic maskingよりギラギラ感が消えています。
Glitter Specularという技術が何を指しているのか不明ですが、砂のキラキラ感を表現する技術なんでしょうか?
Anisotropic filteringを使用する事で砂のキラキラ感がオカシクなってしまったので、別な方法で砂のキラキラ感を計算したんでしょうか。それがここで言うGlitter Specularの事なのかもしれませんね。
Ocean Specularです。
何と、太陽の光を反射している箇所のビニール感がなくなりました。
Ocean Specularに関してはJohn Edwards氏は反射を消したとだけ説明しています。
単なるLambert Shadingを使用した場合と、カスタム化したDiffuse Shadingを使用した場合だそうです。
この時にスライドで表示された画面がどっちを表しているのかは不明です。
Lambert ShadingってPBRの前に使用されていたDiffuse Lightingを計算する方法でしたっけ。それともPBRの中で使用されているDiffuse Lightingを計算する方法でしたっけ。
覚えていません。
Detail heightmapsです。
Displacement Mapを使用し、Landscapeをスムーズにしたそうです。
Displacement MapはLandscapeを本物っぽくするのに非常に重要です。はい。
<砂のRenderingについての各論>
ここからは各論的にそれぞれのイメージについて細かく解説しています。
MIPSについてです。
正直、同じに見えます。
100 pxを1mとすると
1pxの中に400個の砂粒が入っている計算になるそうです。
このリアルさを出すためにノイズを使用しているそうです。
このノイズは砂のNormal mapのばらつき具合のランダムさを表現しています。
今度は砂のキラキラについてです。
Glitterが在る場合とない場合ですね。ある場合の方が砂らしさが出ています。
このキラキラですが、太陽とカメラと砂のアングルでたまたま光る状態の砂が光っています。つまりカメラが移動すると光る砂は変わります。
そのために以下の式(N・Vの方)を使用したそうです。
しかしその状態でAnisotropic maskingを使用すると以下の様にギラギラした箇所が誕生してしまいます。
Anisotropic maskingを使用するとオカシクなる部分を区別出来るようにしました。
黒い部分がそれに当たります。この部分にはAnisotropic maskingを使用しない事にする事でギラギラした箇所が発生しないようにしました。
すると砂のキラキラ感がなくなってしまいました。予想以上にカメラに映った背景には黒い部分が占めていたからです。
その対策としてSpecular lightを追加する事にしました。
はい。ビニール感が出て来ました。
この変な反射光が生まれる理由は、砂の持つ流動性を考えていないからじゃないのかと、流体に対する反射を作ったそうです。
そうすると以下の様になったそうです。
これでも、まだビニール感がありますね。
次はLambert Diffuseを改良した話です。
Lambert の計算では、Diffuse lightingが正確でないため、あらゆるものが本物らしくなくなってしまったそうです。
ここでOren-Nayar Modelの計算方法を採用しようとしたら計算コストが高すぎてゲームが動かなくなってしまったそうです。
そこで解決策として以下の式に適当な数値をぶちこんで本物っぽく見える値を採用したそうです。
最後にheight mapについてです。
ここでHeight mapに使用されるTextureはUE4のLandscapeに使用されるTextureと同じでしょう。
特に注目すべき内容はなかったです。
以上でした。
<感想>
これは砂のVFXというより砂のLandscapeのRenderingについてでした。そういう意味では途中で止めても良かったんですが、
- 砂がキラキラしてるのが砂感を出している。
- しかし砂粒は小さすぎて計算出来ないのでNormal Mapでキラキラ感を出す方法を編み出した。
- しかしそれをそのまま使用した場合、Anisotropic maskingによって砂がギラギラに光って滅茶苦茶になってしまった。
- Anisotropic maskingを使用するとオカシクなる部分を抜き出し、その部分にはAnisotropic maskingを使用しないようにした。
- そうするとキラキラ感が全くない部分が多すぎるようになってしまったので、Specular lightingを追加した。
- Specular lightingをそのまま使用すると、ビニールみたいな光沢になるので流体に対する反射を考慮してSpecular lightingを計算し直した。
の流れがとても面白かったのでそのまま勉強しました。
この部分自体はUE4の砂のVFXを作成するのには役には立ちませんが、砂らしさは砂のキラキラから来ていると気が付いてからのそれを実装するまでの大変さは、これから自分でUE4でVFXを作成する時の参考に絶対なると思いました。
先週のBlogで以下の様に述べましたが、
砂のキラキラ感も正にここでいう脇役です。
脇役を一人追加するのがこんな大変だったとは驚きです。それを学べただけでもこれを勉強した甲斐はありました。
VFXを自分で作成する時に、炎におけるEmber、雪における色や形状が微妙に違う雪質の存在、そして砂におけるキラキラ感、のような存在に新たに自分で気が付いても、それを破綻なく実装するのは並大抵の工夫では無理なんだと分かりましたね。
3.3 Making Dynamic Desert Sand in Unreal Engine 4 [5] を見て
時間がないので簡単な感想だけ書きます。
こっちもEffectではなくLandscapeのRenderingが主な話でした。
日本のアニメじゃ砂で攻撃する強キャラは必ず一作品に一人はいますが、アメリカではあんまり無いみたいですね。
砂のVFXは自作するしかないのかもしれませんね。
来週はNiagaraでも探して見ます。
3.4 Boundについての復習
Intro to Cascade: Creating a GPU Sprite Emitter | 05 | v4.2 Tutorial Series | Unreal Engine [6]の5分10秒の当りから詳しいBoundについての解説がありました。
まず最初に訂正です。Boundsの正式名称はfixed bounds boxでした。
GPUで作成したEffectが以下に表示されています。
これがカメラを少しずらすと
何と、Effectが消えてしまいます。
これはGPUはCameraのView Frustumから外れるとRenderingしなくなるように設定されているからだそうです。
しかしCameraのView Frustumから外れてもGPUで生成したSpriteの端はまだCameraに写っているので、GPUにはRenderingを続けて欲しいです。
Bounds のSet Fixed Bounds を選択するとfixed bounds boxを生成します。
Boundsが選択された状態だと、生成したfixed bounds boxを可視化する事が出来ます。
新しいfixed bounds boxを生成したらReStart Levelをクリックして下さい。
これで新しく生成されたfixed bounds boxがEffectに追加されます。
今度はGPUで生成されたEffectは消えません。
新しく生成されたfixed bounds boxがCameraのView Frustum内に入っている限り、GPUはRenderingを続けます。
はい。
これが、fixed bounds boxの効果だったんです。
4. 駅の実装のテスト(バグ出し)
先週作成した駅のテストを行い、バグを洗い出します。
そのためにLandscape1にGalaxy Train Stationを配置して今まで配置していたWarp Gateを消します。
テストします。
駅の名前もあっていますし行き先もあっています。
銀河鉄道に乗ります。
Map1につきました。
今度は、Map1から銀河鉄道に乗ります。
Landscape1に着きました。
今度は「止めます」ボタンを押します。
駅員との会話が終わってしまいました。
ここには戻るボタンが欲しいですね。
作成します。
前画面に戻りますボタンに実装を追加します。
テストします。
「前画面に戻ります」ボタンをクリックします。
前画面に戻りました。
色々試してみます。
当然ですが、「駅員と会話をする。」「切符の交換」の機能はまだ作成していません。
切符を買うために所持金を100から2000に変更します。
ゲームを起動します。
金貨2000の2000がはみ出しそうです。
直します。
Horizontal BoxをBorderでWrapしました。
BorderのBrushのImageに今まで使用していたイメージをセットしました。
BorderのSize to Contentをチェックしました。
これで後ろのImageからはみ出す事は無いはずです。
テストします。
はみ出してはいませんね。
ただし以下の部分の設定の意味が今一分かっていません。
この部分は表示するテキストの位置だけを指定しているのか、それともテキストにサイズにも影響を与えるのか、その辺が良く分からないです。
ものは試しなので今度は100000で試してみます。
以下の様になりました。
金貨の数字の部分がはみ出す事は無いですね。
最初の目的である切符を購入してみます。
切符の値段が表示される箇所に、所持金が表示されています。直します。
直しました。
今度は切符の値段が表示されています。
切符を買ってみます。普通の切符、赤い切符、そして青い切符を買いました。
駅から出て、道具袋を開くと普通の切符、赤い切符、そして青い切符を所持している事が分かります。
道具袋の左側に表示されるPlayerの操作するキャラのStatusは分かりにくいですね。
日本語で表示するようにします。
後、この道具袋を開いた状態で、左側の切符をクリックすると切符を使用した事になります。
現状、切符には道具としての効果は何もないので切符が消えるだけです。道具としての切符の効果については後で考えます。
色々弄って見ましたが、大きなバグはこれ以外は見つかりませんでした。今回のバグ出しはここまでとします。
5. 駅員との会話の実装
会話用のWidgetのデザインは先週作成した、Start 画面における赤い帽子の魔女との会話用のWidgetと同じにします。
駅員の帽子が大きすぎて完全に同じにはなりませんでしたが大体同じデザインになりました。
G_Train Station Widgetから先程作成したWidgetを開けるようにします。
しました。
ついでに戻るボタンも実装します。
テストします。
「駅員と話しをする」ボタンを押します。
先程作成したWidgetが開きました。
戻るボタンを押しました。
前の画面に戻りました。
それでは会話部分の作成を行います。
会話部分を作成します。
NPCと同じ方法で作成しました。
このセリフ部分を表示するための機能を実装します。
NPCとの会話やスタート画面での魔女との会話の実装とほぼ同じやり方です。
テストします。
字が小さいですね。
もっと長い文章を表示してみます。
文字は白抜きした方が良い気がしますね。後、BorderのPaddingも変更しました。
白抜きすると変に目立つので背景の紙と同じ色にしました。
結果です。
まあ、いい感じです。
以下の様になりました。
今度は回答用のボタンを作成していきます。
先週、作成したAnswer Button Witch Widgetの丸コピーで作成します。
変更した部分はParent Widgetのタイプを今回の親WidgetであるW talk with Staff Widgetにした所だけです。
全部のNPCの会話Widgetの原型が判明したらNPC_ParentにVertical BoxとかCustom Eventとかを組み込んで、一気にPolymorphism化して回答ボタンも一種類で対応出来るように作れそうですが、そういうのはこのゲームが完成した後で考えます。
今回はこれでやって行きます。
テストします。
回答ボタン「この駅について」を押します。
望んでいたセリフが返って来ました。
会話の内容はまだ直さないといけませんが、会話の機能は実装出来ました。
6. 切符を使用して銀河鉄道に乗る機能の実装
今までは切符を使用しなくても銀河鉄道に乗れました。切符を使用しないと銀河鉄道に乗れないようにします。
現状はこんな感じです。
「銀河鉄道に乗ります。」ボタンを押すと以下のコードが実行されます。
はい。これに切符をチェックする機能を追加します。
最初にUIから直していきます。
現在所持している切符の枚数が分からないと銀河鉄道に乗るかどうか決心出来ません。切符を表示するVertical Boxを追加します。
こんな感じに変更しました。
普通の切符の枚数は以下の方法で数えられるはずです。
テストしてみます。
普通の切符を持っていない状態で話して見ました。
0枚と表示されています。
今度は普通の切符を2枚買ってみました。
2枚と表示されています。
いますが他の部分がオカシイです。
セリフに「銀河鉄道に乗るには普通の切符が一枚必要です。」が抜けています。更に「普通の切符: 2枚」の位置がずれています。
直します。
まずはセリフからです。
セリフはNPC_Parentで管理されていました。
うーん。この辺もData Tableで管理するのか統一しないと訳わからなくなりそうです。
直しました。
テストします。
直りました。
今度は「普通の切符: 2枚」の位置を直します。
普通の切符の枚数を表示するテキストを含むBorderのAlignmentを以下の様に変更します。
テストします。
はい。直りました。
今度は、銀河鉄道に乗った時に切符の枚数を減らす機能を実装します。
はい。出来ました。
試してみます。
道具袋から普通の切符が全部、消えていました。
Remove 関数は同じ名前の要素を全部消してしまうみたいですね。
面倒ですが以下のように実装を変更しました。
テストします。
以下の様なItemが道具袋に入っています。
切符の数は4枚です。
移動した後です。
普通の切符が一枚減っています。残りのItemの数は変わっていません。
出来ていますね。
7. 切符の交換機能の実装
駅では、切符の切れ端を10枚集めるとふつうの切符と交換してくれます。
その機能を実装します。
切符の交換用のWidgetを作成します。
W_WarpGate widgetを参考にします。
以下のようになりました。
名前はW_ExchangeTicketとしました。
取りあえずゲーム画面で表示してみます。
こんな感じです。
やっぱり交換するボタンは下にあった方が良いですね。
これの方が見やすいですね。
それでは交換するボタンを押した時の実装をします。
まず本当に切符の切れ端が10枚あるか確認します。
無ければボタンを押しても何も起きません。
在る場合は、以下の方法で切符の切れ端を10枚、道具袋から消します。
このやり方は最適ではない気がしますが、結果が間違っている訳ではないので今回はこれで行きます。
その後で、切符の切れ端の数から10を引き、
道具袋に普通の切符を追加して
画面に表示している普通の切符の数にも1を足します。
これで完成です。
Textの表示、切符の枚数の表示、そして戻るボタンの表示の実装方法は、今までにやったやり方と全く同じなので記録はスキップしました。
テストします。
切符の切れ端、10枚持っている状態で交換所に行きます。
「交換する」を押します。
普通の切符が1枚、切符の切れ端が0枚になりました。
道具袋を開いて確認しても普通の切符が一枚になっています。
他にも色々テストしてみましたが問題なかったです。
これで完成です。
8. 切符を道具として使用した場合の検討
はい。これはもう決めました。切符は道具としては使用出来ないようにします。
クリックしても何も起きません。
これが一番簡単です。これで行きます。
9. 別なマップに移動してる間に別なアニメーションを表示する方法についての調査
まずはAnimationではなくて単なるLoad 画面を追加する方法から調べます。
Unreal Engineの公式のビデオであるAsync Loading Screens and Transition Levels | Unreal Fest Europe 2019 | Unreal Engine [7]でLoad画面の作成に関しての詳しい説明がされています。パッと見た感じですが、UE4C++から作成しないといけないみたいですね。
もう少しTutorialを探したらUnreal Engine 4 - Easy Loading Screen Tutorial - Blueprints Only [8]ではBPのみで実装する方法が紹介されていました。
どちらも2019年に制作された動画なので、もっと最近の動画なら更に簡単にLoad画面の実装が出来そうと思い更に調べたらHow To Make A Loading Screen In 5 Minutes Unreal Engine 4 Tutorial [9]には無料のplug-inを使用して5分でload screenを示す方法が紹介されています。
更にこの動画には動画をLoad画面に挟む方法も説明されているみたいです。
今回はこの三つの動画を勉強する事にします。
9.1 Async Loading Screens and Transition Levels | Unreal Fest Europe 2019 | Unreal Engine [7] を勉強する。
Axel Riffard氏によるUnreal Fest Europe 2019の講演の記録のようです。フランス人で日本で働いているそうです。
え。
日本で働いているの?
ひょっとすると何処かで会ってたりしてるんでしょうか?
この講演はProgrammerの観点からUE4のAsync Loading Screens and Transition Levelsについての解説のようですね。
以下の内容について講演するそうです。
Moduleの作り方ですか。
Sherif, William氏のUnreal Engine 4 Scripting with C++ Cookbook [10] でたしかmoduleの作成方法について勉強したはずと思って見返してみたら、8章にCreating a new editor moduleがありました。
ただもう内容については覚えていません。
というかこの本で勉強した時は、本当に暗中模索な状態でどこまで理解したら良いのか、もしくは何処を勉強すべきなのかが全く分かっていませんでした。
今、もう一回勉強したら完全に自分の血肉に出来るんでしょうが、今はあんまりUE4C++を使用するメリットを感じていません。
Unreal Engine 4 Scripting with C++ Cookbook [10]のCreating a new editor module部分だけ読み返してみます。
今、読み返して分かったんですけど
の部分で理論を解説していたんですね。うん。この教科書で勉強した時はこの部分の価値を全く理解していなくて読み飛ばしていました。
この講演を聞くための予習としては十分でしょう。
次に行きます。
Threadについてですね。
うん。AsyncなんだからThreadを使用するのは当然なのか。と思ったんですが、私、CSの専門が 3 D Graphicsで大学の授業以外で全くThreadに触った事がないんです。
「Web の画面の読み込みにAsyncを使用して…」みたいなWeb系なら基本的な内容でも良く知らないんです。勿論、やった事もありません。
のでThread自体あんまり理解してません。
「Thread safeなのを使用すればいいんじゃないの。」位しか知らないです。
Threadについての予習はなしです。理解出来る範囲で聞きます。
Seamless Travelについて。
これについては何を言っているのか分かりません。
取りあえず動画を見てから考えます。
Solo player とMulti playersでAsync Loading Screensの作成方法は違うみたいですね。
私にはSolo playerで十分ですのでそこだけ重点的に見る事にします。
最初のスライドはThreadについての基本的な説明ですね。これぐらいなら私でも知っている内容ですね。
はい。次のスライドからちょっと本格的になって来ました。UE4でAsynchronousなTaskをする場合は
を使用するらしいです。
公式のDocumentのAsyncTask [11] には
と書かれていました。
使い方の簡単な説明はないのかなと思って探したらUnreal WikiにAsyncTask () 関数 [11] についての使用方法の簡単な解説がありました。
Unreal Wikiの見た目が全く変わっててびっくりしました。
後、Unreal WikiってCatalyst Softworks社が運営しているんですね。ずっとEpic Games社が運営していると思っていました。
この後、色々なサイトやYouTubeのTutorialを見た結論なんですが、UE4ではasync は兎も角、Multi ThreadはBPでは使用出来ないようにしているみたいなんですね。
それはUE4側では、Multi Threadは完全に理解していない人が使用するとゲームがマジでぶっ壊れるって認識を持っているからみたいなんです。
後、「async は兎も角、Multi Threadは…」みたいな言い方をしているサイトが複数あったんですがそれの意味も分からないです。AsyncってThreadを複数使用しているからMulti Threadの一種でしょう。
やっぱりC++のThreadを先にしっかり勉強する必要がありますね。
UE4でThreadを実装するのはそれからにします。
今回はAsyncTask ()関数はさわりをみるだけにします。
ずっと前にDownloadしたAction RPGを見るとLoading Screenの理想的な実装が書かれているとありました。
以下に示した様な分かり易いPower Pointで解説されていました。
更に以下の図でもう少し詳しい手順が解説されています。
ここで重要な点はGame Moduleから直接EngineにCallしない事だそうです。
Game ModuleからはLoading ModuleしかCallしません。残りはLoading Moduleが全て仕切ります。
私なりの理解を書くと、こうする事でDesignerはBPからLoading Moduleを呼ぶだけが仕事になり、残りのすべての作業はThread を理解したProgrammerがLoading Module内の実装を行う事になり、Multi Threadによる事故が起きにくくなる訳です。
うん。納得しました。
もう少し細かく勉強します。
Game ModuleのBlueprint Useです。
これはBP内でLoading ModuleのILoadingScreenModuleを呼び出すNodeを使用していると考えられます。
正しこのNodeはUE4C++側で実装されているため、上記のPower Pointでは間に
が書かれています。これだけがBP側で行う事です。
BPから呼び出された
はInterfaceなので実際はそのInterfaceから派生したクラスを呼び出すはずです。それが
なのでしょう。
このクラスの実装に必要なクラス(もしくは関数)である
が呼ばれます。
今度はこのSLoadingScreenを実装するのに必要なクラス(もしくは関数)である
が呼ばれます。
FLoadingScreenBrushからはEngine の
が呼ばれ、
SLoadingScreenからは
が呼ばれ、そして
FLoadingScreenModuleからは
が呼ばれます。
Engineから呼ばれた3つのクラス、FSlateDynamicImageBrush、SCompoundWidget、そしてIModuleInterfaceについて少しだけ調べます。
そしたらこのサイト[12]に日本語に翻訳されたスライドがありました。
うーん。
ぱらっと見た感じでは全く同じみたいですね。
もうYouTubeの動画で勉強を始めちゃったのでYouTubeの動画で勉強を進めます。
FSlateDynamicImageBrushについては、公式DocumentのFSlateDynamicImageBrush [13] しか見つかりませんね。
SCompoundWidgetは何回が使用した記憶があります。
Sherif, William氏の Unreal Engine 4 Scripting with C++ Cookbook [10]では9章のCreate a custom SWidget/ UWidgetで使用方法が解説されています。
今、作成しているRPGでもたしか使用したはず。
と思って確認したら使用していたのはUUserWidgetでした。
ちょっと違いました。
IModuleInterfaceはUnreal Engine 4 Scripting with C++ Cookbook [10]でEditor Moduleの作成の時に使用しています。
FLoadingScreenModuleの親クラスとして使用するのでしょうか?
今度は使用方法についての説明です。
Blueprint側だそうです。
BPからやるのかこれだけだそうですが、ちょっと分からない部分がありますね。
まずFade in and Show Loading Screenを呼び出し、Fade in and Show Loading ScreenからPlay Loading Screenを呼び出しています。いきなりPlay Loading Screenを呼び出しちゃいけないんでしょうか?
それともFade in and Show Loading Screenを呼び出す所が前のSlideの
に当たり、Play Loading Screenを呼び出す所が
を表しているんでしょうか?
(ここは解説で、Play Loading ScreenはBP callable functionでUE4C++側で作成すると言っているので予測の通りでした。)
後、Load Game Level ノードと言う多分始めて見るノードを使用しています。
よくよく考えたら以下に示したノードの左端のマークの意味が分かりません。
これの意味が分かったらもう少し正しい推測が出来るんですが…
後、このBPの実装は全てGame Instance BP内に書かれています。Levelの移動をするんだから当たり前ですが、何か不思議です。
Open LevelのLevel NameにはAbsolute Pathを必ず使用するようにと説明されていました。そうしないと指定されたLevelを全てのLevelから探して時間が余計にかかるそうです。これは勉強になりました。
ここからProgrammer専門の話になるそうです。
最初のSlideはModuleについてです。
Loading Screenとは直接関係ないのでスキップします。
次のSlideはAction RPGのFolderです。
これってMarket PlaceからDownload出来る無料のAction RPGと同じなんでしょうか?
確認します。
同じみたいです。
次のSlideです。
今度はModuleのLoadの順番についての解説です。
Loading ModuleはGame Moduleより先にInitializeしないといけません。その方法について解説してます。
.uprojectのLoadingPhaseで指定します。
次はInterfaceについてです。
このSlideで紹介されているInterfaceも先程のAction RPGのActionRPGLoadingScreen内にあるものと全く同じでした。
成程、IModuleInterfaceを継承していますね。
Interfaceなので当然Virtualです。
このGet関数はVirtualじゃないですね。Interfaceでもこんな書き方もあるんですね。
一見単純なGet()関数に見えますが、Staticで返したり、Inlineを使用している所など、ちょっと私の今のC++の知識では100%の理解は出来ないですね。
Inlineは高速化のためなんでしょうか?
たった一行の関数ですが、結構考えさせられます。
当分、UE4C++の勉強はやるつもりはないので今回はコードの内容については深入りはしません。
次のSlideはInterfaceの実装についてです。
いや、Interfaceは実装は出来ないでしょう。Interfaceから派生したクラスの実装は出来ますが。と思ってActionRPGLoadingScreen.cppを見たら納得しました。
FActionRPGLoadingScreenModuleクラスが先程作成したInterfaceであるIActionRPLoadingScreenModuleを継承しています。このクラスの宣言と実装をActionRPGLoadingScreen.cppで一辺に行っていました。
ここで時間が尽きてしまいました。
今週はここまでです。
9.2 Unreal Engine 4 - Easy Loading Screen Tutorial - Blueprints Only [8] を勉強する。
来週やります。
9.3 How To Make A Loading Screen In 5 Minutes Unreal Engine 4 Tutorial [9] を勉強する。
これも来週やります。
10. Good Skyの復習
これもやるやる言ってずっとやっていません。来週こそやりたいです。
11. まとめと感想
今週は色々なTutorialの勉強に時間を取られ過ぎました。勉強するのは楽しいですが、RPGを完成させるのが目的なので本質を見失わないようにしないとどんどん脇道に逸れてしまいます。
その辺の見定めが必要ですね。
来週からはもっとゲームを完成させる事に労力を注ぎます。
12. 参照(Reference)
[1] CGHOW. (2020, July 21). Nebula Effect | UE4 Niagara Nebula | Download Project Files [Video]. YouTube. https://www.youtube.com/watch?v=niSWXhWNyQQ&list=PLwMiBtF6WzsqC7_cJmD26ts0YDbtPCCfe&index=9
[2] gameDev Outpost. (2021, April 4). UE4 - Niagara Adjusting Size [Video]. YouTube. https://www.youtube.com/watch?v=erIc7rcsmps
[3] Unsplash. (n.d.). 100+ Nebula Pictures [HQ] | Download Free Images on. Retrieved August 15, 2021, from https://unsplash.com/s/photos/nebula
[4] Edwards, J. [GDC]. (2018, February 25). Sand Rendering in Journey [Video]. YouTube. https://www.youtube.com/watch?v=wt2yYnBRD3U
[5] dotplusplusplus. (2021, April 21). Making Dynamic Desert Sand in Unreal Engine 4 [Video]. YouTube. https://www.youtube.com/watch?v=o-MXAmfCY5U
[6] Epic Games [Unreal Engine]. (2014, July 8). Intro to Cascade: Creating a GPU Sprite Emitter | 05 | v4.2 Tutorial Series | Unreal Engine [Video]. YouTube. https://www.youtube.com/watch?v=DcesEW380lc&t=310s
[7] 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
[8] Reids Channel. (2019, December 15). Unreal Engine 4 - Easy Loading Screen Tutorial - Blueprints Only [Video]. YouTube. https://www.youtube.com/watch?v=lzGcVDUDU5g
[9] Uisco. (2021, March 3). How To Make A Loading Screen In 5 Minutes Unreal Engine 4 Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=KpXmcqSITOg
[10] Sherif, William. Unreal Engine 4 Scripting with C++ Cookbook (Kindle Location 4359). Packt Publishing. Kindle Edition.
[11] Catalyst Softworks. (n.d.). AsyncTask Function | Unreal Engine Community Wiki. The Unreal Engine Community Wiki. Retrieved August 15, 2021, from https://unrealcommunity.wiki/asynctask-function-mfdnmfca
[12] エピック・ゲームズ・ジャパン Epic Games Japan. (n.d.). 非同期ロード画面 Asynchronous Loading Screen. 非同期ロード画面 Asynchronous Loading Screen. Retrieved August 13, 2021, from https://www.slideshare.net/EpicGamesJapan/ss-135771323