UE4の勉強記録

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

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

f:id:kazuhironagai77:20210808231920p:plain

<前文>

最近、YouTubeを見てて知った話に、何でアメリカでバッファローが絶滅寸前になったのかがあります。

その理由はネィティブ・アメリカンの生活のほとんど全てがバッファローに依存している事に気が付いた白人移植者たちが、アメリカ大陸におけるネィティブ・アメリカンの勢力を弱らせるために、バッファローを狩りまくったからだそうです。基から白人移植者たちはバッファローを絶滅させると言う目的があったそうです。

そしてネィティブ・アメリカンの勢力がほぼ殲滅した途端、バッファローの保護に乗り出しました。

しかし今回の話は、別にアメリカ人が偽善的であると言う軽い話ではありません。もっと深い話を書きます。

この話、自分達を白人移植者の立場に置き換えて考えると、アレっと思いませんか?

もし日本人が同じ事を過去にしたら、徹底的に秘密にしてそんな事実は存在しないように歴史を改ざんするでしょう。公的な資料を燃やして、証拠を隠滅したり、そういう研究をする学者に予算を配らないように嫌がらせしたりするはずです。

何故、アメリカ人はそれをしないのでしょうか?

私はずっと、アメリカにも色々な政治、宗教団体がそれぞれ複雑な利害関係があって一見、アメリカ人を叩いているような話でも、実はアメリカ全体としては利益が出るような仕組みが存在していると思っていました。それも正しい事は正しいですが、それよりももっと直接的な理由があったんです。

そして、そこには、アメリカ人を含めたユダヤキリスト教文明圏における独特の宗教観が関係していたんです。

その話を今回はここでします。

皆さん、戒律って知っていますか?

ある宗教を信仰する人達が守らなければならない決まりの事です。例えばユダヤ教イスラム教の人が豚を食べない、とかキリスト教の人が日曜日に教会に必ず行く。とかです。

この戒律って凄く重いんです。日本人が考える道徳と戒律は全く違います。道徳は守ったら素晴らしいですが守らなくても問題ないです。しかし戒律は違います。戒律を守らないとその宗教を信仰する人達から人として扱ってもらえません。

日本で言う村の掟みたいなもんです。

では、その戒律ってどうやって生まれるのか知っていますか?

これが日本の文化には全くない発想なんです。

それは罪と罰から生まれるんです。

ユダヤ教に始まる一神教は激烈な砂漠気候である中東で始まった事に関係してか、その思想も日本人から見るとかなり過激です。その過激な思想に基づいた厳格な罪の判断とその罪に対する非情な罰がセットになっています。

良く、日本だと、被害者が加害者の厳罰を望まないと言うと裁判で罪が軽くなったりしますが、アメリカでは、少なくとも私がいた州ではそんな事は全くなかったです。

それは何故かと言うと、罪を許せるのは罪を犯した事がない人が代わりにその罰を受けた場合だけで、被害者には加害者の罪を軽くする権利なんか元からないからです。

つまり、罪を犯したら必ず罰を受けるんです。

この辺の感覚がまず日本人には分かりません。ホントにポカーンです。罪を犯したのに、罰ッせられてないヤツなんて星の数ほどいるし、その逆に無実の罪で罰せられているヤツだって沢山いるでしょう。と。

残念ながらそんな風に考えるアメリカ人は全くいません。だからアメリカ人は滅茶苦茶主張するんです。無実だと。そしてもし無実の罪で罰せられたことが判明したら、その保証も物凄い金額になります。

では、本当に罪を犯してしまった時はどうするんでしょうか?

罪を犯してしまった場合、100%罰せられます。しかも激烈な罰をです。しかし、この罰を受けないで済む方法があるんです。

罪を犯してしまったが、その行為を心の底から反省した場合は、罰の執行が延期されます。

ここで戒律が誕生するんです。

その犯した罪に応じて、その行為を心の底から反省した場合においてのみ適切な戒律を定められます。その罪人はその戒律を守っている限りにおいて罰の執行が延期されるんです。

これが、ユダヤキリスト教文明圏における戒律なんです。

最初のバッファローの話に戻ります。

何で、アメリカ人が自分達の先祖が犯した罪をそんなに公の場で激烈に主張するのかと言うと、別にアメリカ人がマゾでもアホだからでもなく、そうする事で、彼らが信じる宗教観から、自分達の犯した罪に対する罰の執行を延期出来ると感じるからなんです。

ある民族を殲滅してその土地を奪った。そしたらその奪った民族も神の罰によって殲滅させられます。しかし今のアメリカ人はその罪を認めて、心の底から反省しているし、そういう歴史をきちんと記録に残している。だからアメリカに移民した白人はその罪に対する罰の執行は免れる事が出来るはず。と考えているです。

だからアメリカでは、先住民を殲滅するためのバッファローを狩りまくった話をしても、誰も政治問題化しないんです。

日本人は、この感覚を理解しないと「アメリカの言論の自由は本物だ。何でも言って良いんだ!」と浅くかつ間違って理解して、アメリカ文化のタブーが日本以上にあるのに、そのタブーに軽率に触れて、アメリカ社会における自分の社会的な立場を一瞬で失ってしまったりします。

これからはこういう深い話を前文で書く事にします。

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

<本文>

1.今週の予定

今週は以下の事を行います

  1. Particle Systemの勉強
  2. RPGの作成
    • スタート画面の続きで、魔女との会話を実装
    • 切符の実装方法
    • 駅における切符の購入の実装
    • 駅における移動の実装方法の検証
    • 実際に別なマップに移動してる間に別なアニメーションを表示する方法についての調査
    • Good Skyの復習

それでは始めます。

2.Niagaraの勉強

2.1 Unreal Engine Niagara Cloud Tutorial | Download Project Files [1] の勉強

先週、勉強したCGHOW氏のUnreal Engine Niagara Cloud Tutorial | Download Project Files [1]の残り半分をやります。

Materialとして使用しているM_CouldでOpacityの計算にDepth Fadeを追加します。

f:id:kazuhironagai77:20210808232038p:plain

Depth Fadeの機能は以下に示した2021-07-18のブログで勉強しました。

f:id:kazuhironagai77:20210808232053p:plain

しかし実際にDepth Fadeを付けなくても公式のDocumentのDepth Expression [2] の説明にあるような醜い線は見られません。

以下に示したのがDepth Expression有のMaterialを使用した場合です。

f:id:kazuhironagai77:20210808232109p:plain

こちらはDepth Expression無しのMaterialを使用した場合です。

f:id:kazuhironagai77:20210808232123p:plain

あんまり変わりませんよね。

公式のDocumentのDepth Expression [2] の説明には

f:id:kazuhironagai77:20210808232137p:plain

とありますが、この場合煙は、透明な物体に当たるのか不透明な物体に当たるのかが良く分かりません。

ひょっとすると透明な物体(ガラスのようなモノ)とこの煙が重なった時に、Depth Expression有無の違いが見られるのかもしれません。

ガラスの球体を設置してみました。

Depth Expression無しのMaterialを使用した場合です。

f:id:kazuhironagai77:20210808232200p:plain

Depth Expression有のMaterialを使用した場合です。

f:id:kazuhironagai77:20210808232215p:plain

あれ。ガラス越しの物質が見えやすい?

いやいや。これは単にScreenshotを取った時の角度の問題でしょう。でも心配なので一応角度を固定して確認してみます。

以下の様にガラス玉を配置しました。

f:id:kazuhironagai77:20210808232229p:plain

Depth Expression有のMaterialを使用した場合です。

f:id:kazuhironagai77:20210808232243p:plain

Depth Expression無しのMaterialを使用した場合です。

f:id:kazuhironagai77:20210808232257p:plain

うーん。どうなんでしょう。煙の濃さも影響しますので一概には言えないかもしれませんが、特別、ガラス越しの物質が見え易くは無いみたいです。

それでは本題のガラスと煙の境目はどうでしょうか?

Depth Expression有のMaterialでガラス球の部分を拡大した場合です。

f:id:kazuhironagai77:20210808232311p:plain

Depth Expression無しのMaterialでガラス球の部分を拡大した場合です。

f:id:kazuhironagai77:20210808232325p:plain

煙の濃さが同じではないので、一概には言えませんが、Depth Expression有のMaterialの方がガラス球の境界線が綺麗に出ているような気はします。

この後、tutorialではParticleのサイズやSpawn Rateなどの値を調整しますが、重要な個所ではないのでスキップします。

今度はこの雲にLightsを追加します。

まず、ES_Smokeをコピーして新しいNiagara Emitter を作成します。名前はES_Lightとしました。

f:id:kazuhironagai77:20210808232357p:plain

まずSprite RendererにセットされているMaterialをM_radial _Rampに変更します。

f:id:kazuhironagai77:20210808232414p:plain

Sub UVの値も元に戻します。

f:id:kazuhironagai77:20210808232429p:plain

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

f:id:kazuhironagai77:20210808232446p:plain

そしてSet Sub Image Index Moduleを外すと

f:id:kazuhironagai77:20210808232501p:plain

以下の様になりました。

f:id:kazuhironagai77:20210808232514p:plain

SizeやSpawn Rateなどを微調整しました。

f:id:kazuhironagai77:20210808232527p:plain

Niagara Systemに追加します。

f:id:kazuhironagai77:20210808232551p:plain

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

次にTutorialでは以下に示したNiagara Light Renderer PropertiesをLight EmitterのRenderに追加しています。

f:id:kazuhironagai77:20210808232629p:plain

その結果、2つのEmitterを使用しているCloud_Sysでは、以下の様に発光するようになりました。

f:id:kazuhironagai77:20210808232644p:plain

この機能は、今のVersionにおけるLight Rendererと同じです。Light RendererをES_Lightに追加します。

f:id:kazuhironagai77:20210808232659p:plain

その結果です。

f:id:kazuhironagai77:20210808232717p:plain

あれ?

光っていない。

Lighting Rendererの使用方法を間違えている?ちょっとLighting Rendererの復習をしますか?

2.2 Lighting Rendererの復習をする。

Lighting Rendererは公式のDocumentのCreate a Particle Light [3]で勉強しました。2021-05-24のブログに勉強した記録があります。

以下にその時に作成したNSのScreenshotを示します。

f:id:kazuhironagai77:20210808232746p:plain

床が赤く光っています。これがLighting Rendererの効果です。

ひょっとするとNS_SmokeのLighting Rendererも効果は出ているんですが良く見えていないだけかもしれません。

ES_LightのLighting Rendererの設定を以下の様に赤く光る様に変えてテストしてみます。

f:id:kazuhironagai77:20210808232800p:plain

更に光の無いLevelを新たに作成してそこでテストしました。

f:id:kazuhironagai77:20210808232816p:plain

床が赤くなっています。

と言う事はLighting Rendererは効いてはいるみたいです。

しかしTutorialでは以下に示した様に、雲自体が凄く光っています。

f:id:kazuhironagai77:20210808232835p:plain

色々試して、分かったんですがES_LightのLight Rendererで作成された光は煙に写らないんです。

f:id:kazuhironagai77:20210808232850p:plain

所が、Tutorialの雲にはLighting Emitter内でLight Rendererで作成された光は写っています。

うーん。

私がどこかでケアレスミス的な設定のミスをES_Smoke側でしていて雲に光が写らない可能性もありますが、Niagaraの仕様が変わっている可能性もあります。

ここはLighting Rendererが生成する光が雲に反射しない(もしくは雲が透過光の影響を表示しない)以上、撤退を考える必要があるかもしれませんね。

2.3 Unreal Engine Niagara Cloud Tutorial | Download Project Files [1] の勉強の続き

残念な結果に終わってしまいましたが、光が雲に対して反射しないならこれ以上進めても意味がないです。一応、tutorialは最後まで見る事にします。

最後まで見ましたが、この雲に対して光の反射が写るように出来れば同じEffectは作成出来そうです。

f:id:kazuhironagai77:20210808232912p:plain

2.4 SmokeにLighting Rendererの効果を写すには?

イキナリですが、これからのNiagaraの勉強で課題が生まれてしまいました。「SmokeにLighting Rendererの効果を写す方法を解明する」です。今は、まだどうやればこれが出来るのか不明ですが、いつかこの問題は解決したいです。

と思ったらUnreal Engine Niagara Cloud Tutorial | Download Project Files [1]のコメント欄で以下の様に書かれていました。

f:id:kazuhironagai77:20210808232948p:plain

これ見ればいいじゃんと思ったら

f:id:kazuhironagai77:20210808233003p:plain

有料でした。

流石にこの謎を解くためだけに10ドルは払えません。

UEのVFXの専門家になる訳ではないので、今回はFreeで勉強出来る範囲でCGHOW氏の動画で勉強させてもらう事にします。というか、こういう勉強ってお金払って答え教えてもらっても、本質は身に付かなかったりするのなので、回り道かもしれませんが自分で解答を探す事にします。

2.5 次のTutorialはどれをやるべきか?

CGHOW氏の動画を色々見たら、2020年以降に作成されたTutorialは今と同じNiagaraになっているみたいでした。2020年以降に作成されたTutorialで簡単そうなのを次は勉強します。

ちょっとだけ見たのですが、Nebula Effect | UE4 Niagara Nebula [4] は2020年以降に作成されている上に時間も短くて、今の私でも出来そうです。来週はこれを勉強する事にします。

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

3.Cascade:炎以外のEffectの実装

今回、雪のParticle systemを勉強する事にしました。

Dean Ashford氏のUE4 - Tutorial - Snow Particle System [5] を勉強する事にします。

3.1 先週、まとめ忘れていた事

先週、Unreal 4 Particles Tutorial - Simple Flame, Embers, Smoke. [6]を勉強して気が付いたんですが、本物そっくりの炎の作成にEmberやSmokeの存在が如何に大切かでした。

Designについては全く勉強した事ないので、Designerにとっては常識なのかもしれませんが、脇役の存在の大切さを知りました。

今まで、実際に使用されているParticle Systemを見ると、Effectが4つも5つもあるので、複雑過ぎて理解出来ませんでしたが、要するに主役と脇役を合わせて一つのParticle Systemに乗せていたわけです。

これから炎や雷などの実際にゲームで使用される形のEffectを勉強する訳ですが、この主役と脇役のEffectそれぞれについても注目して勉強しようと思います。

3.2 UE4 - Tutorial - Snow Particle System [5] の勉強

<Materialの作成>

まずはMaterialから作成します。Snow_Mとします。

f:id:kazuhironagai77:20210808233049p:plain

Blend ModeをTranslucentにしてParticle SystemからのInput が受け取れるようにParticle Colorを使用します。

f:id:kazuhironagai77:20210808233106p:plain

ここまでは一般的なParticle system用のMaterialの作成と同じなのでスキップしても良かったですが、Multiply ノードを作成する時にほとんどのTutorialでMを押して作成するんです。

その方法が分かりました。Mを押したまま、Mouseの左クリックをするとMultiply ノードが表示されます。

Multiply ノードのB側にはRadial Gradient Exponentialノードを繋げます。

このRadial Gradient Exponentialノードについてはあまり良く知りませんので、ちょっとここで調べる事にします。

<Radial Gradient Exponentialノードについて>

まずRadial Gradient Exponentialノードですが、検索するとGradientとMiscの2つに存在しています。

f:id:kazuhironagai77:20210808233125p:plain

ただしそれぞれからRadial Gradient Exponentialを作成してみると

f:id:kazuhironagai77:20210808233140p:plain

こんな感じで全く同じNodeの様です。

名前からですが、以下の様な円形のGradationを作成するためのNodeと推測されます。

f:id:kazuhironagai77:20210808233153p:plain

ただ使い方が分かりません。

いいTutorialを見つけました。Mathew Wadstein氏のWTF Is? Material: Radial Gradient Exponential in Unreal Engine 4 ( UE4 ) [7]です。これみて使い方を勉強しましょう。

f:id:kazuhironagai77:20210808233221p:plain

あれ、Radialの発音がRadioに聞こえます。ちょっと寄り道しますが、発音のチェックをします。

Radialの発音記号はˈreɪdiəl、Radio の発音記号はˈreɪdiˌoʊです。

əlの音はダークLに変化しているのでしょうか?

Lの発音の仕方で「舌を噛んで、アイウエオと言ってオと言った時の音がそう。」と言う話を聞いた事があったんですが、Radialのəlの音はオーにしか聞こえません。

一方でRadioの最後の音はoʊですね。2重母音のoʊです。日本語で書けば、オウが近いでしょうか。ただ最後の音はW に聞こえますね。英語に2つあるウの音のもう一方のであるuはアメリカ英語ではWが最後に混じるとは聞いていましたが、ʊもこうやってしっかり聞くとWが混じっていますね。もしくはoʊがouに変化しているのかもしれません。

Googleの発音記号を見るとRadialの発音は

f:id:kazuhironagai77:20210808233236p:plain

Radio の発音は

f:id:kazuhironagai77:20210808233250p:plain

となっています。この発音記号、IPAとの関連が良く分からないのですが、Googleで発音を検索すると必ず一番最初に表示されるので、参考にする事にします。UhlのUhですがアメリカ人は良くShort Uの音を表す時にUhと書きます。つまりʌの音です。アメリカ英語ではʌとəはストレスの有り無しの違いなのでIPA表記であるəと同じ音を表しているから結局IPAと同じ事を言っているみたいです。こっちの発音を何回も聞くとウールって言ってるように聞こえてきます。こっちの発音ではLの音がしっかり聞こえます。

もう一回、Mathew Wadstein氏のRadialの発音を聞くと確かに最後にLの音が聞こえます。Radioの場合は発音の最後にWの音が聞こえるのでそれで区別出来ますね。

はい。寄り道はお終いです。

Radial Gradient Exponentialの勉強に戻ります。

WTF Is? Material: Radial Gradient Exponential in Unreal Engine 4 ( UE4 ) [7]をみたら使い方、完全に分かりました。

気を付けないといけない点は

  • UVsの値を1以上にしてもtile状にはならない。
  • Invert DensityにするとDensityの値は白さが基準から黒さが基準に変わる

位でしょうか。

UE4 - Tutorial - Snow Particle System [5]では結局、以下の様に実装しました。

f:id:kazuhironagai77:20210808233313p:plain

<Materialの作成の続き>

Opacityを以下の方法で指定します。

f:id:kazuhironagai77:20210808233332p:plain

Particle Colorのαが1ならば、以下の〇の白い部分がそのまま表示されて、黒い部分は透明になります。

f:id:kazuhironagai77:20210808233356p:plain

Particle Colorのαが0ならば全部透明になります。

<Particle Systemの作成>

Snow_Pと名付けます。

f:id:kazuhironagai77:20210808233414p:plain

Required ModuleのMaterialに先程作成したSnow_Mをセットします。

f:id:kazuhironagai77:20210808233428p:plain

次にType Dataの設定をGPU Spriteに変更します。

f:id:kazuhironagai77:20210808233442p:plain

Spawn Rateを5000にします。

f:id:kazuhironagai77:20210808233455p:plain

Life Timeの値を以下の様にします。

f:id:kazuhironagai77:20210808233509p:plain

Particle のサイズも変更します。

f:id:kazuhironagai77:20210808233522p:plain

Initial Velocityも変更します。

f:id:kazuhironagai77:20210808233535p:plain

こんな感じです。

f:id:kazuhironagai77:20210808233548p:plain

コーン状に雪が降るのはおかしいです。それを直すためにInitial Location Moduleを追加します。

Initial Location Moduleの設定は以下の通りです。

f:id:kazuhironagai77:20210808233602p:plain

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

f:id:kazuhironagai77:20210808233636p:plain

この時点でかなり雪です。

Initial Rotation Moduleを追加します。

f:id:kazuhironagai77:20210808233650p:plain

設定は以下の通りです。

f:id:kazuhironagai77:20210808233704p:plain

ここは良く分かりませんね。Max値が1で180°の回転じゃなかったんでしょうか?

公式DocumentであるRotation Modules [8] によるとInitial Rotation ModuleのStart Rotationは

f:id:kazuhironagai77:20210808233719p:plain

となっていました。

つまり、1は180°ではなく360°でした。

にしても10に設定する意味があるんでしょうか?

良く分からないです。

今度はInitial Rotation Rate Moduleを追加します。

f:id:kazuhironagai77:20210808233741p:plain

こっちは常に回転する、つまり回転/Sを決めるModuleなはずです。

値はDefault値のままでした。

今度はCollision Moduleを追加します。

f:id:kazuhironagai77:20210808233757p:plain

Responseの設定をKillにします。

f:id:kazuhironagai77:20210808233809p:plain

これで雪が地面に落ちた時に溶けてなくなる現象が再現出来るはずです。

最後にBoundをセットします。

f:id:kazuhironagai77:20210808233822p:plain

この機能は良く分かりません。後で調べます。

テストします。

f:id:kazuhironagai77:20210808233836p:plain

f:id:kazuhironagai77:20210808233845p:plain

雪には見えませんが、なんか降っている感じはします。この時点ではかなりいい感じです。

Tutorialだとblurred(ぼんやりしている)と表現されています。

これからそれを直すそうです。

<Particle Systemの改善>

MaterialのEmissive ColorにConstant Nodeを追加します。

f:id:kazuhironagai77:20210808233906p:plain

値は1にします。

更にOpacityの計算方法を以下の実装に変更しました。

f:id:kazuhironagai77:20210808233919p:plain

これは何をやっているんでしょうか?

ここはMaterialの分野なので、後で時間があったら検討します。

結果をみます。

f:id:kazuhironagai77:20210808233933p:plain

確かに雪がはっきり見えます。

<Emitterの追加>

Material、Snow_Unlit_MをSnow_MをDuplicateする事で作成します。

f:id:kazuhironagai77:20210808233950p:plain

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

f:id:kazuhironagai77:20210808234003p:plain

Base Colorにつないでいた線をEmissive Colorにつなぎ直します。

f:id:kazuhironagai77:20210808234100p:plain

Snow_PのParticle EmitterをDuplicateして

f:id:kazuhironagai77:20210808234114p:plain

新しく作成した方のEmitterに先程作成したMaterialであるSnow_Unlit_Mをセットします。

f:id:kazuhironagai77:20210808234127p:plain

こんな結果になりました。

f:id:kazuhironagai77:20210808234141p:plain

確かに真っ白な雪と灰色の雪が見えます。かなり雪っぽくなって来ました。

今度はSnow Flakeのイラストを使用します。

ないので自分で作りました。

f:id:kazuhironagai77:20210808234156p:plain

あんまり雪っぽく見えませんがまあしょうがないです。

このTexture用のMaterialを作成します。

Snow_MをDuplicateします。名前はSnowflake_Mとします。

Radial Gradient Exponentialノードを外して代わりに先程のTextureを使用します。

f:id:kazuhironagai77:20210808234210p:plain

こんな感じです。

Snow_PのParticle EmitterをDuplicateして、新しく作成したEmitterのMaterialにSnowflake_Mをセットします。

テストします。

f:id:kazuhironagai77:20210808234224p:plain

これはかなり雪っぽくなりました。

雪の結晶そのものが見えるからと言うよりは、角ばった雪が降って来る感じです。それが雪らしさを強調しています。

雪なんでよく見てないので気が付かなかったですが、丸いだけじゃなくて色々な形状があるみたいですね。

これで終わりかと思ったらまだEmitterを追加します。

今度はSnowflake_MをDuplicateしてUnlitのVersionを作成します。名前はSnowflakeUnlit_Mです。

やり方はSnow_MからSnowUnlit_Mを作成した時と同じです。

このMaterialを新らしくDuplicateしたEmitterのMaterialにセットします。

結果です。

f:id:kazuhironagai77:20210808234239p:plain

かなり雪です。

この後でTutorialでは雪の色を調節していますが、それはまあいいでしょう。

出来ました。

3.3 UE4 - Tutorial - Snow Particle System [5] のまとめ

このTutorialを勉強する前までは、どうやって雪を作成しているのか不思議でしたが、勉強したら何の事はない、単にParticleをGPUで大量に作成して空から降らしているだけでした。

ただしここでも脇役というか4種類のSpriteを作成して、微妙なSpriteの変化が雪質をリアルにしています。

やはり、VFXの質を決めるのは、沢山の脇役のEffectの存在ですよ。

炎を、炎足らしめるのは、Frameの存在だけでは足りず、その脇を舞うEmberや、煙の存在だったし、今回の雪のEffectも微妙に色や形の違う雪質の存在が雪を雪足らしめています。

それを踏まえた上で、更に今回、良いEffectを作成するのに大切だと思う事をここにまとめます。

<良いMaterialの作成>

良いEffectは良いMaterialからしか作れない。体感ですが、Effectの成果の30%位は、Materialに依存しています。

ただしMaterialの作成では、複雑な計算からTextureを作成しているが、本当に単純にTextureを読み込むより総合的に言って得なのか?この辺をキチンと評価する手段は確立されているのか?は不明で、もっとTextureを使用した方が質の高いEffectを作成するためのMaterialが作成出来る様な気がします。

まだMaterialについては、本格的に勉強した事はないので、その辺はMaterialを勉強する時に調査します。

3.4 GPUとBoundについて

これについては来週調べます。

3.5 Opacityの計算方法について

UE4 - Tutorial - Snow Particle System [5]のOpacityの計算については時間がある時に勉強します。

f:id:kazuhironagai77:20210808234348p:plain

4.スタート画面の続きで、魔女との会話を実装

まず、赤い帽子の魔女のWidgetを作成します。

今回は、世界観とかは置いておいて、金の切符を探す事がこのゲームの目的である事、のみをPlayerは赤い帽子の魔女から聞かされます。

4.1 Widgetの作成

BGIは以下の様にしました。

f:id:kazuhironagai77:20210808234416p:plain

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

f:id:kazuhironagai77:20210808234430p:plain

NPCWidgetを参考にしますが、一から作成します。名前はTalk with Witchにしました。

まだ実装は一切していませんが、Start screenから開ける様にします。

f:id:kazuhironagai77:20210808234501p:plain

あれ。文字がはみ出ています。

WrappingのAuto Wrap TextにチェックすればTextははみ出ないはずですが...。

試しにWrapping PolicyをAllow Per Character Wrappingに変えてみます。

f:id:kazuhironagai77:20210808234514p:plain

直りました。

f:id:kazuhironagai77:20210808234527p:plain

なんで?

Allow Per Character Wrappingってどういう意味なの?と思って調べたら

f:id:kazuhironagai77:20210808234541p:plain

と書かれていました。

同然でした。一wordとして認識されていたわけです。

テスト用のTextをその辺からコピペしました。

勿論、Wrapping Policyは

f:id:kazuhironagai77:20210808234556p:plain

に直しました。

f:id:kazuhironagai77:20210808234611p:plain

はい。出来ています。

日本語の場合も念のためにテストします。

f:id:kazuhironagai77:20210808234627p:plain

大丈夫ですね。

スタートボタンの機能も追加します。

f:id:kazuhironagai77:20210808234640p:plain

テストします。

f:id:kazuhironagai77:20210808234654p:plain

出来てます。

4.2 会話のData Tableの作成

会話のData Tableの型はNPCの時と同じくNPC_ConversationBaseを使用します。

以下の会話を作成しました。

f:id:kazuhironagai77:20210808234710p:plain

最後のYES、NOは表示されないセリフで、YESならば、ゲーム開始のボタンが表示され、NOならゲームが終了します。

このセリフを先程のWidgetに表示されるようにしましょう。

この辺はこんなに複雑になると思っていなかったので、先週、コードの実装方法についての下調べをしていませんでした。

今から勉強し直します。

NPC用のWidgetを開きます。

f:id:kazuhironagai77:20210808234724p:plain

まずはセリフが表示されるテキストの実装をみます。

以下の様になっています。

f:id:kazuhironagai77:20210808234738p:plain

Comment 変数にData Tableから読み取ったセリフがセットされているはずです。それをMake Literal Text() 関数が何かをしています。

f:id:kazuhironagai77:20210808234753p:plain

公式のDocumentにMake Literal Text [9] がありました。

f:id:kazuhironagai77:20210808234815p:plain

いやいや、そのLiteralの意味が分からないんです。

Mathew Wadstein 氏のWTF Is? Make Literal in Unreal Engine 4 ( UE4 ) [10] に簡単な解説がありました。

Mathew Wadstein 氏の説明は明快です。

例えば以下の例のようにあるArrayがある要素を保持しているのかどうかをContains()関数を使用して調べたい時があるとします。

f:id:kazuhironagai77:20210808234830p:plain

普通は上記の様にString の変数を作成してその変数に調べたい要素を保持さます。

しかしこのためだけに、あえて一個の変数を作成するのはコードのスパゲッティ化を促しかねません。

それを防ぐのがMake Literal関数です。

以下の様にMake Literal関数(この場合はMake Literal String関数)を使用する事で新たな変数の作成を避ける事が出来ます。

f:id:kazuhironagai77:20210808234856p:plain

なるほど。

と言う事はやっぱり要らない?

ひょっとしてですが、参考にした元のコードは以下の様な実装だったんじゃないでしょうか?

f:id:kazuhironagai77:20210808234911p:plain

これなら一個変数を減らせます。

次のノードはFormat Textです。

f:id:kazuhironagai77:20210808234925p:plain

このノードの機能は覚えています。

Data Tableで行替えに使用している、

f:id:kazuhironagai77:20210808234939p:plain

{next line}をInput変数に保持されている値に変換します。勿論Input変数には行替えの値が保持されています。

Talk with Witchウィジェット内の魔女のセリフ表示用のTextには以下の実装をしました。

f:id:kazuhironagai77:20210808234953p:plain

これで問題が在る場合は、NPCのセリフ表示用のTextの実装と同じにします。

今度は、Dialogue変数に適切なセリフをData Tableから読み取るための実装を作成します。

しかしそのためには最初にNPCWidgetを見てどのように実装しているのか確認する必要があります。

最初からCustom Eventを読んで終わりです。

f:id:kazuhironagai77:20210808235007p:plain

これは、Widgetを作成された時以外もこの実装を呼ぶ必要があるからです。勿論それは、回答ボタンを押した時です。

それでは作成されたCustom EventであるConversation Startの実装を一個ずつ見て行きます。

f:id:kazuhironagai77:20210808235022p:plain

これは村によってセリフが変わる為にどの村の住人か確認しています。

f:id:kazuhironagai77:20210808235034p:plain

今回のTalk with Witchウィジェットとは関係ないです。ので次に行きます。

関係ないノードは飛ばす事にします。

Get Data Table Row Namesノードを使用してData Tableに存在するRow Nameを全て抜き出します。

f:id:kazuhironagai77:20210808235233p:plain

変数、Comment Numberの値、Defaultでは0、に対応するセリフとその回答ボタン用のセリフを抜き出します。

f:id:kazuhironagai77:20210808235247p:plain

はい。それぞれの返り値をそれぞれの変数にセットします。

f:id:kazuhironagai77:20210808235305p:plain

回答用のボタンのテキストを専用のボタンにセットします。

f:id:kazuhironagai77:20210808235320p:plain

復習してて思い出しましたが、最近この部分の実装を勉強してました。完璧に思い出しました。

それではTalk with Witchウィジェットにおけるこの部分の実装を作成します。

f:id:kazuhironagai77:20210808235336p:plain

f:id:kazuhironagai77:20210808235341p:plain

まだ回答ボタンを作成していないのでその部分は空白です。

この時点でテストします。

f:id:kazuhironagai77:20210808235408p:plain

あれ。Next Lineが作用してません。

直します。

f:id:kazuhironagai77:20210808235436p:plain

Format Textノードでnextlineの指定を忘れていました。

f:id:kazuhironagai77:20210808235452p:plain

出来ました。

今度は回答ボタンのwidgetを作成します。

最初はNPCの回答ボタンを参考にします。

デザインはこんな感じです。

f:id:kazuhironagai77:20210808235507p:plain

f:id:kazuhironagai77:20210808235513p:plain

Canvas Panelは無いですね。

Graph側を見ます。

変数は4つあります。

f:id:kazuhironagai77:20210808235542p:plain

この内の二つの変数、Parent WidgetとAnswer Commentは

f:id:kazuhironagai77:20210808235555p:plain

Widgetを作成する時に、値がPassされています。

f:id:kazuhironagai77:20210808235610p:plain

ボタンに表示されるTextは以下の実装で行っています。

f:id:kazuhironagai77:20210808235625p:plain

最後にボタンがクリックされた時の実装です。

f:id:kazuhironagai77:20210808235652p:plain

Answer Comment変数にセットされている整数をParent WidgetのComment Numberにパスします。

その後、回答ボタンが表示されているParent WidgetのVertex Box内のChildren(つまり回答ボタン)を全部消します。

最後に、Parent WidgetのEvent 、Conversation Startを開始します。

はい。

分かりました。

それでは、Talk with Witchウィジェット用の回答ボタンを作成します。

名前はAnswer Button Witchとしました。

デザインは全く同じです。

f:id:kazuhironagai77:20210808235719p:plain

作成した変数です。

f:id:kazuhironagai77:20210808235732p:plain

NPCの回答ボタンにあった、Comment Numberは使用していないので作成しませんでした。

変数、Parent WidgetとAnswer Buttonの値はWidget作成時にパスされます。

f:id:kazuhironagai77:20210808235744p:plain

Button内のTextは以下の方法で実装しました。

f:id:kazuhironagai77:20210808235757p:plain

回答ボタンを押された時の実装は以下の通りです。

f:id:kazuhironagai77:20210808235812p:plain

実装の内容はNPCの回答ボタンの時と全く同じです。

それではテストします。

f:id:kazuhironagai77:20210808235841p:plain

ボタンが少しはみ出しています。微調整します。

f:id:kazuhironagai77:20210808235855p:plain

イキナリ全部一辺に表示されるので何処から呼んでいいのか分かりません。

やっぱりタイプライター効果が欲しいです。

後、回答ボタンは少し遅れて表示されるか、回答ボタンである事がPlayerに分かる仕組みにしないと読みにくいです。

この部分は後で考えます。

f:id:kazuhironagai77:20210808235910p:plain

この回答に対する実装をします。

「分かりました。やってみます。」を選択した場合は、下に「ゲームを始める」のボタンが表示されます。「残念ですが、他を当たってください。」を選んだ場合はゲームが終了します。

まず、「ゲームを始める」ボタンは既に表示されていますので、それを消します。

以下の実装で消しました。

f:id:kazuhironagai77:20210808235943p:plain

「分かりました。やってみます。」を選択した場合、data TableはYESを返します。また「残念ですが、他を当たってください。」を選んだ場合は、Data TableはNOを返します。

f:id:kazuhironagai77:20210809000011p:plain

Switchを使用してData TableがYES、またはNOを返した時の対応を追加します。それ以外のTEXTをData Tableが返した時はいつもと同じ実装です。

テストします。

「分かりました。やってみます。」を選択した場合です。

f:id:kazuhironagai77:20210809000033p:plain

出来てます。ボタンが表示されました。

「残念ですが、他を当たってください。」を選びました。

ゲームが終了しました。

出来ています。

一応、これで完成です。

4.3 魔女との会話を実装のまとめ

思ったよりも時間がかかってしまいました。最初の予定では30分位で完成出来ると思っていましたが、全然そんな事なかったです。

UIはもっと見やすく出来るはずです。しかしどうすればいいのか分かりません。

後、魔女の登場シーンもアニメーションか何かがあると分かり易いですね。もう少し改良が必要ですが今週はここまでです。

5.駅の実装

5.1 切符の作成

切符は駅で買えるようにします。

まず、切符の絵を作成します。

f:id:kazuhironagai77:20210809000108p:plain

出来ました。

切符のData Tableを別に作成します。

f:id:kazuhironagai77:20210809000122p:plain

うーん。この設定方法だと、売り買い出来てしまいますね。

Itemや切符のデータの整理方法についても考える必要がありますね。

5.2 切符の実装方法について

切符の実装方法についてって一体何の事なのかすっかり忘れてしまったんですが思い出しました。

以下の事について検討する必要があります。

  • Itemとして保持するのか?別なArrayを作成するのか?
  • 駅で使用する時の実装について
  • 戦闘中にItemとして使用した場合

これらの事は何となくですが既に検討していますね。戦闘中の切符の使用方法についての検討は考える必要があります。がそれも後で良いでしょう。それよりも駅の製作です。駅を作って行きます。

5.3 駅の実装

当然ですが、今Warpに使用してるBP、A_WarpGateKeeperを改良して作成します。

f:id:kazuhironagai77:20210809000156p:plain

名前はGalaxy Train Stationにします。

銀河鉄道の英訳ってGalaxy Railroadになってるんですけど、あんまりRailroadにピンと来ません。

でも鉄道の駅はRailroad stationって言い方もしていますね。Train Stationと言う言い方も勿論ありましたが。

f:id:kazuhironagai77:20210809000231p:plain

まずは駅員に話しかけた時に開くWidgetを作成します。

そう言えばWidgetの発音もwɪʤɪtなのでカタカナで書くならばウィジェットではなくてウィヂェットですね。発音を正確に聞くとウィヂェットというよりウィヂュィトって感じですね。

因みにʒの音とʤの音はLとR以上に日本人の苦手とする音で、日本語表記でジとヂがあるから簡単に区別つけられると思っていると結構足元をすくわれます。私も聞き分けは出来てないですし、あんまり発音も自信が無いです。

言語学者によると日本語表記におけるジとヂの違いは音から来てるものではないからで、例えばじじいと言うときの発音は実際は、ぢじいと発音してるらしいです。

言われてみるとそんな気がします。確かにじじいの最初のジはヂに聞こえます。

で、ウィジェットをウィヂュィトと書いても誰も理解出来ないので、これからはウィジェットと言う言葉は使用せずに、Widgetを使用します。

後、私はWidget BPの事をWidgetと読んでいますが、Widgetの正確な定義はWidget BP内で使用している以下のパーツの事を指しているはずです。

f:id:kazuhironagai77:20210809000245p:plain

でもUE4

f:id:kazuhironagai77:20210809000258p:plain

と言っていますしあんまり厳密じゃないのかもしれません。

こんな感じにして見ました。

f:id:kazuhironagai77:20210809000325p:plain

試しに開くとこんな感じです。

f:id:kazuhironagai77:20210809000338p:plain

良いですね。

Third Person CharacterのBPはIn Warp Gate Keeperをそのまま使用させてもらいます。

f:id:kazuhironagai77:20210809000356p:plain

<「駅から出る」ボタンの実装>

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

f:id:kazuhironagai77:20210809000413p:plain

特にコメントもありません。

テストします。

f:id:kazuhironagai77:20210809000427p:plain

普通に戻れました。

<「銀河鉄道に乗る」ボタンの実装>

これはW_WarpGate Widgetを開いてW_WarpGate Widgetに全部任せる事にします。

f:id:kazuhironagai77:20210809000446p:plain

テストします。

普通に開けました。

f:id:kazuhironagai77:20210809000459p:plain

「ワープします。」をクリックします。

f:id:kazuhironagai77:20210809000515p:plain

出来ました。

セリフに問題があるので直します。

NPC_Parent WidgetNPC Warp Gate Keeper変数のセリフを以下の様に変更します。

f:id:kazuhironagai77:20210809000527p:plain

そしてW_WarpGate WidgetのTextの表示を以下の様にします。

f:id:kazuhironagai77:20210809000540p:plain

テストします。

f:id:kazuhironagai77:20210809000602p:plain

f:id:kazuhironagai77:20210809000609p:plain

出来ていますね。

6.駅における切符の購入の実装

はい。ここからが今週の本番です。先週、道具屋の所で散々調べたので実装方法は理解しているはずです。

6.1 Widgetの作成

まずデザインです。

f:id:kazuhironagai77:20210809000632p:plain

Playerの所持金と所持しているItemを表示する実装は簡単なのでここでやってしまいます。

Playerの所持金を表示する実装です。

f:id:kazuhironagai77:20210809000645p:plain

所持しているItemを表示する実装は以下の通りです。

f:id:kazuhironagai77:20210809000658p:plain

テストします。

f:id:kazuhironagai77:20210809000712p:plain

出来ていますね。

6.2 購入出来る切符の表示

次に切符を表示するためのWidgetを作成します。

先週復習した道具屋の実装を参考にして切符購入用のボタンを作成しました。Ticketと名付けました。

f:id:kazuhironagai77:20210809000730p:plain

Ticket Widget内の機能は後から実装します。

W_BuyTicket Widget内で購入出来る切符を表示するための実装です。

f:id:kazuhironagai77:20210809000745p:plain

テストします。

f:id:kazuhironagai77:20210809000800p:plain

はい。出来ています。

6.3 切符ボタンにcursorを合した時にその切符を解説するWidgetが表示さえる機能の実装

はい。

<切符を解説するWidgetの作成>

名前はDisplay Ticket Imageです。

Designは以下の通りです。

f:id:kazuhironagai77:20210809000857p:plain

TicketのImageを表示する実装です。

f:id:kazuhironagai77:20210809000912p:plain

はい。

これ以外は普通の実装なので記録は省略します。

<Display Ticket Imageを表示する機能の実装>

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

f:id:kazuhironagai77:20210809000930p:plain

Ticketを購入した時にもDisplay Ticket Image Widgetは消さないといけないのでCustom Event、Remove Display Ticket Image Widgetを作成し、そこに実装しました。

テストします。

f:id:kazuhironagai77:20210809000946p:plain

はい。Cursorを普通の切符に重ねると普通の切符のDisplay Ticket Image Widgetが表示されています。

勿論、Cursorを退かせばDisplay Ticket Image Widgetは消えます。

f:id:kazuhironagai77:20210809001009p:plain

出来ています。

6.4 切符の購入の実装

それでは切符の購入の実装を行います。

f:id:kazuhironagai77:20210809001026p:plain

一個ずつ実装内容を説明します。

まずticketの名前がData Table、Ticketsにあるか調べます。

f:id:kazuhironagai77:20210809001043p:plain

当然あるはずですが、ItemはEnumで管理していないので念のためにしています。

次はその切符を買えるお金を持っているかチェックします。

f:id:kazuhironagai77:20210809001057p:plain

持っていない場合は何も起きません。持っている場合は、所持金から切符代が引かれます。

f:id:kazuhironagai77:20210809001126p:plain

そして買った切符が、所持品として追加されます。

f:id:kazuhironagai77:20210809001139p:plain

買った切符がW_BuyTickets Widgetの左側の道具袋の欄にも表示されるようにします。

f:id:kazuhironagai77:20210809001159p:plain

以上です。

テストします。

所持金が金貨100しかないので、切符の切れ端を買います。

f:id:kazuhironagai77:20210809001221p:plain

買えました。

あれ?

戻るボタンがありません。追加します。

f:id:kazuhironagai77:20210809001240p:plain

実装は以下のようにしました。

f:id:kazuhironagai77:20210809001253p:plain

テストします。

切符の切れ端を買いました。

f:id:kazuhironagai77:20210809001309p:plain

戻るボタンを押します。

f:id:kazuhironagai77:20210809001323p:plain

「駅から出る」を押します。

f:id:kazuhironagai77:20210809001349p:plain

出れました。

f:id:kazuhironagai77:20210809001403p:plain

道具袋を開いて見ます。

先程購入した切符の切れ端がありました。

今度は、駅から出るボタンを押さずに「銀河鉄道に乗る」を押します。

f:id:kazuhironagai77:20210809001416p:plain

普通に乗れますね。

出来ていますね。

7.駅における移動の実装方法の検証

7.1 切符を徴収する機能を追加

これは、銀河鉄道に乗る前に、切符を徴収する機能を追加するためにはどうしたら良いのかを検証しておく。と言いたかったんです。

簡単なAlgorithmを以下にまとめます。

  • 切符があるかどうかの確認。
  • 切符が無い場合
    • 「必要な切符を持って言いません。」と連絡して前の画面に戻る。
  • 切符が在る場合
    • 切符を一枚減らす。
    • 移動する。

こんなもんですね。

それではそれぞれのAlgorithmを実装するために必要なnodeを検討しましょう。

切符があるかどうかの確認

一番簡単な方法は、Playerが所持しているItemの名前をチェックする事です。

もしItemの名前の一部に切符があるかどうかは以下のノードでチェック出来ます。

f:id:kazuhironagai77:20210809001454p:plain

所持しているItemに普通の切符があるかどうかのチェックは以下の方法で出来ます。

f:id:kazuhironagai77:20210809001510p:plain

前の画面に戻る方法

これは、W_BuyTicket Widgetの戻るボタンで実装した方法と全く同じで良いはずです。

f:id:kazuhironagai77:20210809001531p:plain

<切符を一枚減らす>

公式DocumentのArray Nodes [11] に詳しい解説がありますが、

f:id:kazuhironagai77:20210809001549p:plain

で行けそうです。これって同じ名前のItemを全部消してしまうと思っていたんですが、Array Nodes [11] に以下の様な解説がありました。

f:id:kazuhironagai77:20210809001602p:plain

多分このnodeで大丈夫でしょう。

<移動する>

現時点での移動は以下の実装で行っています。

f:id:kazuhironagai77:20210809001626p:plain

これは一個のmapに一個の駅しかないから可能な方法です。いずれ一個のマップ内に沢山の駅を配置する事になります。

将来的にはRPG Game Instance BPに新しい変数を作成してどの駅に到着するのかを指定する必要があります。新しいmapを開いたらその駅名を元にPlayer の操作するキャラをSpawnさせる場所を決めます。

もう時間が無くなってしまいました。今週はここまでとします。

8.実際に別なマップに移動してる間に別なアニメーションを表示する方法についての調査

来週、調査します。

9.Good Skyの復習

これも来週以降になってしまいました。

10.まとめと感想

今週は以下の事についてやりました。

10.1 Particle Systemの勉強

Niagara の勉強>

CGHOW氏のUnreal Engine Niagara Cloud Tutorial | Download Project Files [1]の残り半分をやりました。残念ながら私の作成した雲はLight Renderingの光を反射しませんでした。光を反射する雲の作成方法はこれから検討していきます。

Cascade の勉強>

雪のParticle systemの作成方法を勉強しました。具体的にはDean Ashford氏のUE4 - Tutorial - Snow Particle System [5] を勉強しました。

炎のEffectを作成した時もそうでしたが、沢山のEmitterを使用する事で主役と脇役のEffectを作成すると本物っぽくなります。

Effectが本物っぽいかどうかの30%くらいは、Materialにかかって来ると思いました。良いMaterialの作成は良いEffectの作成にとって必須です。

10.2 RPGの作成の続き

<スタート画面の続きで、魔女との会話を実装>

スタート画面の続きで、魔女との会話を実装しました。こんなの直ぐに作成出来ると思っていたら結構時間がかかりました。

会話が唐突な感じがします。推敲が必要と感じました。

<駅の実装>

Warp Gateを改良して駅を作成しました。駅では、

  • 銀河鉄道に乗って別なMapに移動
  • 切符の購入

が出来るようにしました。

10.3  来週の予定

来週は以下の事をやる予定です。

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

をやる予定です。

 11. 参照(Reference

[1] CGHOW. (2019, March 2). Unreal Engine Niagara Cloud Tutorial | Download Project Files [Video]. YouTube. https://www.youtube.com/watch?v=hDfKZh1tRmU&list=PLwMiBtF6WzsqC7_cJmD26ts0YDbtPCCfe&index=2

[2] Epic Games. (n.d.-b). Depth Expressions. Unreal Engine Documentation. Retrieved August 8, 2021, from https://docs.unrealengine.com/4.26/en-US/RenderingAndGraphics/Materials/ExpressionReference/Depth/#depthfade

[3] Epic Games. (n.d.-a). Create a Particle Light. Unreal Engine Documentation. Retrieved August 8, 2021, from https://docs.unrealengine.com/4.26/en-US/RenderingAndGraphics/Niagara/HowTo/ParticleLights/

[4] 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=8

[5] Ashford, D. [Dean Ashford]. (2017, January 18). UE4 - Tutorial - Snow Particle System [Video]. YouTube. https://www.youtube.com/watch?v=sw1HAmAnYFQ

[6] Game Dev Society BU. (2019, March 14). Unreal 4 Particles Tutorial - Simple Flame, Embers, Smoke. [Video]. YouTube. https://www.youtube.com/watch?v=u7hRDl2yQmM

[7] Wadstein, M. [Mathew Wadstein]. (2016b, May 23). WTF Is? Material: Radial Gradient Exponential in Unreal Engine 4 ( UE4 ) [Video]. YouTube. https://www.youtube.com/watch?v=0xNFriRv-Bc

[8] Epic Games. (n.d.-d). Rotation Modules. Unreal Engine Documentation. Retrieved August 8, 2021, from https://docs.unrealengine.com/4.26/en-US/RenderingAndGraphics/ParticleSystems/Reference/Modules/Rotation/

[9] Epic Games. (n.d.-c). Make Literal Text. Unreal Engine Documentation. Retrieved August 8, 2021, from https://docs.unrealengine.com/4.26/en-US/BlueprintAPI/Utilities/Text/MakeLiteralText/

[10] Wadstein, M. [Mathew Wadstein]. (2016a, April 25). WTF Is? Make Literal in Unreal Engine 4 ( UE4 ) [Video]. YouTube. https://www.youtube.com/watch?v=vuZuTpPIJU4

[11] Epic Games. (n.d.-a). Array Nodes. Unreal Engine Documentation. Retrieved August 8, 2021, from https://docs.unrealengine.com/4.26/en-US/ProgrammingAndScripting/Blueprints/UserGuide/Arrays/ArrayNodes/