UE4の勉強記録

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

「Unreal Engine 4.xを使用してRPGを作成する」の足りない部分を作成する Ticket Systemなどの作成 Part 2

f:id:kazuhironagai77:20210815231212p:plain

<前文>

<徹底的に追いつめられると、何故か土下座して許してもらおうとする日本人>

先週、突然気が付いたんですが、日本人が誤解しているアメリカ、特に日本文化とキリスト教文化の違いから生じる勘違いについて専門的に語っている人がいないんです。山本七平氏の「空気の研究」や井沢元彦氏の「逆説の日本史」のような第三者的な観点から日本文化の独自性について語っている人はいますが、その結果、日本にとって最も重要な国であるアメリカとの関係にどんな影響が生じるのか論じている人はいません。

これ、滅茶苦茶大切な事です。

それで在米歴10年の私が、それについて重点的に語る事にしました。

今週は、日本人と土下座に関してです。

日本人全体に言える事ですが、徹底的に追いつめられると、何故か土下座して謝って許してもらおうとします。

これってアメリカでは全く通じませんから。

戦後、キリスト教文化のrepentanceが歪んだ形で紹介されて、キリスト教では真剣に謝れば許してくれる的な解釈で日本文化に受け入れられたんだと思いますが、repentanceが通じるのはあくまで真摯に反省してそれまでの悪い行いを直す約束をした場合のみですから。

大体、キリスト教的な考えからしたら、悪い事をしていないのに、罪の告白をしたらそれ自体が大変な罪です。後、repentanceは神様に対してするモノで人間に対してするモノではありません。

長年の間、何で日本人は徹底的に追いつめられると、土下座して謝って許してもらおうとするのか、私には不思議でした。

知り合いの人から聞いた話ですが、その人の友人は元ラグビー部で身長が185cmもあったのに、ヤクザに殺された時に包丁で刺されまくっているのに、土下座して謝っていたそうです。

更に重要な問題ですが、土下座された方だって、ヤクザとかじゃなく常識的な人だったら困ってしまうでしょう。だって土下座されても何も問題は解決しないんですから。

そこで、気が付いたんですが、土下座って日本文化なんですよ。

先程の例でもヤクザと土下座なんて、もろに日本文化じゃないですか。

じゃあ、アメリカを含むキリスト教文化の国(もしくは会社でも、個人でも)との関係で徹底的に追いつめられたとき、土下座して謝って許して貰おうとするより良い方法があるんかよ?となりますが、あります。

それは徹底的に自分の無実を主張する事です。

日本人から見ると、不思議なアメリカを含むキリスト教文化の特徴の一つですが、正式な裁判を受ける権利を奪うのは大変な罪なんです。

アメリカ人は謝らないと言うのは嘘です。アメリカ人も日常生活では結構、頻繁に謝ります。

ただし絶体絶命な状態に追い込まれた時、つまり日本人が土下座するような状況になった時は、絶対に謝りません。それは謝ったら無罪を裁判で主張出来ないからです。

ほとんどの日本人にとってアメリカを含むキリスト教圏の関係者から徹底的に追いつめられる事は、現状ではないと思います。しかしもしそういう事態になって、もう土下座してでも良いから許してもらおうと思ったら、そこは踏みとどまって、無罪を主張する方法に変換して下さい。少なくとも土下座するよりはマシな結果になりますから。

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

<本文>

 1.今週の予定

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

  • Particle Systemの勉強
    • Niagaraの勉強
    • Cascadeの勉強
      • 砂のEffectの作成
      • Boundについての復習
    • RPGの作成の続き
      • 駅の実装のテスト(バグ出し)
      • 切符を使用して銀河鉄道に乗る機能の実装
      • 切符を道具として使用した場合の検討
      • 別なマップに移動してる間に別なアニメーションを表示する方法についての調査
    • Good Skyの復習

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です。

f:id:kazuhironagai77:20210815231400p:plain

Emitter UpdateにSpawn Rate Moduleを追加しました。

f:id:kazuhironagai77:20210815231414p:plain

Spawn Rateに1000をセットします。

f:id:kazuhironagai77:20210815231428p:plain

Sprite が生成されました。

f:id:kazuhironagai77:20210815231442p:plain

Particle Spawn CategoryにSphere Location Moduleを追加しました。

f:id:kazuhironagai77:20210815231507p:plain

以下の様になりました。

f:id:kazuhironagai77:20210815231522p:plain

正し、Tutorialは以下の様になっています。

f:id:kazuhironagai77:20210815231536p:plain

うーん。

Sphere Radiusの半径を100から1000に変更してみます。

f:id:kazuhironagai77:20210815231552p:plain

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

f:id:kazuhironagai77:20210815231605p:plain

これでいきます。

そしたら、TutorialではこのSphere Location Moduleを外して、代わりにStatic Mesh Location Moduleを追加しました。

f:id:kazuhironagai77:20210815231620p:plain

このTutorialによればStatic Mesh Location Moduleの機能は、Sphere Location Moduleと同じだが、Sphereの代わりに指定したMesh内にSpriteを発生させるそうです。

そして使用するMeshを指定するためにSample Static Mesh Moduleの使用が要求されます。

Sample Static Mesh Module内で使用するMeshを指定します。

f:id:kazuhironagai77:20210815231634p:plain

Tutorialと同じMeshをセットしました。

Preview MeshとDefault Meshがどう違うのかは良く分かりませんね。調べようかと思ったら、それを調べるよりもっと大きな問題が起きてました。

f:id:kazuhironagai77:20210815231653p:plain

Sphere Location Moduleを使用した時と同じように、Cube全体が光っています。

Tutorialでは以下のような感じなのに。

f:id:kazuhironagai77:20210815231707p:plain

Sphere Location Moduleを使用した時と同じようにMeshのサイズを大きくしようとしたら、

f:id:kazuhironagai77:20210815231719p:plain

そんな機能はついていません。

ではSpriteのサイズを小さくします。

f:id:kazuhironagai77:20210815231735p:plain

あれ、SpriteのサイズってRendererで指定していませんでしたっけ。

どのModuleでSpriteのサイズを指定出来たのか忘れてしまいました。

Googleで検索したらgameDev Outpost 氏のUE4 - Niagara Adjusting Size [2] で説明されていました。

Initial Particle ModuleのSprite Attributesで指定できます。

f:id:kazuhironagai77:20210815231756p:plain

Uniform Sprite Sizeを10から3に変更しました。

f:id:kazuhironagai77:20210815231810p:plain

今まで、Initial Particle Moduleは何回も使用していたにも関わらずすっかり名前を忘れてしまってました。

結果を以下に示します。

f:id:kazuhironagai77:20210815231836p:plain

大体、Tutorialと同じイメージになりました。

今度はParticle Update にCurl Noise Force Moduleを追加します。

f:id:kazuhironagai77:20210815231853p:plain

Default値がTutorialの値と違います。

f:id:kazuhironagai77:20210815231907p:plain

Previewのイメージはイイ感じです。Spriteのばらつき具合が良いです。

f:id:kazuhironagai77:20210815231925p:plain

値をTutorialと同じにしてみます。

f:id:kazuhironagai77:20210815231941p:plain

バラツキがなくなり一気に下に落ちて行っています。

f:id:kazuhironagai77:20210815231957p:plain

Tutorialのイメージとは全然違います。Tutorialのイメージを以下に示します。

f:id:kazuhironagai77:20210815232014p:plain

Curl Noise Force Module の値を色々いじって見ました。

以下の値の時に綺麗な挙動をします。

f:id:kazuhironagai77:20210815232031p:plain

こんな感じです。

f:id:kazuhironagai77:20210815232152g:plain

取りあえずこれでいきます。

今度は、Particle Update にDrag Moduleを追加します。

f:id:kazuhironagai77:20210815232219p:plain

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

f:id:kazuhironagai77:20210815232240g:plain

Initialize Particle ModuleでSpriteのサイズを1にしました。

f:id:kazuhironagai77:20210815232500p:plain

のわあー。

結局、TutorialでもSpriteのサイズを変えてるじゃないか。

今度は、Emitter Properties ModuleのSim TargetからGPUを使用するように変更しました。

f:id:kazuhironagai77:20210815232520p:plain

Tutorialではこの変更後何も起きていませんが、私の方では、以下の様な警告が出ています。

f:id:kazuhironagai77:20210815232540p:plain

Bound ボタンを押して以下の様なBoundを作成しておきました。

f:id:kazuhironagai77:20210815232555p:plain

勿論、警告は消えました。

勿論、GPUに変更した後はSpawn Rateを増やします。10000にセットしました。

f:id:kazuhironagai77:20210815232612p:plain

こんな感じです。

f:id:kazuhironagai77:20210815232636g:plain

Vortex Force Moduleを追加します。

f:id:kazuhironagai77:20210815232720p:plain

ここまで来て大問題です。

Tutorialでは、以下のStatic Mesh をMayaで作成して使用しています。

f:id:kazuhironagai77:20210815232736p:plain

これの作り方は分かりませんね。

ここは無視して先に進みます。

次はTextureに星雲のイメージを使用する方法を勉強します。

星雲のイメージ自体がないのでUnsplash [3] から以下のイメージをDownloadしました。

f:id:kazuhironagai77:20210815232752p:plain

Materialを作成します。

f:id:kazuhironagai77:20210815232807p:plain

Sprite RendererのMaterialにセットします。

f:id:kazuhironagai77:20210815232821p:plain

以下の様なイメージになりました。

f:id:kazuhironagai77:20210815232835p:plain

拡大すると分かりますが一つのParticle にTextureのImage全体が貼り付けられています。

f:id:kazuhironagai77:20210815232852p:plain

Particle全体にこのTextureを貼りたいのです。そのために、

Materialの実装を以下の様に変更して、

f:id:kazuhironagai77:20210815232910p:plain

Particle Spawn のSample Static Mesh ModuleとStatic Mesh Location Moduleを消去します。

f:id:kazuhironagai77:20210815232932p:plain

そしてScratch Moduleを追加します。

f:id:kazuhironagai77:20210815232950p:plain

Scratch Moduleの中身を以下の様に作成しました。

f:id:kazuhironagai77:20210815233005p:plain

おお。初めてModuleの中身を作成しました。内容については後で検討します。

Scratch ModuleのMeshをセットして

f:id:kazuhironagai77:20210815233019p:plain

Reviewを見ると、まだ一個のParticle に対してTexture全体を使用しています。

f:id:kazuhironagai77:20210815233051p:plain

これを直すために、Scratch Moduleの実装を以下の様に変更しました。

f:id:kazuhironagai77:20210815233107p:plain

これも内容については後で検討します。

全部のParticle に対してTexture全体を使用するようになりました。

f:id:kazuhironagai77:20210815233127p:plain

出来た。と思ったら以下に示したTutorialのEffectと同じにするにはまだ色々追加する必要があるそうです。

f:id:kazuhironagai77:20210815233146p:plain

元々、使用しているNebulaのTextureが違うし、Meshの形状も違うので全く同じになる訳がないので、ここからは話を聞く位の軽い感じでTutorialをやっていきます。

まず作成したEffectが3つありました。

f:id:kazuhironagai77:20210815233205p:plain

一番左のEffectが今、私が作成したものと同じヤツだそうですが、以下の点が改良されているそうです。

  • Particleの数を増やしている。
  • Curl Noise Forceが追加されています。
  • Scale Sprite Sizeで以下の様な値をセットしている

f:id:kazuhironagai77:20210815233236p:plain

2番目のEffectは最初のEffectをDuplicateして作成しました。

f:id:kazuhironagai77:20210815233254p:plain

そして以下の点を変更しました。

  • Spawn Rateの数を減少します。
  • 使用しているMaterialを以下の物に変更します

f:id:kazuhironagai77:20210815233322p:plain

  • そのためParticle SpawnInitialize Particle ModuleColorの値を1以上にセットする事が出来ます。

f:id:kazuhironagai77:20210815233351p:plain

最後のEmitterもDuplicateして作成します。

f:id:kazuhironagai77:20210815233406p:plain

そして以下の点を変更しています。

  • Sprite RendererAlignmentVelocity Alignedにセット。

f:id:kazuhironagai77:20210815233445p:plain

  • Initialize Particle ModuleのSprite Sizeの値を以下の様に変更

f:id:kazuhironagai77:20210815233515p:plain

だそうです。

最後にこの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の中身の実装について
    • 最初のサラの状態で存在するノードの機能や役割を調べる。

f:id:kazuhironagai77:20210815233628p:plain

    • 左脇に表示されているToolについて調べる

f:id:kazuhironagai77:20210815233808p:plain

  • このTutorialで追加したNodeとその役割について調べる。

f:id:kazuhironagai77:20210815233846p:plain

  • 作成した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についての講演でした。

f:id:kazuhironagai77:20210815234009p:plain

このゲームはPhyreEngineを使用して作成されたそうです。

PhyreEngineは初めて聞くGame Engineです。

ちょっと調べて見ます。

ぱっと見た所、9年前位で開発が止まっていますね。このゲームも2012年に制作されたようです。

まあでも、役に立つ話はあるでしょう。取りあえず聞いて行きます。

<砂のRenderingについて>

MIT Map Sharpening Effectについてです。遠くの景色をSmoothにする効果があるそうです。

これが元のイメージです。

f:id:kazuhironagai77:20210815234031p:plain

こっちがMIT Map Sharpening Effectを使用した場合です。

f:id:kazuhironagai77:20210815234045p:plain

遠くの景色がどこからなのかが分からないですが、砂が柔らかくなっている印象を受けます。特に人が立っている辺りの左右の砂が砂らしいです。

ただし太陽からの光を反射している箇所は、両方ともまるでビニール樹脂のようです。

Anisotropic maskingのEffectについてです。

f:id:kazuhironagai77:20210815234259p:plain

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です。

f:id:kazuhironagai77:20210815234402p:plain

John Edwards氏の説明にあるようにAnisotropic maskingよりギラギラ感が消えています。

Glitter Specularという技術が何を指しているのか不明ですが、砂のキラキラ感を表現する技術なんでしょうか?

Anisotropic filteringを使用する事で砂のキラキラ感がオカシクなってしまったので、別な方法で砂のキラキラ感を計算したんでしょうか。それがここで言うGlitter Specularの事なのかもしれませんね。

Ocean Specularです。

f:id:kazuhironagai77:20210815234436p:plain

何と、太陽の光を反射している箇所のビニール感がなくなりました。

Ocean Specularに関してはJohn Edwards氏は反射を消したとだけ説明しています。

f:id:kazuhironagai77:20210815234452p:plain

単なるLambert Shadingを使用した場合と、カスタム化したDiffuse Shadingを使用した場合だそうです。

この時にスライドで表示された画面がどっちを表しているのかは不明です。

Lambert ShadingってPBRの前に使用されていたDiffuse Lightingを計算する方法でしたっけ。それともPBRの中で使用されているDiffuse Lightingを計算する方法でしたっけ。

覚えていません。

Detail heightmapsです。

f:id:kazuhironagai77:20210815234507p:plain

Displacement Mapを使用し、Landscapeをスムーズにしたそうです。

Displacement MapはLandscapeを本物っぽくするのに非常に重要です。はい。

<砂のRenderingについての各論>

ここからは各論的にそれぞれのイメージについて細かく解説しています。

MIPSについてです。

f:id:kazuhironagai77:20210815234528p:plain

f:id:kazuhironagai77:20210815234535p:plain

正直、同じに見えます。

100 pxを1mとすると

f:id:kazuhironagai77:20210815234549p:plain

1pxの中に400個の砂粒が入っている計算になるそうです。

このリアルさを出すためにノイズを使用しているそうです。

f:id:kazuhironagai77:20210815234604p:plain

このノイズは砂のNormal mapのばらつき具合のランダムさを表現しています。

今度は砂のキラキラについてです。

f:id:kazuhironagai77:20210815234619p:plain

f:id:kazuhironagai77:20210815234625p:plain

f:id:kazuhironagai77:20210815234632p:plain

Glitterが在る場合とない場合ですね。ある場合の方が砂らしさが出ています。

このキラキラですが、太陽とカメラと砂のアングルでたまたま光る状態の砂が光っています。つまりカメラが移動すると光る砂は変わります。

そのために以下の式(N・Vの方)を使用したそうです。

f:id:kazuhironagai77:20210815234702p:plain

しかしその状態でAnisotropic maskingを使用すると以下の様にギラギラした箇所が誕生してしまいます。

f:id:kazuhironagai77:20210815234717p:plain

Anisotropic maskingを使用するとオカシクなる部分を区別出来るようにしました。

f:id:kazuhironagai77:20210815234734p:plain

黒い部分がそれに当たります。この部分にはAnisotropic maskingを使用しない事にする事でギラギラした箇所が発生しないようにしました。

すると砂のキラキラ感がなくなってしまいました。予想以上にカメラに映った背景には黒い部分が占めていたからです。

その対策としてSpecular lightを追加する事にしました。

f:id:kazuhironagai77:20210815234751p:plain

はい。ビニール感が出て来ました。

この変な反射光が生まれる理由は、砂の持つ流動性を考えていないからじゃないのかと、流体に対する反射を作ったそうです。

そうすると以下の様になったそうです。

f:id:kazuhironagai77:20210815234814p:plain

これでも、まだビニール感がありますね。

次はLambert Diffuseを改良した話です。

f:id:kazuhironagai77:20210815234828p:plain

f:id:kazuhironagai77:20210815234834p:plain

Lambert の計算では、Diffuse lightingが正確でないため、あらゆるものが本物らしくなくなってしまったそうです。

f:id:kazuhironagai77:20210815234853p:plain

ここでOren-Nayar Modelの計算方法を採用しようとしたら計算コストが高すぎてゲームが動かなくなってしまったそうです。

そこで解決策として以下の式に適当な数値をぶちこんで本物っぽく見える値を採用したそうです。

f:id:kazuhironagai77:20210815234910p:plain

最後にheight mapについてです。

f:id:kazuhironagai77:20210815234924p:plain

ここでHeight mapに使用されるTextureはUE4のLandscapeに使用されるTextureと同じでしょう。

特に注目すべき内容はなかったです。

以上でした。

<感想>

これは砂のVFXというより砂のLandscapeのRenderingについてでした。そういう意味では途中で止めても良かったんですが、

  1. 砂がキラキラしてるのが砂感を出している。
  2. しかし砂粒は小さすぎて計算出来ないのでNormal Mapでキラキラ感を出す方法を編み出した。
  3. しかしそれをそのまま使用した場合、Anisotropic maskingによって砂がギラギラに光って滅茶苦茶になってしまった。
  4. Anisotropic maskingを使用するとオカシクなる部分を抜き出し、その部分にはAnisotropic maskingを使用しないようにした。
  5. そうするとキラキラ感が全くない部分が多すぎるようになってしまったので、Specular lightingを追加した。
  6. Specular lightingをそのまま使用すると、ビニールみたいな光沢になるので流体に対する反射を考慮してSpecular lightingを計算し直した。

の流れがとても面白かったのでそのまま勉強しました。

この部分自体はUE4の砂のVFXを作成するのには役には立ちませんが、砂らしさは砂のキラキラから来ていると気が付いてからのそれを実装するまでの大変さは、これから自分でUE4VFXを作成する時の参考に絶対なると思いました。

先週のBlogで以下の様に述べましたが、

f:id:kazuhironagai77:20210815234952p:plain

砂のキラキラ感も正にここでいう脇役です。

脇役を一人追加するのがこんな大変だったとは驚きです。それを学べただけでもこれを勉強した甲斐はありました。

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が以下に表示されています。

f:id:kazuhironagai77:20210815235025p:plain

これがカメラを少しずらすと

f:id:kazuhironagai77:20210815235039p:plain

何と、Effectが消えてしまいます。

これはGPUはCameraのView Frustumから外れるとRenderingしなくなるように設定されているからだそうです。

しかしCameraのView Frustumから外れてもGPUで生成したSpriteの端はまだCameraに写っているので、GPUにはRenderingを続けて欲しいです。

Bounds のSet Fixed Bounds を選択するとfixed bounds boxを生成します。

f:id:kazuhironagai77:20210815235055p:plain

Boundsが選択された状態だと、生成したfixed bounds boxを可視化する事が出来ます。

f:id:kazuhironagai77:20210815235110p:plain

新しいfixed bounds boxを生成したらReStart Levelをクリックして下さい。

f:id:kazuhironagai77:20210815235127p:plain

これで新しく生成されたfixed bounds boxがEffectに追加されます。

今度はGPUで生成されたEffectは消えません。

f:id:kazuhironagai77:20210815235141p:plain

新しく生成されたfixed bounds boxがCameraのView Frustum内に入っている限り、GPUはRenderingを続けます。

はい。

これが、fixed bounds boxの効果だったんです。

4. 駅の実装のテスト(バグ出し)

先週作成した駅のテストを行い、バグを洗い出します。

そのためにLandscape1にGalaxy Train Stationを配置して今まで配置していたWarp Gateを消します。

f:id:kazuhironagai77:20210815235212p:plain

テストします。

f:id:kazuhironagai77:20210815235228p:plain

駅の名前もあっていますし行き先もあっています。

銀河鉄道に乗ります。

f:id:kazuhironagai77:20210815235243p:plain

Map1につきました。

今度は、Map1から銀河鉄道に乗ります。

f:id:kazuhironagai77:20210815235300p:plain

Landscape1に着きました。

f:id:kazuhironagai77:20210815235317p:plain

今度は「止めます」ボタンを押します。

f:id:kazuhironagai77:20210815235342p:plain

駅員との会話が終わってしまいました。

f:id:kazuhironagai77:20210815235406p:plain

ここには戻るボタンが欲しいですね。

作成します。

f:id:kazuhironagai77:20210815235449p:plain

前画面に戻りますボタンに実装を追加します。

f:id:kazuhironagai77:20210815235503p:plain

テストします。

「前画面に戻ります」ボタンをクリックします。

f:id:kazuhironagai77:20210815235517p:plain

前画面に戻りました。

f:id:kazuhironagai77:20210815235532p:plain

色々試してみます。

当然ですが、「駅員と会話をする。」「切符の交換」の機能はまだ作成していません。

切符を買うために所持金を100から2000に変更します。

f:id:kazuhironagai77:20210815235547p:plain

ゲームを起動します。

f:id:kazuhironagai77:20210815235601p:plain

金貨2000の2000がはみ出しそうです。

f:id:kazuhironagai77:20210815235615p:plain

直します。

f:id:kazuhironagai77:20210815235630p:plain

Horizontal BoxをBorderでWrapしました。

BorderのBrushのImageに今まで使用していたイメージをセットしました。

f:id:kazuhironagai77:20210815235643p:plain

BorderのSize to Contentをチェックしました。

f:id:kazuhironagai77:20210815235659p:plain

これで後ろのImageからはみ出す事は無いはずです。

テストします。

f:id:kazuhironagai77:20210815235713p:plain

はみ出してはいませんね。

ただし以下の部分の設定の意味が今一分かっていません。

f:id:kazuhironagai77:20210815235731p:plain

この部分は表示するテキストの位置だけを指定しているのか、それともテキストにサイズにも影響を与えるのか、その辺が良く分からないです。

ものは試しなので今度は100000で試してみます。

f:id:kazuhironagai77:20210815235757p:plain

以下の様になりました。

f:id:kazuhironagai77:20210815235812p:plain

金貨の数字の部分がはみ出す事は無いですね。

最初の目的である切符を購入してみます。

f:id:kazuhironagai77:20210815235827p:plain

切符の値段が表示される箇所に、所持金が表示されています。直します。

f:id:kazuhironagai77:20210815235927p:plain

直しました。

今度は切符の値段が表示されています。

f:id:kazuhironagai77:20210815235942p:plain

切符を買ってみます。普通の切符、赤い切符、そして青い切符を買いました。

f:id:kazuhironagai77:20210816000016p:plain

駅から出て、道具袋を開くと普通の切符、赤い切符、そして青い切符を所持している事が分かります。

f:id:kazuhironagai77:20210816000040p:plain

道具袋の左側に表示されるPlayerの操作するキャラのStatusは分かりにくいですね。

日本語で表示するようにします。

後、この道具袋を開いた状態で、左側の切符をクリックすると切符を使用した事になります。

現状、切符には道具としての効果は何もないので切符が消えるだけです。道具としての切符の効果については後で考えます。

色々弄って見ましたが、大きなバグはこれ以外は見つかりませんでした。今回のバグ出しはここまでとします。

5. 駅員との会話の実装

会話用のWidgetのデザインは先週作成した、Start 画面における赤い帽子の魔女との会話用のWidgetと同じにします。

f:id:kazuhironagai77:20210816001006p:plain

駅員の帽子が大きすぎて完全に同じにはなりませんでしたが大体同じデザインになりました。

f:id:kazuhironagai77:20210816001030p:plain

G_Train Station Widgetから先程作成したWidgetを開けるようにします。

f:id:kazuhironagai77:20210816001046p:plain

しました。

f:id:kazuhironagai77:20210816001108p:plain

ついでに戻るボタンも実装します。

f:id:kazuhironagai77:20210816001143p:plain

f:id:kazuhironagai77:20210816001150p:plain

テストします。

「駅員と話しをする」ボタンを押します。

f:id:kazuhironagai77:20210816001206p:plain

先程作成したWidgetが開きました。

f:id:kazuhironagai77:20210816001225p:plain

戻るボタンを押しました。

f:id:kazuhironagai77:20210816001240p:plain

前の画面に戻りました。

それでは会話部分の作成を行います。

会話部分を作成します。

f:id:kazuhironagai77:20210816001258p:plain

NPCと同じ方法で作成しました。

このセリフ部分を表示するための機能を実装します。

NPCとの会話やスタート画面での魔女との会話の実装とほぼ同じやり方です。

f:id:kazuhironagai77:20210816001319p:plain

f:id:kazuhironagai77:20210816001327p:plain

f:id:kazuhironagai77:20210816001334p:plain

テストします。

f:id:kazuhironagai77:20210816001350p:plain

字が小さいですね。

もっと長い文章を表示してみます。

f:id:kazuhironagai77:20210816001412p:plain

文字は白抜きした方が良い気がしますね。後、BorderのPaddingも変更しました。

f:id:kazuhironagai77:20210816001427p:plain

f:id:kazuhironagai77:20210816001433p:plain

白抜きすると変に目立つので背景の紙と同じ色にしました。

結果です。

f:id:kazuhironagai77:20210816001449p:plain

まあ、いい感じです。

以下の様になりました。

f:id:kazuhironagai77:20210816001523p:plain

今度は回答用のボタンを作成していきます。

f:id:kazuhironagai77:20210816001538p:plain

先週、作成したAnswer Button Witch Widgetの丸コピーで作成します。

f:id:kazuhironagai77:20210816001554p:plain

変更した部分はParent Widgetのタイプを今回の親WidgetであるW talk with Staff Widgetにした所だけです。

f:id:kazuhironagai77:20210816001608p:plain

全部のNPCの会話Widgetの原型が判明したらNPC_ParentにVertical BoxとかCustom Eventとかを組み込んで、一気にPolymorphism化して回答ボタンも一種類で対応出来るように作れそうですが、そういうのはこのゲームが完成した後で考えます。

今回はこれでやって行きます。

テストします。

f:id:kazuhironagai77:20210816001625p:plain

回答ボタン「この駅について」を押します。

f:id:kazuhironagai77:20210816001640p:plain

望んでいたセリフが返って来ました。

会話の内容はまだ直さないといけませんが、会話の機能は実装出来ました。

6. 切符を使用して銀河鉄道に乗る機能の実装

今までは切符を使用しなくても銀河鉄道に乗れました。切符を使用しないと銀河鉄道に乗れないようにします。

現状はこんな感じです。

f:id:kazuhironagai77:20210816001716p:plain

銀河鉄道に乗ります。」ボタンを押すと以下のコードが実行されます。

f:id:kazuhironagai77:20210816001731p:plain

はい。これに切符をチェックする機能を追加します。

最初にUIから直していきます。

現在所持している切符の枚数が分からないと銀河鉄道に乗るかどうか決心出来ません。切符を表示するVertical Boxを追加します。

こんな感じに変更しました。

f:id:kazuhironagai77:20210816001746p:plain

普通の切符の枚数は以下の方法で数えられるはずです。

f:id:kazuhironagai77:20210816001801p:plain

テストしてみます。

普通の切符を持っていない状態で話して見ました。

f:id:kazuhironagai77:20210816001816p:plain

0枚と表示されています。

今度は普通の切符を2枚買ってみました。

f:id:kazuhironagai77:20210816001833p:plain

2枚と表示されています。

いますが他の部分がオカシイです。

セリフに「銀河鉄道に乗るには普通の切符が一枚必要です。」が抜けています。更に「普通の切符: 2枚」の位置がずれています。

直します。

まずはセリフからです。

セリフはNPC_Parentで管理されていました。

f:id:kazuhironagai77:20210816001848p:plain

うーん。この辺もData Tableで管理するのか統一しないと訳わからなくなりそうです。

直しました。

f:id:kazuhironagai77:20210816001902p:plain

テストします。

f:id:kazuhironagai77:20210816001916p:plain

直りました。

今度は「普通の切符: 2枚」の位置を直します。

普通の切符の枚数を表示するテキストを含むBorderのAlignmentを以下の様に変更します。

f:id:kazuhironagai77:20210816001930p:plain

テストします。

f:id:kazuhironagai77:20210816001946p:plain

はい。直りました。

今度は、銀河鉄道に乗った時に切符の枚数を減らす機能を実装します。

はい。出来ました。

f:id:kazuhironagai77:20210816002008p:plain

試してみます。

道具袋から普通の切符が全部、消えていました。

f:id:kazuhironagai77:20210816002037p:plain

Remove 関数は同じ名前の要素を全部消してしまうみたいですね。

面倒ですが以下のように実装を変更しました。

f:id:kazuhironagai77:20210816002053p:plain

テストします。

以下の様なItemが道具袋に入っています。

f:id:kazuhironagai77:20210816002110p:plain

切符の数は4枚です。

f:id:kazuhironagai77:20210816002125p:plain

移動した後です。

f:id:kazuhironagai77:20210816002140p:plain

普通の切符が一枚減っています。残りのItemの数は変わっていません。

出来ていますね。

7. 切符の交換機能の実装

駅では、切符の切れ端を10枚集めるとふつうの切符と交換してくれます。

その機能を実装します。

切符の交換用のWidgetを作成します。

W_WarpGate widgetを参考にします。

f:id:kazuhironagai77:20210816002210p:plain

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

名前はW_ExchangeTicketとしました。

f:id:kazuhironagai77:20210816002223p:plain

取りあえずゲーム画面で表示してみます。

f:id:kazuhironagai77:20210816002239p:plain

こんな感じです。

やっぱり交換するボタンは下にあった方が良いですね。

f:id:kazuhironagai77:20210816002255p:plain

これの方が見やすいですね。

それでは交換するボタンを押した時の実装をします。

まず本当に切符の切れ端が10枚あるか確認します。

f:id:kazuhironagai77:20210816002309p:plain

無ければボタンを押しても何も起きません。

在る場合は、以下の方法で切符の切れ端を10枚、道具袋から消します。

f:id:kazuhironagai77:20210816002330p:plain

このやり方は最適ではない気がしますが、結果が間違っている訳ではないので今回はこれで行きます。

その後で、切符の切れ端の数から10を引き、

f:id:kazuhironagai77:20210816002404p:plain

道具袋に普通の切符を追加して

f:id:kazuhironagai77:20210816002425p:plain

画面に表示している普通の切符の数にも1を足します。

f:id:kazuhironagai77:20210816002445p:plain

これで完成です。

Textの表示、切符の枚数の表示、そして戻るボタンの表示の実装方法は、今までにやったやり方と全く同じなので記録はスキップしました。

テストします。

切符の切れ端、10枚持っている状態で交換所に行きます。

f:id:kazuhironagai77:20210816002513p:plain

「交換する」を押します。

普通の切符が1枚、切符の切れ端が0枚になりました。

f:id:kazuhironagai77:20210816002533p:plain

道具袋を開いて確認しても普通の切符が一枚になっています。

f:id:kazuhironagai77:20210816002549p:plain

他にも色々テストしてみましたが問題なかったです。

これで完成です。

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についての解説のようですね。

以下の内容について講演するそうです。

f:id:kazuhironagai77:20210816002645p:plain

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部分だけ読み返してみます。

今、読み返して分かったんですけど

f:id:kazuhironagai77:20210816002702p:plain

の部分で理論を解説していたんですね。うん。この教科書で勉強した時はこの部分の価値を全く理解していなくて読み飛ばしていました。

この講演を聞くための予習としては十分でしょう。

次に行きます。

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をする場合は

f:id:kazuhironagai77:20210816002719p:plain

を使用するらしいです。

公式のDocumentのAsyncTask [11] には

f:id:kazuhironagai77:20210816002732p:plain

と書かれていました。

使い方の簡単な説明はないのかなと思って探したらUnreal WikiAsyncTask () 関数 [11] についての使用方法の簡単な解説がありました。

f:id:kazuhironagai77:20210816002746p:plain

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の理想的な実装が書かれているとありました。

f:id:kazuhironagai77:20210816002802p:plain

以下に示した様な分かり易いPower Pointで解説されていました。

f:id:kazuhironagai77:20210816002817p:plain

更に以下の図でもう少し詳しい手順が解説されています。

f:id:kazuhironagai77:20210816002830p:plain

ここで重要な点は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です。

f:id:kazuhironagai77:20210816002851p:plain

これはBP内でLoading ModuleのILoadingScreenModuleを呼び出すNodeを使用していると考えられます。

f:id:kazuhironagai77:20210816002906p:plain

正しこのNodeはUE4C++側で実装されているため、上記のPower Pointでは間に

f:id:kazuhironagai77:20210816002919p:plain

が書かれています。これだけがBP側で行う事です。

BPから呼び出された

f:id:kazuhironagai77:20210816002936p:plain

はInterfaceなので実際はそのInterfaceから派生したクラスを呼び出すはずです。それが

f:id:kazuhironagai77:20210816002951p:plain

なのでしょう。

このクラスの実装に必要なクラス(もしくは関数)である

f:id:kazuhironagai77:20210816003007p:plain

が呼ばれます。

今度はこのSLoadingScreenを実装するのに必要なクラス(もしくは関数)である

f:id:kazuhironagai77:20210816003023p:plain

が呼ばれます。

FLoadingScreenBrushからはEngine の

f:id:kazuhironagai77:20210816003035p:plain

が呼ばれ、

SLoadingScreenからは

f:id:kazuhironagai77:20210816003128p:plain

が呼ばれ、そして

FLoadingScreenModuleからは

f:id:kazuhironagai77:20210816003142p:plain

が呼ばれます。

Engineから呼ばれた3つのクラス、FSlateDynamicImageBrush、SCompoundWidget、そしてIModuleInterfaceについて少しだけ調べます。

そしたらこのサイト[12]に日本語に翻訳されたスライドがありました。

f:id:kazuhironagai77:20210816003158p:plain

うーん。

ぱらっと見た感じでは全く同じみたいですね。

もうYouTubeの動画で勉強を始めちゃったのでYouTubeの動画で勉強を進めます。

FSlateDynamicImageBrushについては、公式DocumentのFSlateDynamicImageBrush [13] しか見つかりませんね。

f:id:kazuhironagai77:20210816003213p:plain

SCompoundWidgetは何回が使用した記憶があります。

Sherif, William氏の Unreal Engine 4 Scripting with C++ Cookbook [10]では9章のCreate a custom SWidget/ UWidgetで使用方法が解説されています。

f:id:kazuhironagai77:20210816003231p:plain

今、作成しているRPGでもたしか使用したはず。

と思って確認したら使用していたのはUUserWidgetでした。

f:id:kazuhironagai77:20210816003248p:plain

ちょっと違いました。

IModuleInterfaceはUnreal Engine 4 Scripting with C++ Cookbook [10]でEditor Moduleの作成の時に使用しています。

f:id:kazuhironagai77:20210816003304p:plain

FLoadingScreenModuleの親クラスとして使用するのでしょうか?

今度は使用方法についての説明です。

Blueprint側だそうです。

f:id:kazuhironagai77:20210816003323p:plain

f:id:kazuhironagai77:20210816003329p:plain

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の

f:id:kazuhironagai77:20210816003344p:plain

に当たり、Play Loading Screenを呼び出す所が

f:id:kazuhironagai77:20210816003357p:plain

を表しているんでしょうか?

(ここは解説で、Play Loading ScreenはBP callable functionでUE4C++側で作成すると言っているので予測の通りでした。)

後、Load Game Level ノードと言う多分始めて見るノードを使用しています。

f:id:kazuhironagai77:20210816003413p:plain

よくよく考えたら以下に示したノードの左端のマークの意味が分かりません。

f:id:kazuhironagai77:20210816003428p:plain

f:id:kazuhironagai77:20210816003441p:plain

これの意味が分かったらもう少し正しい推測が出来るんですが…

後、このBPの実装は全てGame Instance BP内に書かれています。Levelの移動をするんだから当たり前ですが、何か不思議です。

Open LevelのLevel NameにはAbsolute Pathを必ず使用するようにと説明されていました。そうしないと指定されたLevelを全てのLevelから探して時間が余計にかかるそうです。これは勉強になりました。

ここからProgrammer専門の話になるそうです。

最初のSlideはModuleについてです。

Loading Screenとは直接関係ないのでスキップします。

次のSlideはAction RPGのFolderです。

f:id:kazuhironagai77:20210816003457p:plain

f:id:kazuhironagai77:20210816003505p:plain

これってMarket PlaceからDownload出来る無料のAction RPGと同じなんでしょうか?

確認します。

同じみたいです。

f:id:kazuhironagai77:20210816003528p:plain

f:id:kazuhironagai77:20210816003535p:plain

次のSlideです。

今度はModuleのLoadの順番についての解説です。

Loading ModuleはGame Moduleより先にInitializeしないといけません。その方法について解説してます。

.uprojectのLoadingPhaseで指定します。

f:id:kazuhironagai77:20210816003551p:plain

次はInterfaceについてです。

このSlideで紹介されているInterfaceも先程のAction RPGのActionRPGLoadingScreen内にあるものと全く同じでした。

f:id:kazuhironagai77:20210816003607p:plain

f:id:kazuhironagai77:20210816003613p:plain

成程、IModuleInterfaceを継承していますね。

f:id:kazuhironagai77:20210816003628p:plain

Interfaceなので当然Virtualです。

f:id:kazuhironagai77:20210816003641p:plain

このGet関数はVirtualじゃないですね。Interfaceでもこんな書き方もあるんですね。

一見単純なGet()関数に見えますが、Staticで返したり、Inlineを使用している所など、ちょっと私の今のC++の知識では100%の理解は出来ないですね。

Inlineは高速化のためなんでしょうか?

たった一行の関数ですが、結構考えさせられます。

当分、UE4C++の勉強はやるつもりはないので今回はコードの内容については深入りはしません。

次のSlideはInterfaceの実装についてです。

いや、Interfaceは実装は出来ないでしょう。Interfaceから派生したクラスの実装は出来ますが。と思ってActionRPGLoadingScreen.cppを見たら納得しました。

f:id:kazuhironagai77:20210816003720p:plain

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