UE4の勉強記録

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

「Unreal Engine 4.xを使用してRPGを作成する」の足りない部分を作成する 全体の改善 Part 3

f:id:kazuhironagai77:20210704212517p:plain

<前文>

中学生の時から本があると読まずにいられない性分だった私は立花隆氏の本をほとんど全部読んでいました。

残念だったのは立花隆氏を知ったのは渡辺昇一氏よりずっと後で、逆だったら田中角栄の裁判について10倍くらい面白く読めたと思う事です。

渡辺昇一氏の著作は一貫して白黒はっきりつける結論至上主義に対して、立花隆氏の著作は科学的な手順や思考にこそ真実があると言うスタンスで、その結果、結論が常識外れだとしてもそれはそれで受け入れるみたいな手順至上主義みたいな所がありました。

この二人が田中角栄の裁判を巡って大喧嘩したと聞いた時は「それは絶対面白いだろう。ぜひその時の事を知りたい。」と思いましたが実際に読んだらあんまり面白くなかったです。渡辺昇一氏の田中角栄の裁判に関する本はその時は既に読んでいて、立花隆氏の田中角栄氏に関する本を後から読んだんですが、正直、立花隆氏の臨死体験の面白さを10としたら1か2ぐらいしか面白くなかった記憶があります。

今は全く本を読まなくなりました。本当の理由は分かりませんが、多分ネットの発達で知識人に価値が無くなったからだと思います。

これはネットの影響を示す一例ですが、Tax havenをtax heavenと勘違いした知識人の方が居ました。直ぐにその間違いはネットに広まってしまい、その話を聞いた私はその人の話を一切信じなくなりました。一瞬でその人の知識人としてのブランドが崩壊してしまったんです。

その代りにネットの中に今まで知識人達が担当していた部分、日本人の知識欲を満たしたり、日本の針路についての助言を行う別な人達が現れました。

中田敦彦氏、DAIGO氏、ひろゆき氏のような人達です。

あいつ等は軽い!と読書好きな人からは怒られるかもしれませんが、その軽さこそがこのネット社会で生き残る秘訣だと私は思います。今のネット社会で間違いを指摘されない事は不可能です。間違いを指摘されてしどろもどろにうろたえる事が駄目であって、直せば良いんです。直したら更に良くなるだけです。彼らは自分の間違いを直す事を全く恐れません。また最初からある程度間違える事も計算していて間違えたらすぐに修正出来る様に準備しています。

そんな中で私が今一番注目しているのが元プロレスラーの前田日明氏です。彼の主張する下剋上の思想「大義があれば下剋上は正しかったし今も正しい。」はこれからの日本の未来を決める思想になる可能性があります。

彼の主張する下剋上の思想を簡単に言えば、我々はみんな日本丸に載ってる乗員ですが、船長が余りにもアホな行動をしたら船が沈んでみんな死んでします。だからそんな船長はみんなで監禁してもっとまともな人に船長になってもらう。と言う言われてみれば当たり前の考え方です。しかしこの考え方、とても悪い事のように今の我々は教わっています。これが間違っているっと前田日明氏は主張してるわけです。

戦国時代の様に明日侵略されて死ぬかもしれない時代ではアホな領主の下に付いたらすぐに死んでしまいます。そんな時代は下剋上は必要悪として当たり前だった。しかしそれは戦国時代のような特殊な時代のみに通じる常識なのか?実は下剋上はいつの時代でも通じる当たり前の事で、今の我々がそれが悪い事であると洗脳されているだけなのかもしれない。

この思想はネットで叩かれて直ぐに死んでしまうかもしれません。しかしもし5年も生き延びる事が出来れば日本の未来への活路を開くための日本人の意識転換の一歩になるかもしれない気がしています。

と言うのは「上がサボっているから俺もサボる。」と言う考えに捕らわれるとみんながサボりだし、結果的に仕事の質が指数的に落ちていくからです。製品の段階ではもう競争にならない位の低品質になってしまいます。

そして日本の大部分が今このスパイラルに陥っているように見えます。

ここで下剋上の思想が一般化すれば「上がサボっているなら俺が取って代わる。」となるから仕事の手を抜く事はありません。むしろチャンスが到来したともっと仕事を熱心に行うようになります。更に自分が仕事の手を抜くとこんどは部下に取って代わられるため今のように上がサボっているから俺もサボろうとはならないからです。

つまりその結果「上がサボっているから俺もサボる。」と言う負のスパイラルから抜け出せるようになる訳です。

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

<本文>

1.今週の予定

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

  • Niagaraの勉強の続き
  • Cascadeの勉強の続き
  • RPGの直し
    • PickUpItemクラスにItemを追加
    • Monsterがアイテムを落とすようにします
    • Warp Passの作成
    • Landscape4にgood skyを追加

全部は無理かもしれませんがやれるだけやっていきます。

2.Niagaraの勉強

今週もRibbon Renderingについて勉強します。

2.1 Ribbon Renderingの仮説

先週、Ribbon Renderingは以下の様にRenderingしているのではないのかと説明しました。

ただしこのやり方でRibbon Renderingを説明しているTutorialはひとつもありません。世界で私だけです。ので論理的な破たんがない事をしっかり確認しておきたいです。

まずLife timeとSpawn Rateの関係で一個のRibbonしか生成されない場合です。

f:id:kazuhironagai77:20210704212628p:plain

Ribbonは必ず長方形になります。

横軸の長さはLife TimeとRibbon Systemの先頭が移動するスピードで決定されます。

次にLife timeとSpawn Rateの値を大きくして一個以上のRibbonが生成される場合です。

f:id:kazuhironagai77:20210704212643p:plain

この場合は存在しているRibbon全体に対して一枚のMaterialが貼られます。

以下のScreenshotの様にです。

f:id:kazuhironagai77:20210704212703p:plain

のでLife timeとSpawn Rateの値を大きくして沢山のRibbonが生成されるようにすると以下の図の様に円周上に沿ったイメージを作成する事も出来ます。

f:id:kazuhironagai77:20210704212724p:plain

しかしある程度の時間が経つと最初のRibbonのLife timeが尽き消滅します。しかしそれと同時に新しいRibbonも生成されます。

f:id:kazuhironagai77:20210704212742p:plain

するとRibbon全体の長さは一定になります。

f:id:kazuhironagai77:20210704212800g:plain

2.2 Ribbon Renderingの仮説の検証

Life timeとSpawn Rateの関係で一個のRibbon しか生成されない場合、本当に長方形のRibbonしか生成されないのか確認します。

以下の条件で試してみます。

f:id:kazuhironagai77:20210704212901p:plain

f:id:kazuhironagai77:20210704212908p:plain

Life Timeが0.5秒ですので一個のRibbonの寿命は0.5秒になります。

そしてSpawn Rateは1.0にセットしたので、1秒間に1個のRibbonが生成されます。

これなら一個のリボンしか生成されません。本当に長方形になるのか試してみます。

テストします。

f:id:kazuhironagai77:20210704212932p:plain

???

出来ません。Ribbonが一個も生成されないです。

あれ?

色々試しましたがRibbonの寿命が次のRibbonが生成される前に尽きる場合は絶対に生成されません。

しかし以下の条件のように最初のRibbonの寿命が尽きる前に新しいRibbonが生成される場合はRibbonを見る事が出来ます。

f:id:kazuhironagai77:20210704212950p:plain

f:id:kazuhironagai77:20210704212956p:plain

上記の条件だとRibbonの寿命は1秒で、Ribbonは0.5秒毎に生成されます。

f:id:kazuhironagai77:20210704213017g:plain

上記の条件だと常に2個のRibbonが生成されます。この場合だと長方形になります。

うーん。

閃きました。以下に説明します。

2.3 Ribbon Renderingの仮説の改良

Initialize Ribbon Moduleで生成されるのは幅の情報を保持するParticleだけなんです。

f:id:kazuhironagai77:20210704213057p:plain

以下のようなイメージのParticleです。

f:id:kazuhironagai77:20210704213116p:plain

これが一個しか生成されない時はRibbonは作れません。ので何も表示されません。

もしこれが2個以上生成される場合はそれぞれのParticleを繋いでRibbonを生成する事が出来るのでRibbonが生成されます。

f:id:kazuhironagai77:20210704213134p:plain

以下に示した赤い部分がRibbonになります。

f:id:kazuhironagai77:20210704213150p:plain

この考え方でもRibbonが最初はどんどん長くなるのに、ある程度の時間が過ぎるとRibbonの長さが変わらなくなるのも説明出来ます。

まずこのParticleが2個以上ある場合です。

以下の様に沢山あると仮定します。

f:id:kazuhironagai77:20210704213208p:plain

この場合以下の様なRibbonが生成されるはずです。

f:id:kazuhironagai77:20210704213241p:plain

一番右端のParticleのLife Timeが尽き消滅します。

しかし左端に新しいParticleが誕生します。

f:id:kazuhironagai77:20210704213259p:plain

のでTotalの長さは同じになります。

つまりInitialize Ribbon Moduleで生成されるのは面ではなく辺だったんです。

2.4 Ribbon Renderingの新たな仮説の検証

今度の仮説は合っていると思いますが少し検証してみましょう。

Particleが3つ作られる条件でRibbonを作成してみます。

f:id:kazuhironagai77:20210704213328p:plain

f:id:kazuhironagai77:20210704213335p:plain

はい。

<テスト1

最初のテストは横に引っ張っります。

f:id:kazuhironagai77:20210704213359g:plain

まず観察します。

①最初に現れたRibbonです。

f:id:kazuhironagai77:20210704213434p:plain

②直ぐにその上を覆うように横に拡張したRibbonが現れます。

f:id:kazuhironagai77:20210704213453p:plain

③次に現れるRibbonはサイズは前のRibbonと同じですが位置が左にずれています。

f:id:kazuhironagai77:20210704213512p:plain

これを何回も繰り返して、④左端につくと横のサイズが小さいRibbonが発生します。

f:id:kazuhironagai77:20210704213536p:plain

⑤そして更に横幅の小さいRibbonが発生します。そしてRibbonは消滅します。

f:id:kazuhironagai77:20210704213555p:plain

改良した仮説によると①の状態は以下の様になっていると考えられます。

f:id:kazuhironagai77:20210704213612p:plain

2個目のParticleが生成され最初のRibbonが生成された状態です。

②の時は更にもう一個のParticleが生成されます。のでNiagara Systemが一定の速度で左に移動しているならばRibbonの横幅は大きくなります。

f:id:kazuhironagai77:20210704213630p:plain

③の時は最初に生成されたParticleが消滅します。しかしそれと同時に新しいParticleが生成されます。

f:id:kazuhironagai77:20210704213648p:plain

ので長さが一定で左に移動するRibbonが生成されます。

④の状態です。

左端のParticleはNiagara systemが停止したために隣のParticleに非常に近い場所で生成されています。

f:id:kazuhironagai77:20210704213706p:plain

ので3つのParticleがある状態ですが、Ribbonは前より短くなります。

最後の⑤の状態です。

Niagara systemが停止したため新しいParticleが作成される事はありません(あるのかもしれませんが前と同じ位置で作成されるためされないのと同じ事になります)。

f:id:kazuhironagai77:20210704213723p:plain

これによって前の④より更に短いRibbonが生成されます。勿論この後でRibbonは消滅します。

横に伸びた状態は完璧に説明出来ていますね。

<テスト2

今度はNiagara Systemを回転させてみました。

f:id:kazuhironagai77:20210704213816g:plain

①やはり最初に作成されるRibbonは長方形でした。

f:id:kazuhironagai77:20210704213904p:plain

これは実は中々見つからなかったです。最初のRibbonから丸くなっていたらオカシイと思って徹底的にコマ送りにして探しました。そうしてやっと見つけました。

②次のRibbonが生成された時です。

f:id:kazuhironagai77:20210704213927p:plain

かなりいびつな形をしています。

③その次のRibbonが形成された時です。

f:id:kazuhironagai77:20210704213948p:plain

完全な扇形になっています。

f:id:kazuhironagai77:20210704214006p:plain

④ほぼ同じ大きさの扇形で移動しつづけています。

Niagara Systemの移動が終了すると扇が小さくなります。

f:id:kazuhironagai77:20210704214023p:plain

⑥最後に長方形になって消滅します。

f:id:kazuhironagai77:20210704214048p:plain

はい。それでは検証していきます。

先ず①の状態です。

今度は円を描くようにNiagara Systemを移動させましたのでParticleが円周上に生成されているはずです。

以下に示したのはそのポンチ絵です。

f:id:kazuhironagai77:20210704214106p:plain

もし上図のような状態で二つのParticleがRibbonを作成すると2点でも扇型、もしくは台形型になるはずです。

f:id:kazuhironagai77:20210704214123p:plain

f:id:kazuhironagai77:20210704214130p:plain

しかし実際はParticleが2点の時は長方形が作成されています。

f:id:kazuhironagai77:20210704214147p:plain

それはこのParticleはRotationの情報は持っておらず、単に2点間を結んだ線をRibbon Widthで広げたと考えると辻褄が合います。

f:id:kazuhironagai77:20210704214213p:plain

ただし実際の計算でどんなAlgorithmが使用されているのかが分からないと実際の所は分かりませんね。その近似式を使うと2点の時は長方形、3点以上の時は扇形になるのかもしれませんし。

その近似曲線の計算方法が分からないのでこれ以上ここで追及するのは無駄な気がします。ので一端ここで中止します。

私が想像していたのは3点のParticleが生成された場合は以下のようなRibbonが生成され、

f:id:kazuhironagai77:20210704214239p:plain

生成されるParticleが増えると以下に示した様なもっとスムーズなRibbonが生成される

f:id:kazuhironagai77:20210704214257p:plain

と思っていましたが実際は、3点のParticleが生成された時点で

f:id:kazuhironagai77:20210704214315p:plain

きれいな曲線を描いています。

これはRibbon を作成する段階でCatmull–Clark subdivision surfaceのようななんらかの近似曲線を使用していると言う事です。

2.5 Ribbon Renderingで作成してみる。

まあ完璧とは言えませんがかなりRibbon Renderingについて理解は深まりました。

この知識を元にオリジナルのRibbon Renderingを作成してみようと思います。

以下のイメージを使用してみます。

f:id:kazuhironagai77:20210704214340p:plain

Materialは以下の様に組みました。

f:id:kazuhironagai77:20210704214359p:plain

Niagara Systemの設定は

f:id:kazuhironagai77:20210704214417p:plain

f:id:kazuhironagai77:20210704214424p:plain

にしてみます。

f:id:kazuhironagai77:20210704214502g:plain

うーん。文字を使用するのはどうでしょうか?

f:id:kazuhironagai77:20210704214655p:plain

これで試してみます。

f:id:kazuhironagai77:20210704214731g:plain

字ははっきりと読めますね。良いんじゃないでしょうか。

白色を追加した方が黒や赤がはっきり見えると思ったんですがあまり関係ないというか透明にした方が見やすそうですね。

昔の漫画の効果線の様な感じを出してみました。

f:id:kazuhironagai77:20210704214846p:plain

f:id:kazuhironagai77:20210704214912g:plain

横に伸ばされるので丸いほうが線が滑らかかもしれません。

f:id:kazuhironagai77:20210704215031p:plain

これで試してみます。

f:id:kazuhironagai77:20210704215103g:plain

今週はここまでにしますが色々なイメージを試すだけでも結構勉強になります。

3.Cascadeの勉強の続き

Intro to Cascade: Creating a Beam Emitter | 07 | v4.2 Tutorial Series | Unreal Engine [1]の続きをやっていきます。

3.1 InterpolationとSheetについて

先週、Interpolation とSheet を使用してBeamを曲げました。でもこれらのParameterの機能は調べませんでしたのでそこから始めます。

Interpolationについては直ぐに理解出来ました。

0です。

f:id:kazuhironagai77:20210704215232p:plain

1です。

f:id:kazuhironagai77:20210704215247p:plain

2です。

f:id:kazuhironagai77:20210704215302p:plain

3です。

f:id:kazuhironagai77:20210704215318p:plain

4です。

f:id:kazuhironagai77:20210704215333p:plain

5です。

f:id:kazuhironagai77:20210704215349p:plain

つまりTargetとSourceの2点間の間を直線で繋ぐのに何個の頂点を追加するかを示してます。

公式のDocumentであるBeam Type Data [2]によると

f:id:kazuhironagai77:20210704215406p:plain

と書かれています。

成程、SourceやTargetで示したTangent、つまり傾きを満たす最大限の角度を

f:id:kazuhironagai77:20210704215424p:plain

正確に表すためには

f:id:kazuhironagai77:20210704215440p:plain

の数が多ければ多い程良い訳ですね。

ただしDistributionのConstantのZの値が具体的に何を表しているのかは分かりませんね。

角度を表しているなら45度を代入したら円になるはずですよね。

f:id:kazuhironagai77:20210704215458p:plain

しかし実際は明らかに楕円形をしています。

Sheetについてですが、公式のBeam Type Data [2]によると

f:id:kazuhironagai77:20210704215515p:plain

と書かれています。

まずSheetが具体的に何を指しているんでしょうか?

恐らくですがMaterialを貼り付ける面の事をSheetと呼んでいるんでしょう。

例えばNiagaraRibbonの場合なら以下に示した図なら赤い部分がSheetに当たり、

f:id:kazuhironagai77:20210704215533p:plain

SpriteならParticleに貼りつけるMaterialを表示するための面がSheetになると思われます。

f:id:kazuhironagai77:20210704215601p:plain

Beamの場合はSheetをTargetとSourceの間に作成してその上にBeamのMaterialを貼っていると仮定すると上の公式の説明がなんとなく理解出来ます。

Beamを上から眺めてSheetの数によってBeamの見た目が変化するかを見てみます。

0の時です。

f:id:kazuhironagai77:20210704215619p:plain

0なら何も表示されないのではと思いまいしたがBeamが表示されています。なんででしょう?

1です。

f:id:kazuhironagai77:20210704215634p:plain

0と変わってないですね。

良く見ると真ん中で捻じれていますね。そのせいで途中から裏側が映し出されています。裏側にはなにも表示されていないので透明になっているんですね。

2です。

f:id:kazuhironagai77:20210704215652p:plain

真ん中に5本の筋がみえるようになりました。Sheetが一枚足されたのでしょう。ただしこの角度からは新しく足されたSheetに貼られたBeamの絵を見る事は出来ませんね。

3です。

f:id:kazuhironagai77:20210704215709p:plain

両端にひし形のイメージが追加され更に真ん中の線が左右対称の複雑な形状に変化しました。

ただしこの視点からみてBeamのイメージで消えている部分が見えるように成る事はありませんでした。

順調にSheetの数は増えていると考えられます。

4です。

f:id:kazuhironagai77:20210704215727p:plain

少しだけRibbonの消えている部分に絵が描かれるようになりました。

5です。

f:id:kazuhironagai77:20210704215744p:plain

あんまり変わっていないですね。

6です。

f:id:kazuhironagai77:20210704215802p:plain

イメージの見えていなかった部分のBeamがかなりはっきり見える様になりました。

10です。

f:id:kazuhironagai77:20210704215820p:plain

ほぼ左右対称になりました。

まあ、全部が理解出来た訳ではありませんが、Sheetの枚数はBeamがどの角度から見ても消える箇所がないようにするまで増やす。と考えるべきでしょうね。

BeamをLevel上に配置したら色々な角度から観察してもしBeamの一部が消えているならばSheetの数が足りないと言う事です。

3.2 BeamのRenderingについての考察

具体的にどうやってBeamをRenderingしているのかがまだ良く分かっていません。ずっと分からないままかもしれません。

BeamのRenderingでよく分からないのが、以下のイメージです。

f:id:kazuhironagai77:20210704215846p:plain

このRibbonを中心として180度カメラを回します。今、手前に来ているリボンの付け根の部分に注目して下さい。

180度、このRibbonを中心にしてカメラを回しました。

f:id:kazuhironagai77:20210704215906p:plain

本来なら前のRibbonに隠れて見えないはずの部分が見えています。遠近感が滅茶苦茶です。

もしParticleを飛ばし、その上に板を貼ってその板を繋げたモノをSheetと名付けて、そのSheetの上に絵を描いているだけならこんな破たんは起きないと思われます。どうやって実際のRenderingが行われているのは現状では全く不明です。

はい。Smileちゃんの出番です。

f:id:kazuhironagai77:20210704215923p:plain

Sheetは1にセットしています。

f:id:kazuhironagai77:20210704215940p:plain

これを見ると一枚の大きなSheetがSourceとTargetを両端として作成されているようにです。

今度は真横から見てみます。

f:id:kazuhironagai77:20210704220015p:plain

例え真横から見ても前半分はカメラ側を向いて後ろ半分はカメラの反対側を向いています。

逆向きになっても同じです。

f:id:kazuhironagai77:20210704220054p:plain

所が上から見ると、今度は逆になっています。奥半分のSheetがカメラ側を向いて手前の半分のSheetはカメラの反対側を向いています。

f:id:kazuhironagai77:20210704220121p:plain

かなり強引な構図ですが真下から見てみました。

f:id:kazuhironagai77:20210704220151p:plain

真下から見た時は、前半分はカメラ側を向いて後ろ半分はカメラの反対側を向いています。普通です。

以下にカメラをBeamの上に移動した時のSheetの変化を示します。

f:id:kazuhironagai77:20210704220236g:plain

分かりました。

根元の部分に注目して下さい。Sourceから一番最初のInterpolateまでの面は常にカメラに向かって正面を向いています。それ以外のSheetはその面の捻じれにつられて面がカメラに向いたり、カメラの逆側を向いたりしています。

では、Sheetが2枚になったらどうでしょうか?

f:id:kazuhironagai77:20210704220331p:plain

Sheetがお互いに90度に交わるように重なっています。勿論、Sheetの数は2枚になっています。

ああ、分かった。

Beam Type Data [2]で言っていた事の意味が分かりました。

f:id:kazuhironagai77:20210704220349p:plain

Sheetが一枚の時は以下の様に単に一枚のSheetが作成されます。

f:id:kazuhironagai77:20210704220408p:plain

Sheetが2枚の時は以下のようにお互いに垂直に交わるように作成されます。

f:id:kazuhironagai77:20210704220425p:plain

ここからは想像ですが、Sheetの数が3になったらお互いが60度の角度を保つように生成されるはずです。

試してみます。

f:id:kazuhironagai77:20210704220455p:plain

大体60度っぽい角度で3つのSheetが交差しています。

f:id:kazuhironagai77:20210704220516p:plain

別な角度で見てみました。どう見ても60度でしょう。

はい。Sheetについても完璧に理解出来ました。

それでですね。

奥にある部分が手前にRenderingされてしまう理由ですが、

f:id:kazuhironagai77:20210704220535p:plain

分かりません。

どっかのParameterを弄ったら直るのかもしれませんし、もしかしたらバグかもしれませんね。

でもこれだけ分かれば十分です。

3.3 Intro to Cascade: Creating a Beam Emitter | 07 | v4.2 Tutorial Series | Unreal Engine [1]の続きをやる

ここまで理解出来ればBeamに関しては十分ですが、せっかくですのでこのTutorialは終わらせる事にします。

Beam categoryのNoise Moduleを追加します。

f:id:kazuhironagai77:20210704220802p:plain

f:id:kazuhironagai77:20210704220809p:plain

Noise ModuleのLow Freq Enabledにチェックを入れ、Frequencyを10にセットします。

f:id:kazuhironagai77:20210704220828p:plain

このModuleは何を管理しているんでしょうか?

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

f:id:kazuhironagai77:20210704220846p:plain

Noise RangeのDistributionの設定を以下のように変えると

f:id:kazuhironagai77:20210704220909p:plain

以下に示した様にBeamの形状が微妙に変化し始めました。

f:id:kazuhironagai77:20210704220931g:plain

Beam Data ModuleのMax Beam Countの値を3にセットします。

f:id:kazuhironagai77:20210704221006p:plain

Beamの数が3本に見える様になりました。しかし実際に撮影すると1本しか見えません。

f:id:kazuhironagai77:20210704221021p:plain

後は一個を除いて特に重要なポイントはなかったです。

のでBeam Data ModuleのMax Beam Countを少しだけ調べる事にしました。

Beam Type Data [2]には

f:id:kazuhironagai77:20210704221039p:plain

と書かれています。

でもBeamだってSpawn RateとLife Timeで生成される数は決まるはずです。

その辺の関係を見てみます。

うーん。色々数字を弄って見たんですが良く分からないです。

最後の重要なポイントに行きます。

3.4 Distribution Float Particle Paramの具体的な使用方法について

このTutorialの最後にTargetの位置をBPやUEC++から指定出来ると言っていました。

f:id:kazuhironagai77:20210704221105p:plain

そしてその具体的なやり方は前のUE4C++のTutorialで実際に紹介してあると言いました。

これって2021-05-24のブログで勉強した中で唯一、具体的な方法が分からなかったDistribution Float Particle Paramの使用方法についての説明の事じゃないでしょうか?

流石に今週はこれ以上Cascadeの勉強をする時間はないので来週調べる事にします。

4.PickUpItemクラスにItemを追加

4.1 Dropped Item Baseクラスにitemを追加する

最初にDropped Item BaseクラスがItemを表示出来るようにします。

f:id:kazuhironagai77:20210704221135p:plain

その為には以下の関数にItem名とそのItemのMeshを追加する必要があります。

f:id:kazuhironagai77:20210704221150p:plain

追加するItemはData Table、Itemsで管理されている以下の3つです。

f:id:kazuhironagai77:20210704221205p:plain

以下の部分を追加しました。

f:id:kazuhironagai77:20210704221220p:plain

f:id:kazuhironagai77:20210704221227p:plain

テストします。

以下の設定にしました。

f:id:kazuhironagai77:20210704221245p:plain

角度やサイズに不満がありますがちゃんと回復薬が表示されています。

f:id:kazuhironagai77:20210704221302p:plain

イーサーの場合です。

f:id:kazuhironagai77:20210704221327p:plain

ダークイーサーの場合です。

f:id:kazuhironagai77:20210704221347p:plain

サイズと向きを直します。

Return Static Mesh Of Items関数に位置、回転、サイズなどのTransform情報を追加します。

f:id:kazuhironagai77:20210704221403p:plain

武器とItemで別なTransform情報を与えるようにしました。

f:id:kazuhironagai77:20210704221419p:plain

テストします。

f:id:kazuhironagai77:20210704221434p:plain

f:id:kazuhironagai77:20210704221443p:plain

f:id:kazuhironagai77:20210704221452p:plain

とりあえずはOKでしょう。

4.2 Itemを拾えるようにする。

PickUpItemウィジェットを改良してItemも拾えるようにします。

f:id:kazuhironagai77:20210704221524p:plain

以下にWidgetのイメージを示します。右端の落とし物の絵と属性は武器・防具専用のモノですのでこれをItem専用に直し必要があります。これは後で直します。

f:id:kazuhironagai77:20210704221542p:plain

今回は、Itemを拾う部分の実装を追加します。

Get Data Table Row Weaponsを追加します。Data TableはItemsをセットします。

ここでItemの名前が正しいのかをチェックしています。

f:id:kazuhironagai77:20210704221558p:plain

ItemsのData Tableは以下の様になっています。

f:id:kazuhironagai77:20210704221615p:plain

次にRPGGameInstanceのArrayであるItemsに拾ったItemの名前を追加します。

f:id:kazuhironagai77:20210704221638p:plain

ItemsはUE4C++のRPGGameInstanceクラスの変数です。

f:id:kazuhironagai77:20210704221655p:plain

この辺のPlayerの操作するCharacterのDataを管理する変数は最終的には全部UE4C++側のGame Instanceクラスで管理すべきなんでしょうか?

やっぱり最近のゲームはこれらのデータは全部サーバーで管理しているんでしょうか?

正直、サーバー関連のProgrammingはあんまり興味がないんです。いや興味はあるんですがUE4ほどの興味は無いです。のであんまり勉強が進みません。

ただAWSにしてもFire baseにしてもお金はかかるはずでEpic Game社が提供しているサーバーは無料ですから、この辺に詳しくなったら結構なビジネスチャンスがあるのではとは思っています。

次は拾ったItemをLevel上から消すための関数です。

f:id:kazuhironagai77:20210704221732p:plain

実装部が以下の様になっているんですがItem Nameが何のための変数だったのか忘れてしまいました。

f:id:kazuhironagai77:20210704221749p:plain

RPGGameInstanceBPにあるItemSpawnDataの実際の要素を見ると

f:id:kazuhironagai77:20210704221806p:plain

Nameには武器の日本語名、ItemNameには武器の英語名が記されています。

しかし武器のdata tableである  Weaponsには

f:id:kazuhironagai77:20210704221822p:plain

英語名はないんです。

あ、分かりました。

その武器の種類じゃなくてその武器そのものを示す名前がないとその武器だけをLevel上から消せなかったです。Item Nameはその武器個別の名前でした。

と言う事は

f:id:kazuhironagai77:20210704221839p:plain

は武器の場合もItemの場合も同じであると考えれます。

となると残りのコードはWeaponのがそのまま使用出来ると考えられます。

f:id:kazuhironagai77:20210704221858p:plain

これでどうでしょうか?

テストしてみます。

RPGGameInstanceBPのArrayであるItemSpawnDataに

f:id:kazuhironagai77:20210704221914p:plain

回復薬のデータを追加します。

f:id:kazuhironagai77:20210704221938p:plain

これで試してみます。

回復薬が地面に出現しました。

f:id:kazuhironagai77:20210704221956p:plain

Eボタンを押すと以下の画面が表示されました。

f:id:kazuhironagai77:20210704222027p:plain

このWidgetはこの後で直します。

「拾う」を押します。

f:id:kazuhironagai77:20210704222054p:plain

Itemが消えました。

Pause画面を開きます。

f:id:kazuhironagai77:20210704222113p:plain

道具袋の中に先程拾ったItemである回復薬がしっかり入っていました。

成功ですね。

4.3 PickUpItem ウィジェットのHUDを直す

以下に示した様に表示されるようにしました。

f:id:kazuhironagai77:20210704222136p:plain

変更したのは以下の部分にBindしている関数です。

f:id:kazuhironagai77:20210704222152p:plain

やり方は全部一緒でItemの場合の表示のためのコードを武器とは別に追加しただけです。

f:id:kazuhironagai77:20210704222208p:plain

出来ました。

PickUpItemの直しは今週、一番大変な部分と思っていたんですが、結果的に凄い簡単に出来ました。

やっぱりこれは先週、調べるだけ調べておいたお陰です。理由は分かりませんが、直す箇所を調べるだけ調べておいて、1週間置いてから直すと凄く楽に直せるようになります。

調べて直ぐ直すのに必要な能力を知力:10、精神力:10、体力:4とすると調べるだけ調べるのに必要な能力は知力:3、精神力:3、体力:4ぐらいで1週間置いてから直すのに必要な能力も同じ位ですみます。

これは一見大したことのない発見のように見えますが実際はかなりの大発見です。

まず、普通の人の知力は2です。頭が良い人でも3です。

それを精神力で無理やりプログラミングに集中する事(つまりプログラミング以外の事は全部忘れる。)で倍の知性つまり6くらいに挙げます。更にコーヒーのようなカフェイン飲料や、砂糖の塊のようなお菓子や炭酸飲料を飲む事(つまり知力のドーピングです。)で無理やり8くらいに上げます。それでも10には足りないのでGoogle先生に頼って作成したいプログラミングに似たコードもしくはそのものズバリを探してきてそのコードを参考にする事(ちょっとだけカンニングする。)事で何とか知力:10の問題を解いていくと言う感じになります。

このやり方は大変な精神力が必要でもあります。知力を2倍にするための集中力を生み出すには高い精神力が必要だからです。前の日に早く寝て十分な睡眠時間を確保する事も必要になります。ちょっとだけと夜更かしすればその分の負担は次の日の朝に必ずかかって来ます。

所が、直す箇所を調べるだけ調べておいて、1週間置いてから直すと必要な能力は知力:3、精神力:3、体力:4ぐらいになります。まだ試した事はないですが、1週間でなく次の日でも同じ効果は出て来ると思います。

つまり、上記で述べた様な無理をする必要が全く無くなります。

普通で良くなります。負担がものすごく軽くなります。

実際の効率から見るとPair Programmingに匹敵するぐらいの発見だと思います。Pair Programmingのように有名に成る事はないでしょうが。一応名前だけ付けておきます。Preparation and Implementation Programmingと名付けました。

5.Monsterがアイテムを落とすようにします

はい。それでは今週も調べるだけ調べておきます。

Monsterがアイテムを落とすように作成すると言いましたが2021-06-13のブログで説明したように、実際は戦闘が終わった時に戦闘場に存在している9体の像のどれかに話しかける事でアイテムが貰える仕組みになります。

f:id:kazuhironagai77:20210704222239p:plain

その時に一個問題があります。

戦闘後の勝利のポーズをPlay Animationで行っているためその後、Player の操作するキャラのAnim Classが外れてしまい、

f:id:kazuhironagai77:20210704222255p:plain

以下に示したように、武器と防具が手から外れた状態になってしまっています。

f:id:kazuhironagai77:20210704222311p:plain

このすぐ後に別なLevelに移動する場合は全く目立たないので問題なかったですが、この後に石像に話しかけるようなActionを取る場合、凄く目立ちます。直す必要があります。

これを来週やります。

名称は「戦闘勝利後のAnimationの直し」とします。

5.1 戦闘勝利後のAnimationの直しのための調査

まず、戦闘を勝利した後のAnimationの表示を実装している箇所をみます。

見つけました。

RPG Game Mode BPのEvent関数であるFight Over のPHASE Victoryの後です。

f:id:kazuhironagai77:20210704222333p:plain

まず最初のノードです。

f:id:kazuhironagai77:20210704222351p:plain

Monsterが分解・消滅するためのAnimationをPlay Animation ノードで実行しています。

Monsterはこの後消滅してしまうので、Play Animationノードを使用してAnim ClassにセットしてあるSkelSwordAni_Cが外れても問題ないです。

f:id:kazuhironagai77:20210704222409p:plain

次は音楽をセットして流していますね。

f:id:kazuhironagai77:20210704222433p:plain

Animationとは関係ない部分なので無視します。

次のノードでDispatcherであるCombat Over Victoryを読んでいます。

f:id:kazuhironagai77:20210704222449p:plain

どんな実装がCombat Over Victoryにされているのか覚えていません。調べます。

Combat Field Mapで実装されていました。Event Stop BGMに繋がっていてBGMを止めます。

f:id:kazuhironagai77:20210704222505p:plain

ここからPlayer の操作するキャラのAnimationの実装が始まります。

カメラの位置と角度を変えるノードです。

f:id:kazuhironagai77:20210704222521p:plain

この機能を作成した時には、まだ戦闘用のLevelを作成していませんでした。のでキャラの撮影をするカメラの位置を指定する為には、キャラに対して行う必要がありました。今は戦闘用のLevelは完成しているのでカメラを別に設置する事も可能です。まあ直す必要は感じませんが。

次のノードは何かを消しています。

f:id:kazuhironagai77:20210704222537p:plain

見たらCombat UIでした。

f:id:kazuhironagai77:20210704222602p:plain

やっと勝利のポーズのAnimationの部分に来ました。

思ったより複雑で、まず武器を装備しているか聞いています。

f:id:kazuhironagai77:20210704222623p:plain

武器を装備していなかった場合、Victory_noWeaponのAnimationが実行されます。

f:id:kazuhironagai77:20210704222641p:plain

武器を装備している場合は、武器が弓矢かそれ以外かで分けられます。

f:id:kazuhironagai77:20210704222656p:plain

弓矢の場合はVictory_BowAnimが実行されます。

f:id:kazuhironagai77:20210704222712p:plain

それ以外の武器を装備していた場合はVictory_SwordShieldAnimが実行されます。

f:id:kazuhironagai77:20210704222733p:plain

成程、この3つのAnimationをPlay Animationノードを使用して実行しているんですね。

分かりました。

この部分をMyThirdPerson_AnimBPに担当させる必要があります。

f:id:kazuhironagai77:20210704222755p:plain

5.2 MyThirdPerson_AnimBPの復習

MyThirdPerson_AnimBPを復習します。

AnimGraphを開いて見ます。

f:id:kazuhironagai77:20210704222816p:plain

Defaultを開きます。

f:id:kazuhironagai77:20210704222833p:plain

うーん。

変数を見ると以下のモノがありました。

f:id:kazuhironagai77:20210704222858p:plain

例えばWithWeaponですがBoolean変数で、以下に示した部分で赤く記した所の条件を担当しています。

f:id:kazuhironagai77:20210704222913p:plain

こんな感じです。

f:id:kazuhironagai77:20210704222945p:plain

この変数にどのようにアクセスして値を変更しているのかを調べれば、同じやり方で戦闘勝利後のアニメーションもMyThirdPerson_AnimBPに追加出来るはずです。

RPGGameModeBP内でMyThirdPerson_AnimBPのWithWeapon変数の値を変更している実装箇所を見つけました。

f:id:kazuhironagai77:20210704223000p:plain

うん。

こんな簡単に出来るんですか。

MyThirdPerson_AnimBPに追加するAnimationに関しては先程、示したAnimGraphのDefault Stateの中身のノードの内、以下の3つにそれぞれのVictoryのポーズを付ければ良いです。

f:id:kazuhironagai77:20210704223017p:plain

f:id:kazuhironagai77:20210704223023p:plain

f:id:kazuhironagai77:20210704223030p:plain

RPGGameModeBP内の勝利のAnimationは以下の部分を変更すれば良いだけです。

f:id:kazuhironagai77:20210704223047p:plain

あ、Set Visibilityノードの後にあるSet Anim Instance Classノードを外す必要もありました。

f:id:kazuhironagai77:20210704223104p:plain

以上です。

6.まとめと感想

今週は以下の事について勉強しました。

  • Niagara SystemにおけるRibbonRenderingについての考察
  • Cascade SystemにおけるBeam ParameterInterpolation pointSheetについて
  • RPGItemが拾えるようにした。
  • RPGで戦闘終了後の勝利のポーズのAnimationについての調査

を行いました。

今週はいつもの週より楽でした。多分、Preparation and Implementation Programmingのお陰です。

7.参照(Reference

[1] Epic Games [Unreal Engine]. (2014, July 8). Intro to Cascade: Creating a Beam Emitter | 07 | v4.2 Tutorial Series | Unreal Engine [Video]. YouTube. https://www.youtube.com/watch?v=ywd3lFOuMV8&list=PLZlv_N0_O1gYDLyB3LVfjYIcbBe8NqR8t&index=8

[2] Epic Games. (n.d.). Beam Type Data. Unreal Engine Documentation. Retrieved July 4, 2021, from https://docs.unrealengine.com/4.26/en-US/RenderingAndGraphics/ParticleSystems/Reference/TypeData/Beam/