UE4の勉強記録

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

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

f:id:kazuhironagai77:20210711205519p:plain

<前文>

2021-06-27のブログの前文でɑの音がアーに聞こえる単語とオーに聞こえる単語があると話しました。

私にはどうしてもこの音が同じ音には聞こえません。しかし同じ事を言っている人は一人も見つかりません。これはノイローゼになってしまったのかなとも思いましたが、確認する方法を思い付ました。

それは唇の形を見る事です。

アメリカ英語のɑの音は以下のVowel Chart [1]によると

f:id:kazuhironagai77:20210711205553p:plain

右下の唇を丸めない音です。ɑの音は唇を丸めて発音する事でɒの音(いわゆるオーの音)に変化します。

Vowel Chart [1]には一般的なアメリカ英語のVowel Chartも載っていてそれによると

f:id:kazuhironagai77:20210711205613p:plain

唇を丸めて発音するɑの音、つまりɒの音はありません。

更にCot–caught mergerが起こるとこのɑの音とɔの音がɑの音になってɔの音も無くなります。つまりオの音が無くなる訳です。上の図だと元から消えていますね。ただし二重母音(diphthong)のoʊは有りますのでオウの音はあります。上の図のOはoʊを表しているのかそれとも単独でoの音があるとしているのかちょっと分かりません。

で、思い付いたんですが、この「アメリカ英語にはɒの音がない」と言うのが怪しいのではないのかと。

だったらɑの音の単語を発音している時の唇を見れば区別がつくんじゃないのか。と閃きました。

そこでyouglish [2]の出番ですよ。

October (ɑkˈtoʊbər)で調べて見ました。

このɑの音、私にはオにしか聞こえません。

f:id:kazuhironagai77:20210711205639p:plain

0.5倍速にしてOの発音が聞こえた時に一時停止して唇の形が見えるものを切り抜きました。

はい。唇が完全に丸くなっています。

やっぱり、と思ったんですが、ˈtoʊの発音の口の形をしている可能性もあります。一時停止するのが遅すぎたらˈtoʊの口になってしまうからです。

後、10人くらいのOctoberの発音を聞いたのですが、その内の2人はアクト―バーとはっきりとアと発音している人がいました。残りの人は少なくとも私にはオクト―バーと聞こえました。

Octoberはɑの音の直ぐ後にtoʊの発音が続くのでもっと調べやすい単語に変更します。

Sorry (ˈsɑri)にしました。これならスの音が聞こえた瞬間に一時停止すれば唇の形をはっきり見る事が出来ます。

f:id:kazuhironagai77:20210711205715p:plain

うーん。Octoberほどはっきりしていませんが、やや丸くなっている気はします。

Fatherのɑの音は少なくとも私にはアにしか聞こえませんので比較対象としてFather(ˈfɑðər)の唇の形を見てみました。

f:id:kazuhironagai77:20210711205753p:plain

まったく唇を丸めていませんね。

この結果だけ見ると、やっぱりアメリカ英語のɑの音は単語によってはかなりɒの音に近づいていると考えられます。と言うかやっぱりアメリカ英語にもɒの音はあるんじゃないでしょうか。

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

<本文>

1.今週の予定

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

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

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

2. Niagaraの勉強の続き

公式のDocumentであるNiagara Visual Effects

Niagara Visual Effects | Unreal Engine Documentation [3]を見ると

f:id:kazuhironagai77:20210711205907p:plain

GuideにCreate a Beam Effect in NiagaraRibbonとは別にありました。

今週はこれを勉強します。もしこのDocumentが短くて何も新しく勉強する所がない場合、Smokeのdocumentでもやる事にします。

2.1 Create a Beam Effect in Niagara [4]を勉強する

注目すべき点としては

  • CascadeBeamにおけるSheetInterpolation Pointのパラメーターがどうやって実装されているか。
  • Niagara SystemBeamRibbon Renderingを使用します。しかし実際のBeam Renderingはどのように行われているのでしょうか?CascadeBeamと同じなのでしょうか?それともRibbon と同じなのでしょうか?
  • CascadeBeamは起点となる最初の面は常にカメラ側を向いています。Niagara Beamはどうなんでしょうか?
  • CascadeBeamは起点が常に画面から見て前になるようにRenderingされます。これってバグだと思っています。NiagaraBeamはどうなんでしょうか?

などがあります。これらの点に注意して勉強していきます。

このdocumentではStatic BeamをTemplateに使用していますね。

f:id:kazuhironagai77:20210711210119p:plain

この時点でもう50%くらい完成していますよね。

<Change Renderer Settings

Ribbon Renderer Moduleのparameterを弄っていきます。

f:id:kazuhironagai77:20210711210141p:plain

Curve Tensionは何を管理するParameterなんでしょうか?

f:id:kazuhironagai77:20210711210207p:plain

と書かれています。

0の時です。

f:id:kazuhironagai77:20210711210223p:plain

1の時です。

f:id:kazuhironagai77:20210711210238p:plain

Beamが細くなっていると言えばなっていますね。でも良く分かりませんね。

f:id:kazuhironagai77:20210711210253p:plain

Beam Width Moduleがあります。

f:id:kazuhironagai77:20210711210307p:plain

これのScale Curveの値を50に変更して

f:id:kazuhironagai77:20210711210324p:plain

同じ事を試してみます。

0の時です。

f:id:kazuhironagai77:20210711210340p:plain

1の時です。

f:id:kazuhironagai77:20210711210354p:plain

変わっていない?

もしかするとCurve TensionはCascadeにおけるTangentのような役割をするのかもしれませんね。Interpolation PointやSheetのようなParameterの値を後で弄るとこのBeamがCurve Tension の値に沿ってCurveを描くのかもしれません。

<Edit the Emitter Update Group Settings

次はEmitter Update GroupのEmitter State ModuleのParameter、Loop Duration についてです。

f:id:kazuhironagai77:20210711210414p:plain

Loop DurationにRandom Range Floatをセットして

f:id:kazuhironagai77:20210711210542p:plain

0.1と0.2をそれぞれの値にセットします。

f:id:kazuhironagai77:20210711210559p:plain

Beamが点滅しなくなりました。

Loop Durationは次のLoopが始まるまでの期限を指定しているはずです。一応確認します。

Loop Durationを5秒にセットしました。

f:id:kazuhironagai77:20210711210616p:plain

すると0秒と5秒の時にBeamが現れます。

f:id:kazuhironagai77:20210711210656p:plain

Beamは3秒間表示され消えます。

今度はLoop Durationを4秒にセットしました。

f:id:kazuhironagai77:20210711210711p:plain

今度は0、4、8秒の時にBeamが現れるようになりました。

はい。合ってますね。

Documentの設定だと0.1~0.2の間にDurationがセットされるので

f:id:kazuhironagai77:20210711210728p:plain

Beamの寿命が3秒にセットされている今の状態だとずっとBeamが表示される訳です。

次にEmitter Update GroupのBeam Emitter Setup ModuleのParameter、

f:id:kazuhironagai77:20210711210747p:plain

Absolute Beam Endにチェックを入れます。

f:id:kazuhironagai77:20210711210806p:plain

このParameterの機能があんまりはっきりと説明されていません。

Documentには以下の様に説明してありました。

f:id:kazuhironagai77:20210711210855p:plain

Beam RenderingでBeamの起点と終点を指定するのは重要です。それを担当するのがこのBeam Emitter Setup Moduleみたいです。

それぞれのParameterを見ると以下の物があります。

f:id:kazuhironagai77:20210711210951p:plain

Beam StartはBeamの起点を指定しています。Simulation Positionがセットされています。Simulation Positionは

f:id:kazuhironagai77:20210711211011p:plain

と書かれていますが、簡単に言えばLevel上に配置されたNiagara systemの位置から開始すると言う事でしょう。

そしてDocumentの説明では、

f:id:kazuhironagai77:20210711211028p:plain

とありますが、要するにLocal Coordinateを使用するかWorld Coordinateを使用するかの設定をしていると思います。Beam StartはSimulation PositionがLevel 上に配置されたNiagara SystemのWorld Coordinateを返します。のでAbsolute Beam Startにチェックを入れるとそのNiagara Systemが配置された箇所からBeamが始まります。

次にBeam EndですがそのBeamの起点から200cm、x軸側に移動した箇所にセットしています。のでこっちはLocal Coordinateを使用しないといけません。のでAbsolute Beam Endはチェックしてはいけないはずです。

あれ?

Documentではチェックしていますね。

確認してみます。

Level上に配置したBeamです。

Absolute Beam Startはチェック、Absolute Beam EndはCheckしていません。

f:id:kazuhironagai77:20210711211057p:plain

想像通りのEffectが作成されています。

Absolute Beam EndにCheckします。

f:id:kazuhironagai77:20210711211114p:plain

やっぱりWorld Coordinateにおける200、0,0を指しています。

Documentの設定はオカシイですね。

次にBeamにcurveを追加します。

まずBeam Emitter Setup ModuleのUse Beam Tangentsにcheckを入れます。

f:id:kazuhironagai77:20210711211136p:plain

すると以下のParameterが現れます。

f:id:kazuhironagai77:20210711211153p:plain

Beam Start Tangentの設定をMultiply Vector by Floatにします。

f:id:kazuhironagai77:20210711211208p:plain

すると以下の様な表示に変わりました。

f:id:kazuhironagai77:20210711211241p:plain

これはもうCascadeのTangentの設定と全く同じですね。

Document通りの値を追加します。

f:id:kazuhironagai77:20210711211326p:plain

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

f:id:kazuhironagai77:20210711211342p:plain

うん。中々きれいなCurveだなと思って一応Level上でも確認したら

f:id:kazuhironagai77:20210711211357p:plain

Level上ではとんでもないCurveになっていました。

Scaleを0.5と1から0.1に変更しました。

f:id:kazuhironagai77:20210711211414p:plain

まあまあ、オカシクないCurveになりました。

まあ、この辺の値はCascadeと同じでしょうから後で自分で調節します。

後、この節の一番最初で述べたParameterであるCurve Tension

f:id:kazuhironagai77:20210711211430p:plain

の機能はTangentを指定する事じゃなかったですね。このParameterの機能も後で調べます。

最後にSpawn Burst Instantaneous moduleのSpawn Countを35にセットします。

f:id:kazuhironagai77:20210711211448p:plain

このParameterについては前に良く調べました。2021-06-20のブログにまとめてあります。

簡単に説明するとSpawn Countの数が少ないとBeamが部分的にしかRenderingされません。

<Edit the Particle Spawn Group Settings

まず最初にInitialize Particle Moduleの

f:id:kazuhironagai77:20210711211509p:plain

Life Timeを0.2に変更します。

f:id:kazuhironagai77:20210711211526p:plain

Life Time、こんな所にいたのか。これでBeamが点滅するはずです。

f:id:kazuhironagai77:20210711211549p:plain

Screenshotなので点滅しているのか、これからは分かりませんが実際は点滅しています。

その後で、Documentでは以下に示した様にSpawn Beam Moduleについての説明があります。

f:id:kazuhironagai77:20210711211612p:plain

これの事ですね。

f:id:kazuhironagai77:20210711211627p:plain

Parameterも一個しかなくて良く分からないModuleです。

f:id:kazuhironagai77:20210711211643p:plain

Documentの説明を信じればBeamを作成したい時は、このModuleを追加する必要があります。しかし単に追加すれば良いので何もParameterを弄る必要はないそうです。

CursorをSpawn Beamに重ねたら以下の説明が表示されました。

f:id:kazuhironagai77:20210711211659p:plain

結構重要な内容が書かれています。

  • Particleを起点と終点の間の線状に配置します。
  • 古典的なBeamRibbon Rendererで作成するために使用されます。
  • これで作成されたBeam は起点と終点をフレーム毎に計算する必要はありません。

マジですか。BeamってParticleを起点と終点の間に線上に配置していたんですね。それでSpawn Burst Instantaneous moduleのSpawn Countの数が少ないと変なImageになったんですね。

今度は、Beam Width Moduleです。

Curveの0.5の位置が1の値になるように調節します。

f:id:kazuhironagai77:20210711211722p:plain

0と1の傾きも調節しました。

更にScale Curveは5に変更しました。

このModuleはBeamの太さを管理しているModuleです。

<Edit the Particle Update Group Settings

はい。最後のGroupに来ました。

f:id:kazuhironagai77:20210711211742p:plain

まず、Color ModuleのColorを変更してBeamの色を変えます。

f:id:kazuhironagai77:20210711211758p:plain

やっぱり光らせるために1以上の値をセットしましたね。

f:id:kazuhironagai77:20210711211814p:plain

実際光っています。

今度はBeamをジグザグにするためにJitter Position Moduleを追加します。

f:id:kazuhironagai77:20210711211829p:plain

追加しただけで以下の様な感じになりました。

f:id:kazuhironagai77:20210711211852p:plain

実際のLevel上では以下に示した様になっています。

f:id:kazuhironagai77:20210711211914p:plain

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

取りあえず先をやってから考えます。

次はUpdate Beam ModuleをJitter Position Moduleの前に追加します。

f:id:kazuhironagai77:20210711211929p:plain

またJitter Position Moduleに戻ってJitter AmountとJitter Delayに以下の値をセットします。

f:id:kazuhironagai77:20210711211945p:plain

これで終です。

以下の様になりました。

f:id:kazuhironagai77:20210711212001p:plain

実際のLevel内ではこんな感じです。

f:id:kazuhironagai77:20210711212101g:plain

この節の最初で以下の疑問を書きましたがこれらの答えはまだ分かりません。

f:id:kazuhironagai77:20210711212136p:plain

更にこのDocumentをやっている中で、新たな疑問も出て来ました。

  • Ribbon Renderer ModuleのCurve Tensionはどんな機能なのか?
  • Jitter Position Moduleは実際は何をしているの?
  • 何でUpdate Beam ModuleをJitter Position Moduleの前にセットしないといけないのか?

などです。これらの疑問は次の節で検討します。

2.2 Niagara SystemにおけるBeam Renderingの疑問と検証

CascadeBeamにおけるSheetInterpolation Pointのパラメーターがどうやって実装されているか。>

まずそのものズバリSheetやInterpolation PointというParameterが無いか調べました。

f:id:kazuhironagai77:20210711212209p:plain

f:id:kazuhironagai77:20210711212216p:plain

なかったです。

それで考えて見ましたがSheetは兎も角Interpolation PointがParameterとしてあるならBeamの起点と終点のTangent を指定した時点でCurveになる訳はないです。その後でInterpolation Pointを指定して初めてCurveになります。と言う事は少なくともInterpolation PointというParameterはNiagara SystemのBeamには無いのかもしれません。

SheetはどっかのModuleにはありそうな気がしています。が見つかりませんでした。

Niagara SystemのBeamRibbon Renderingを使用します。しかし実際のBeam Renderingはどのように行われているのでしょうか?CascadeのBeamと同じなのでしょうか?それともRibbon と同じなのでしょうか?>

これはSmile ちゃんを使用して確認してみましょう。

f:id:kazuhironagai77:20210711212320p:plain

f:id:kazuhironagai77:20210711212329p:plain

f:id:kazuhironagai77:20210711212338p:plain

f:id:kazuhironagai77:20210711212345p:plain

起点と終点にある面が常にカメラ側を向いています。この点は起点だけカメラを向いているCascadeとは違いますね。

後Sheetが一枚だけ作成されています。Sheetの数は増やせそうですね。

更にWire Frameを見ると以下のようになっています。

f:id:kazuhironagai77:20210711212402p:plain

Cascadeの場合を以下に示します。

f:id:kazuhironagai77:20210711212417p:plain

f:id:kazuhironagai77:20210711212425p:plain

一見違うように見えますが、終点を含む面が常にカメラ側を向くとなると同じになると思います。

後、Spawn Burst InstantaneousのSpawn Countの値によってRenderingがどう変わるのかを調べます。

f:id:kazuhironagai77:20210711212441p:plain

0、1の時です。

f:id:kazuhironagai77:20210711212456p:plain

何も現れません。

2の時です。長方形のイメージが現れました。

f:id:kazuhironagai77:20210711212511p:plain

Wire Frameを見ると以下のようになっています。

f:id:kazuhironagai77:20210711212529p:plain

成程、辺が2個ある長方形になっています。

3の時です。

f:id:kazuhironagai77:20210711212551p:plain

f:id:kazuhironagai77:20210711212601p:plain

うん。これはCascadeのBeamにおけるInterpolation Pointと同じですね。もっと試してみましょう。

4の時です。

f:id:kazuhironagai77:20210711212618p:plain

これは?何で3つのSmileが出来ているんでしょうか?

f:id:kazuhironagai77:20210711212634p:plain

Wire Frameの方は想像通りですね。

今度は5つです。

f:id:kazuhironagai77:20210711212652p:plain

また変なMaterialの貼り方をしています。

辺の数は5個でSpawn Burst InstantaneousのSpawn Countの値はBeamの辺の数を表しているのは間違いないですね。

後は、この変なMaterialの貼り方について調べるだけですね。

6~10にしました。

f:id:kazuhironagai77:20210711212723p:plain

f:id:kazuhironagai77:20210711212730p:plain

f:id:kazuhironagai77:20210711212738p:plain

f:id:kazuhironagai77:20210711212745p:plain

f:id:kazuhironagai77:20210711212753p:plain

25です。Smileがやっと一個になりました。

f:id:kazuhironagai77:20210711212808p:plain

Wire Frameを見ても綺麗な扇型になりました。

f:id:kazuhironagai77:20210711212823p:plain

はい。

結論をまとめます。

  • NiagaraBeamRenderingは基本的にはCascadeBeamRenderingと同じです。ただしCascadeBeamは起点の面だけが常にカメラに向かっているのに対してNiagaraBeamは起点の面と終点の面の両方が常にカメラ側を向いています。
  • NiagaraBeam ではSpawn Burst InstantaneousSpawn Countの値はBeamの辺の数を表しています。CascadeにおけるInterpolation Pointの機能と同じです。
  • NiagaraBeamではMaterial3つ貼られます。Spawn Burst InstantaneousSpawn Countの値が増える毎に真ん中のMaterialのサイズが大きくなって最終的には一個のMaterialBeam全体をカバーするようになります。

以上です。

CascadeのBeamは起点となる最初の面は常にカメラ側を向いています。Niagara のBeamはどうなんでしょうか?>

この質問は既に調べてしまいましたね。NiagaraのBeamは起点の面と終点の面の両方が常にカメラ側を向いています。

CascadeのBeamは起点が常に画面から見て前になるようにRenderingされます。これってバグだと思っています。NiagaraのBeamはどうなんでしょうか?>

自分で質問を作成しておいてこの質問の内容すっかり忘れていました。

良い質問過ぎます。質問の内容を読んでいて、こんな質問考えるヤツは天才だと思いました。それで良く考えたらこの質問考えたのは私でした。

冗談はさておき調べて見ましょう。

起点が手前で、終点が奥になります。

f:id:kazuhironagai77:20210711212901p:plain

この場合は手前の起点が前にRenderingされています。

終点が手前で起点が奥になります。

f:id:kazuhironagai77:20210711212917p:plain

はい。CascadeのBeamとは違い、手前の終点の方が奥の起点より前でRenderingされています。

この結果から考えるとCascadeのBeamのRenderingの常に手前が前にRenderingされるのはバグですね。

Ribbon Renderer ModuleのCurve Tensionはどんな機能なのか?>

f:id:kazuhironagai77:20210711212946p:plain

と書かれていますが、数値を幾ら弄っても実際のBeamのCurveの形状に変化は見られません。

現時点では影響のないParameterなのではないかと思っています。

<Jitter Position Moduleは実際は何をしているの?>

Jitter Position Moduleがoffの時です。

f:id:kazuhironagai77:20210711213007p:plain

起点を含む面がカメラを向いているのが分かります。

Jitter Position ModuleがOnの時です。

f:id:kazuhironagai77:20210711213023p:plain

起点を含む面がカメラを向いていません。

Jitter Position ModuleのJitter Amountの値を変えてみます。

f:id:kazuhironagai77:20210711213124p:plain

0の場合です。

f:id:kazuhironagai77:20210711213138p:plain

Jitter Position Moduleをoffにした場合と同じです。

1の場合です。

f:id:kazuhironagai77:20210711213152p:plain

起点を含む辺が僅かに歪んでいます。

3の場合です。

f:id:kazuhironagai77:20210711213208p:plain

起点を含む辺がかなり歪んでいます。

Wire Frameで見るともっと良く分かります。

f:id:kazuhironagai77:20210711213223g:plain

これがJitter Position Moduleがしている事のようです。

<何でUpdate Beam ModuleをJitter Position Moduleの前にセットしないといけないのか?>

Update Beam ModuleをOffにしてみました。

f:id:kazuhironagai77:20210711213256p:plain

起点を含む面が元の位置に戻らず、どんどん最初の位置がずれて行っています。つまりUpdate Beam Moduleは起点の面をNiagara Systemが配置された点に戻す役割を果たしていたんでした。

Update Beam ModuleのNiagara Module Scriptを開くと以下の様なノードがOutput Moduleに繋がっています。

f:id:kazuhironagai77:20210711213314p:plain

PositionだけでなくBeam Spline Tangent、Beam Spline Normal、Beam Spline Binormalの値も初期化されているみたいですね。

流石にまだNiagara Module Scriptは読めませんがぼちぼちこれも勉強しようと思います。

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

3. Cascadeの勉強の続き

2021-05-24のブログに書いてある様にDistribution Float Particle Paramの具体的な使用方法は今もって分かりません。先週(2021-07-04のブログ)で述べたようにUE4C++のTutorialにその具体的な使用方法が載っているとIntro to Cascade: Creating a Beam Emitter | 07 | v4.2 Tutorial Series | Unreal Engine [5]ないで説明がありました。

f:id:kazuhironagai77:20210711213350p:plain

UE4C++のTutorialとはC++ 3rd Person Battery Collector Power Up Game |v4.9| Unreal Engine [6]のTutorialの事です。

f:id:kazuhironagai77:20210711213407p:plain

このTutorialは昔、何回もやった事があるのでDistribution Float Particle Paramの具体的な使用方法を解説している箇所を見つけたらそこだけ勉強するだけでDistribution Float Particle Paramの具体的な使用方法が理解出来ると思います。

まずDistribution Float Particle Paramの具体的な使用方法を説明している箇所を探します。そしてそれを勉強します。最後に自分で試してみます。

3.1 C++ 3rd Person Battery Collector Power Up Game |v4.9| Unreal Engine [6] の調査

C++ 3rd Person Battery Collector Power Up Game |v4.9| Unreal Engine [6] からDistribution Float Particle Paramの具体的な使用方法を説明している箇所を探します。

f:id:kazuhironagai77:20210711213441p:plain

多分これでしょう。C++ Battery Collector: Adding Particles to the Pickup | 15 | v4.9 Tutorial Series | Unreal Engine [7]を見てみます。

見ました。

結論から言うとDistribution Float Particle Paramは使用していませんでした。

公式のDocumentのDistributions [8]によるとDistribution Float Particle Paramは以下の様に説明されています。

f:id:kazuhironagai77:20210711213501p:plain

のでBPでBeam EmitterのTargetを指定しているC++ 3rd Person Battery Collector Power Up Game |v4.9| Unreal Engine [6]にはDistribution Float Particle Paramの具体的な使用方法が載っていると勝手に思っていましたが、実際はDistribution Float Particle Paramを使用しなくてもEffectとBPはTargetの位置のやり取りが出来ていました。

一応C++ 3rd Person Battery Collector Power Up Game |v4.9| Unreal Engine [6]のやり方を以下にまとめておきます。

Beam EmitterのTarget ModuleのParameter, Target MethodをUser Setに変更します。

f:id:kazuhironagai77:20210711213518p:plain

f:id:kazuhironagai77:20210711213524p:plain

そしてBP内からそのParticle SystemをSpawn Emitter Attached ノードを使用して呼び出します。

f:id:kazuhironagai77:20210711213540p:plain

Set Beam Target Point ノードをSpawn Emitter Attached ノードのReturn Value から呼び出してNew Target PointにTargetの位置にしたい場所のCoordinateを指定します。

以上です。

3.2 予定変更

今週のCascadeの勉強はDistribution Float Particle Paramの具体的な使用方法を勉強する事と決めていたので予定が狂ってしまいました。

正直、Beam RenderingやRibbon Renderingもちょっとだけ飽きて来ました。

Blogを読み直してみるとRibbon Renderingを勉強する前はContent Exampleにあるsampleを見てどれを勉強するか決めていました。のでContent ExampleのCascadeのサンプルを見てみます。

この雲みたいやつにしますか。

f:id:kazuhironagai77:20210711213601p:plain

というのはNiagaraで次に勉強する予定に入れているのが公式のDocumentのRecreate the Starter Content Smoke Effect in Niagara [9] だからです。

f:id:kazuhironagai77:20210711213616p:plain

比較対照するためにCascadeでも似たようなEffectを勉強しておいた方が得な気がしています。

3.3 Particle Shadow Castingの勉強

Particleの影の投影について?

あれ。Smokeみたいなやつの作成じゃなかったのか?ちょっとParticle Systemを開いてみます。

f:id:kazuhironagai77:20210711213639p:plain

Emitterも一個しかなくて思ったより簡単かもしれません。

実際に配置してみました。

f:id:kazuhironagai77:20210711213654p:plain

あれ?Content Exampleではあった影が無くなっています。この雲みたいなのを作成するのが目的なので影の事は後で考えます。

Wireframeで見ると一目瞭然ですね。

f:id:kazuhironagai77:20210711213710p:plain

Particleを大量に発生させてそれに常にカメラに向いている面を貼り付けています。その面に指定したMaterialを貼り付けています。

普通のSpriteです。

Emitterで確認しても特別なData Typeは使用してません。

f:id:kazuhironagai77:20210711213726p:plain

Moduleを見ると見た事ないのは一個だけあります。

f:id:kazuhironagai77:20210711213742p:plain

SubImage Index Moduleだそうです。

公式のDocumentのSubUV Modules [10] によると、

f:id:kazuhironagai77:20210711213800p:plain

あ、MaterialのTextureに良く以下ののようなImageを沢山並べたヤツを使用しているのがあります。

f:id:kazuhironagai77:20210711213814p:plain

それをEffectで使用するためのModuleのようですね。そう言えばこのImageがいっぱいあるTextureから作成したMaterialの使用の仕方が全然知りませんでした。この辺も勉強する必要がありますね。

3.4 M_cloud_litの勉強

SubUVを使用したMaterialの使用の仕方を勉強する前にParticle Shadow Castingで使用されているmaterialであるM_cloud_litについて調べて見ます。

f:id:kazuhironagai77:20210711213834p:plain

まずMaterialのResultノードから見てみます。

f:id:kazuhironagai77:20210711213849p:plain

この出力の種類はBlend ModeをTranslucentにセットしていますね。

f:id:kazuhironagai77:20210711213906p:plain

Base Colorがあって、Emissive Colorも出力していますね。

それぞれの値がどのように計算されているのかを見てみます。

Base Colorです。

f:id:kazuhironagai77:20210711213921p:plain

8*8のImageのまま出力しているんですね。ひょっとしてすべてそうなんでしょうか?

f:id:kazuhironagai77:20210711213937p:plain

f:id:kazuhironagai77:20210711213945p:plain

f:id:kazuhironagai77:20210711213954p:plain

そうでした。

するとこのタイプのMaterialを使用する特別な方法がCascade側にあると言う事ですね。

それだけ分かれば十分です。Particle Shadow Castingの勉強に戻ります。

3.4 Particle Shadow Castingの勉強 Part 2

色々調べたんですがSubUVのTutorialはNiagaraが主流になってしまってCascadeはほとんど見つかりませんでした。

のでそれぞれのModuleにあるSubUV関連のParameterを見ていきます。

まずRequired ModuleにあるSubUV関連のParameterです。

f:id:kazuhironagai77:20210711214013p:plain

良く分かりませんね。

何となく分かるのはSub Image HorizontalとSub Image Verticalが8にセットされている事が、MaterialのImageが8x8だった事に一致している事だけです。

うーん。

公式のDocumentであるDefault Required and Spawn Modules [11]を見てみますか。

Required ModuleのSub UVの所です。

f:id:kazuhironagai77:20210711214032p:plain

アニメーション?

Sub UVってAnimationを作るためにあるんですか?

うーん。

これは雲のEffectを理解する前にSub UVを使用したAnimation のEffectの作成方法を勉強しないとParticle Shadow Castingが何をやっているのか理解出来ないかもしれませんね。

Particles Casting Shadows [11]

Sub UVを使用したAnimation のEffectの作成方法についてのTutorialを探していたら偶然、Smoke Effectの影を付けるTutorialを見つけました。のでこれを先に勉強する事にします。

何せ、Particle Shadow Castingと言う名前なのにそのParticleをLevel上に配置したらその影が出来ないんです。

f:id:kazuhironagai77:20210711214049p:plain

まずLightの設定を変える必要があるそうです。以下に示したCast Translucent Shadowsにチェックを入れます。

f:id:kazuhironagai77:20210711214111p:plain

そう言えばContent ExampleでもなぜかParticle Shadow CastingだけLightが右上から照射されていました。

f:id:kazuhironagai77:20210711214129p:plain

はい。チェックされていました。

f:id:kazuhironagai77:20210711214147p:plain

因みにこのSpot Lightに重なる様にS_EV_SimpleLightBeam_03と言うStatic MeshがSpot lightに重なる様に配置されていて最初、これをSpot Lightと勘違いしていました。

f:id:kazuhironagai77:20210711214209p:plain

それでずっとCast Translucent ShadowsなんてParameterはないと思っていました。

後、試しにSpot LightのCast Translucent Shadowsのチェックを外したら雲の影も消えました。

f:id:kazuhironagai77:20210711214227p:plain

次です。

今度はLevel上に配置したParticle SystemのParameterを変更します。

LightingのCast Shadowにチェックを入れます。

f:id:kazuhironagai77:20210711214245p:plain

入れる前です。

f:id:kazuhironagai77:20210711214259p:plain

入れました。

f:id:kazuhironagai77:20210711214315p:plain

影が突然現れました。

でも何か影が濃すぎる気がします。

最後の変更だそうです。MaterialのOpacityの計算にDepth Fadeノードを使用していると影が出なくなるそうです。

f:id:kazuhironagai77:20210711214330p:plain

これを外します。

Particle Shadow Castingに使用されているMaterialであるM_cloud_litではOpacityの計算にDepth Fadeノードは使用されていませんでした。

f:id:kazuhironagai77:20210711214345p:plain

今度は雲の影をもっとスムーズにしていきます。

M_cloud_litのTranslucency Self ShadowingのShadow Density Scaleの値を変化させます。

f:id:kazuhironagai77:20210711214523p:plain

0.1にして見ました。

f:id:kazuhironagai77:20210711214536p:plain

影が薄くなってますね。

1にして見ました。

f:id:kazuhironagai77:20210711214551p:plain

濃くなりました。

Tutorialでは0.5位が見た目が良い。と言っていましたので0.5にしてみます。

f:id:kazuhironagai77:20210711214603p:plain

うーん。正直、雲の形が変わっているので影か薄くなっているのかどうか分かりません。

次は影のResolutionを変えるそうです。

今度はParticle Systemから変えます。

Boundsをクリックして境界線を表示させます。

f:id:kazuhironagai77:20210711214622p:plain

f:id:kazuhironagai77:20210711214629p:plain

次にBoundsのSet Fixed Boundsを選択します。

f:id:kazuhironagai77:20210711214644p:plain

Emitterの選択を外してBoundsを表示させます。

f:id:kazuhironagai77:20210711214700p:plain

この中のMinとMaxの値を弄る事で雲のサイズが変化するそうです。

後で直すのが大変そうなのでこの値は弄るのは止めてTutorialだけ見る事にします。

Tutorialでは以下のような影になりました。

f:id:kazuhironagai77:20210711214715p:plain

影が細部まで綺麗に写っている気がします。

以上でした。

<今週のCascadeの勉強はここまでにします。>

Sub UVを使用したAnimation のEffectの作成方法を解説したTutorialを探したんですが見つかりません。ひょっとするとNiagaraのSmokeのTutorialで解説されているかもしれませんし、今週のCascadeの勉強はここまでにします。

4. Monsterがアイテムを落とすようにする。-Play Animation ノードを使用しないで勝利のポーズを行う

今週は勝利のポーズをPlay Animation ノードからではなくMyThirdPerson_AnimBPから行うようにします。

やり方は

  • MyThirdPerson_AnimBPにBoolean変数を追加してその変数がTrueの時に勝利のポーズを取るようにする。
  • RPGGameModeBP内からMyThirdPerson_AnimBPにアクセスしてそのBoolean変数を戦闘後の勝利のポーズを取るときに変更する。

勝利のポーズを取っている間、RPGGameModeBPは次のノードの実行を待ってくれるのかどうか?などまだ不明な点はありますが作成しながら検討していきます。

4.1 MyThirdPerson_AnimBPのコードの改良

まずBoolean変数を作成します。

f:id:kazuhironagai77:20210711214810p:plain

勝利のポーズを取る時にTrueになる変数です。

武器を装備していない場合です。

f:id:kazuhironagai77:20210711214824p:plain

弓と矢を装備している時の場合です。

f:id:kazuhironagai77:20210711214900p:plain

それ以外の武器を装備している時です。

f:id:kazuhironagai77:20210711214917p:plain

4.2 RPG Game Mode BPのコードの改良

以下の部分を直していきます。

f:id:kazuhironagai77:20210711214939p:plain

以下の様になりました。

f:id:kazuhironagai77:20210711214954p:plain

実際に外した部分です。

f:id:kazuhironagai77:20210711215008p:plain

最後にMy ThirdPerson Anim BPのVictory変数をfalseにします。

f:id:kazuhironagai77:20210711215025p:plain

勿論、Set Anim Instance Classは要らないので外します。

これで完成した。と思ったら思い出しました。

前のこれと同じ物を作成した事をです。

たしか変なアニメーションになったんで仕方なくPlay Animation ノードに変更したんでした。

取りあえず結果を見てみます。

4.3 テスト

テストします。

武器なしの時です。

f:id:kazuhironagai77:20210711215044p:plain

普通に勝利のポーズを取っています。どこもおかしくないです。

武器を装備した時です。

f:id:kazuhironagai77:20210711215102p:plain

これもおかしくないですね。

弓を装備した時です。

f:id:kazuhironagai77:20210711215119p:plain

弓と手が離れていますが、それは元からなので今回は無視しておきます。

勝利のAnimationには何の問題もありません。

あまりに簡単に終わってしまったので拍子抜けですが出来ました。

後、多分ですが前回Play animation ノードを外した時に変なアニメーションになった理由はMy ThirdPerson Anim BPのAnim Graphの以下の部分

f:id:kazuhironagai77:20210711215149p:plain

でLoop Animationにチェックしたままにしていたせいだと思います。

f:id:kazuhironagai77:20210711215212p:plain

兎に角出来ました。

Preparation and Implementation Programmingはやっぱりすごい効果があります。全然疲れないし、時間も前の何分の1かで済んでしまいます。今までの越えなければならないハードルの高さが10位だとすると2か3位になっています。

来週は2倍の量がこなせそうですので、先週の2倍分、調査、検討する事にします。

5.戦闘後にアイテムが手に入る場合

5.1 色々な検討

戦闘後にアイテムが手に入る場合と入らない場合はどのような割合になるのでしょうか?

また、手に入るアイテムの種類はどの様に配分すべきなのでしょうか?

戦闘後にアイテムが手に入る確率は20%ぐらいが丁度良いと思います。それは最初の10回の戦闘はPlayerの操作するキャラのレベルが戦闘後、毎回上がるからです。その間に2回程度アイテムが手に入る事が分かればPlayerもどのくらいの確率でアイテムが手に入るのかが推測出来き、それ以降の戦闘に対しての準備や対策が建てられるからです。

アイテムの種類については2021-06-13のblogで検討した内容で良いと思います。

f:id:kazuhironagai77:20210711215247p:plain

ただし流石にこの期に及んで50%の確率でしかアイテムが貰えないのは厳しすぎます。一個は必ず貰えるようにしましょう。

となるとまず作成する必要があるのは、20%の確率で元の世界に戻らないようにする仕組みです。

そして石像と会話した後で元の世界に戻れるようにします。

段々、何を制作しないといけないのか見えて来ました。

まとめます。

  1. 20%の確率で元の世界に戻らないようにする仕組み
  2. 石像との会話
  3. 会話の後に元の世界に戻る仕組み

です。

5.2 「20%の確率で元の世界に戻らないようにする仕組み」の検討

まず戦闘に勝利した後、RPG Game Mode BP内でどんなノードが実行されるのかを確認します。

前節のMy Third Person Anim BP内のVictory変数がFalseにセットされた後から見て行きます。

f:id:kazuhironagai77:20210711215321p:plain

カメラの位置を元に戻しています。

f:id:kazuhironagai77:20210711215335p:plain

Down Victory Music変数をTureに変更しました。

f:id:kazuhironagai77:20210711215349p:plain

Down Victory Music変数はEvent Tickで使用されていました。

f:id:kazuhironagai77:20210711215404p:plain

TrueになるとBGMの大きさが0になるまで少しずつ下げていきます。

次のノードはHad Read Fight is Overノードです。

f:id:kazuhironagai77:20210711215418p:plain

戦闘に勝利した後だけでなく戦闘から逃げ出した時もこのノードに繋がっています。

戦闘から逃げ出した後で褒美が貰えたらオカシイです。このノードの後に石像と話す実装をする場合は戦闘に勝利した場合と戦闘から逃げた場合の別々な実装を作る必要がありますね。

Had Read Fight Is Over関数についてです。

f:id:kazuhironagai77:20210711215434p:plain

UE4C++の方の関数でした。FightISOverIsRead変数にTureをセットしています。

FightISOverIsRead変数がTureになるとTick()関数の以下の部分が実行されるようになります。

f:id:kazuhironagai77:20210711215450p:plain

Pointerなどの後処理を行っているだけですね。特にBP側に指令を発したりはしていませんね。

次は「読みました」ボタンにBindしたEventを全て外しています。

f:id:kazuhironagai77:20210711215505p:plain

この「読みました」ボタンの仕組みについては散々勉強したので今回はパスします。

その次のノードは倒したモンスターをRPGGameInstanceBP内のデータから消去しています。

f:id:kazuhironagai77:20210711215628p:plain

ここでMonsterの消滅を実行していたんですね。

一秒待っています。

f:id:kazuhironagai77:20210711215646p:plain

理由は忘れました。

何か重大な理由があったはずです。ここで待たないと何か不都合な事が起きたのは覚えています。

はい。最後に元のLevelにワープしています。

f:id:kazuhironagai77:20210711215702p:plain

このOpen Levelノードのすぐ前で「20%の確率で元の世界に戻らないようにする仕組み」を作成出来ると一番簡単です。

しかし戦闘に勝利した場合と戦闘から逃げ出した場合の違いをどうやって区別しましょうか?

良い変数を見つけました。

f:id:kazuhironagai77:20210711215731p:plain

この変数Victory、Combat Over State のEnumでPHASE Victory, PHASE Game Over, PHASE Escapeの種類があります。そして今の時点ではVictoryにセットされたままのはずです。この変数を使えば戦闘に勝利した場合と戦闘から逃げ出した場合を分けれるはずです。

ちょっとだけ試してみます。

f:id:kazuhironagai77:20210711215747p:plain

自由に歩けるようになりました。

f:id:kazuhironagai77:20210711215801p:plain

骸骨は消した方が良いです。回っている骸骨が3D酔いを引き起こします。

5.3「20%の確率で元の世界に戻らないようにする仕組み」の手順

20%の確率で当たる実装はどうとでも作成できるので来週考えます。その20%の確率に当たった場合、まずWidgetで特別な褒美が石像からもらえる事を連絡します。

そのWidgetでは

  • 褒美としてItemが貰える事
  • Itemをもらうためには石像に話しかける必要がある事
  • 話しかける石像によってもらえるItemが違う事

を説明します。

Widgetは今、作成してしまいましょう。

イラストはこんな感じです。

f:id:kazuhironagai77:20210711215832p:plain

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

f:id:kazuhironagai77:20210711215849p:plain

「話しかける石像によってもらえるItemが違う事」に関しては、実際に石像に話しかけて見れば良いと思い消しました。

次に「回っている骸骨」を消します。

「回っている骸骨」はBackgroundSkullBPと言う名前のBPクラスから生成されたInstanceでLevel、Battle Fieldに静的に配置されています。

f:id:kazuhironagai77:20210711215909p:plain

このVisualを消すためにはLevel、Battle FieldとRPG Game Mode BPとのやり取りが必要になります。RPG Game Mode BP内に専用のDispatcherを作成して、そのDispatcherをBattle Field内でBind、RPG Game Mode BP内でCallするようにするのか良いと思います。

5.5「石像との会話」の作成方法について

注意しなければならない点が一つあります。戦闘中は石像との会話が発動しないようにしなければなりません。これはBoolean変数をつければ解決します。

石像との会話はNPCとの会話と一緒で良いと思います。

のでNPC_Personを見て確認しましょう。

f:id:kazuhironagai77:20210711215931p:plain

Viewportはこんな感じでした。

f:id:kazuhironagai77:20210711215945p:plain

Boxの位置は変える必要がありますね。あるいはMeshを完全に外してしますのも手かもしれません。

Exclamation markを光らせる部分の実装です。

f:id:kazuhironagai77:20210711220028p:plain

f:id:kazuhironagai77:20210711220041p:plain

正直、何でこんな複雑にしたのか覚えていません。Boxに侵入したら光るだけでは駄目なんでしょうか?

思い出しました。

確か全部のNPCのExclamation Markが光ってしまうので上記のようなコードにしたんでした。

これは実装する時にもう一回検討しましょう。Begin Overlap関数に実装するだけで上記の問題は解決しそうです。

Begin Overlap関数を見て行きます。

f:id:kazuhironagai77:20210711220101p:plain

cast to Third Person Characterノードに繋がっています。

f:id:kazuhironagai77:20210711220117p:plain

これは侵入したActorがPlayer が操作するキャラであるかどうかの確認をここで行っているでした。

次のノードに行きます。

NPC_Person BP クラスの変数であるVillage Nameの値をThird Person Characterクラスの変数であるVillage Nameにセットしています。

f:id:kazuhironagai77:20210711220133p:plain

NPC_Person BP クラスのVillage NameはEnumで村の名前を保持しています。Instance Editableなのでlevel内に静的に配置したそれぞれのInstanceに別の値をセットする事が出来ます。

f:id:kazuhironagai77:20210711220418p:plain

村人との会話の区別に使用しているはずです。

次はRPGGameModeBPを呼び出して変数化していました。

f:id:kazuhironagai77:20210711220435p:plain

これはEvent Begin Playでやって置く事でしょう。と思ったらこのBP、Event Begin Playノードがありません。

Event Begin Playノードが無いからここでRPG Game Mode BPを呼び出して変数化しているんですね。Event Begin Playで呼び出すのとどっちが良い方法でしょうか?これも来週考えます。

最後にNPC_Person BP クラスのOccupationをRPG Game Mode BPクラスの変数、My Place For Eventsにセットします。

f:id:kazuhironagai77:20210711220451p:plain

因みにOccupationとMy Place For EventsはEnumで以下の要素で構成されています。

f:id:kazuhironagai77:20210711220506p:plain

以上でした。

これだけでは何をやっているのか不明です。のでこのExclamation markが見える時にEボタンを押した場合についての検討を次に行います。

まずThird Person Character BPクラスを見てみます。

Third Person Character BPクラスにはEvent Do Somethingがあります。

f:id:kazuhironagai77:20210711220522p:plain

このEventはEボタンを押すと発動します。

f:id:kazuhironagai77:20210711220537p:plain

キャラクターを操作するためのキーボードやマウスの操作についての管理は一括してThird Person Characterが担当すると決めています。

Playerが操作するキャラがNPCに話しかける場合もThird Person Character BP内で管理しています。

このやり方は以下のノードのようなスパゲッティコードを生み出していますが「キャラクターを操作するためのキーボードやマウスの操作についての管理は一括してThird Person Characterが担当する」と言う原則は守っているので一長一短がある実装方法です。

f:id:kazuhironagai77:20210711220554p:plain

NPCの場合はどんな実装がされているのかを見てみます。

NPCは沢山の種類があるのでその代表としてMy Place For Events がPE_TalkingNPC_Oldmanの場合を見てみます。

f:id:kazuhironagai77:20210711220609p:plain

Widget、Oldman Welcomeを開きます。

こんな絵が出て来ました。

f:id:kazuhironagai77:20210711220625p:plain

思い出しました。NPCの作成方法は結構大掛かりで大変でした。

このwidgetの特徴はNPCのセリフをそのセリフを管理しているData Tableから呼び出した表示する事です。更にそのセリフを管理しているData TableはそのNPCのセリフに対するPlayerの回答も用意されていて結構複雑な作りになっています。

NPCとの対話用のData Tableは以下の様な作りになっています。

f:id:kazuhironagai77:20210711220707p:plain

流石にこの辺の作りは覚えています。アドベンチャーゲーム方式でセリフを管理しています。

f:id:kazuhironagai77:20210711220728p:plain

ConversationにNPCのセリフが書かれています。

Answer Choice(何故かData TableにはAnser Choiceになっていますね。)にはNPCのセリフに対してのPlayerの回答が書かれています。その回答を選択した場合はJump To Commentに書かれた番号のCommentに飛びます。

このData Tableを正しく読めるような実装をOldman Welcomeウィジェット内で実装しているはずです。

まずCustom EventであるConversation Startが呼ばれています。

f:id:kazuhironagai77:20210711220742p:plain

Village Nameによって分岐しています。

f:id:kazuhironagai77:20210711220756p:plain

これはそれぞれの村でNPCのData Tableは別なので当然です。

最初の村の場合を見てみます。

Get Data Table Row Names関数が使用されていました。この関数は最初の村の老人用のセリフを管理したData Table、FistVillage_Oldmanを読み込んでそのData TableのRow Nameを返します。

f:id:kazuhironagai77:20210711220810p:plain

FistVillage_OldmanのRow Nameは以下のものです。

f:id:kazuhironagai77:20210711220824p:plain

次のノードです。Get Data Table Row()関数が使用されています。

f:id:kazuhironagai77:20210711220837p:plain

Get Data Table Row()関数ではComment Numberで指定された値のFistVillage_OldmanのRow NameがGet Data Table Row()関数にパスされそのRow Nameの担当する列がまるまる返されてきます。

Comment Numberで指定された値は、0なので

f:id:kazuhironagai77:20210711220851p:plain

が返されます。そしてRow Nameが担当している列のデータ(以下の物)が返されます。

f:id:kazuhironagai77:20210711220905p:plain

Conversationにある値はComment変数にセットされます。

f:id:kazuhironagai77:20210711220919p:plain

Comment変数の値は以下のTextBlockにバインドした

f:id:kazuhironagai77:20210711220933p:plain

Get Text Block Oldman Dialog Text 0 関数によって直ぐにComment欄に表示されます。

f:id:kazuhironagai77:20210711220948p:plain

その次のノードであるAnswer CommentにAnswer Choiceにある全ての要素が記録されます。

f:id:kazuhironagai77:20210711221003p:plain

そしてその配列は次のFor Each Loopに渡されます。

f:id:kazuhironagai77:20210711221016p:plain

ここで、それぞれの要素毎にAnswer Button ウィジェットが作成されます。

f:id:kazuhironagai77:20210711221038p:plain

Answer Button ウィジェットはただのボタンのWidget

f:id:kazuhironagai77:20210711221053p:plain

ボタン内のTextには先程、Answer Choice からAnswer Commentにパスされた要素の内のPlayerの回答部分が表示されます。

そのための実装部分を以下に示します。

f:id:kazuhironagai77:20210711221108p:plain

更にこのボタンがクリックされた場合は、以下の実装部分によりOldman Welcome ウィジェットのComment Numberが指定されている番号に変更します。

f:id:kazuhironagai77:20210711221122p:plain

その後、Clear Children関数で

f:id:kazuhironagai77:20210711221136p:plain

以下の赤丸で囲った部分に表示されているボタンを全て消去し、

f:id:kazuhironagai77:20210711221150p:plain

Oldman Welcome ウィジェットのCustom EventであるConversation Startを呼び出します。

f:id:kazuhironagai77:20210711221205p:plain

この後は、上記のOldman Welcome ウィジェットのCustom EventであるConversation Startに戻って同じ事を繰り返していきます。

f:id:kazuhironagai77:20210711221219p:plain

大変でしたが一通り復習出来ました。

5.6「石像との会話」の作成方法について Part 2

「石像との会話」では前節で復習したNPCとの会話のような複雑な対話システムは必要ありません。しかしItemを修得する必要があります。

ので先週作成したPick Up Itemクラスでどのように収得したItemを道具袋に追加しているのかを確認します。

ただし流石に先週作成したものの全てのノードを見て行くのは無駄なので実際にItemを追加する箇所だけ復習します。

それはPick Up Item ウィジェット内の以下の実装部です。

f:id:kazuhironagai77:20210711221240p:plain

最初のノードでそのItemが本当に存在しているItemかどうかを確認しています。

次のADDノードでRPG Game Instanceクラスの変数ItemsにそのItemを追加しています。これで修得したItemが道具袋に収納された状態になりました。

何かPCの調子がオカシイので、突然ですが今週の作業はここまでとします。

6.まとめと感想

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

  • Niagara Systemの勉強
    • Create a Beam Effect in Niagara [4]を勉強する。
    • Niagara SystemBeamCascadeBeamの比較と検証
  • Cascade Systemの勉強
    • BPBeam EmitterTargetを指定する方法について
    • Content ExampleにあるParticle Shadow Castingの勉強
  • ターン制RPGの作成
    • Play Animation ノードを使用しないで勝利のポーズを行う
    • 戦闘後にアイテムが貰える場合の検証
      • 20%の確率で元の世界に戻らないようにする仕組み」の検証
      • 「石像との会話」の検証

来週は、ターン制RPGの作成では今週の検証した内容についての実装を行います。NiagaraではSmokeのdocumentを勉強します。Cascadeは今週の続き、特にsub UVを使用したAnimationの作成方法についての勉強をします。

もしPCの調子が直らなかったり、Ch4_3 のProjectそのものが破損してしまった場合は、また一から作り直す事になってしまいますが、それもまた勉強でしょう。

以上です。

<参照 (Reference)

[1] Vowel diagram. (2021, March 21). In Wikipedia. https://en.wikipedia.org/wiki/Vowel_diagram

[2] Improve Your English Pronunciation. (n.d.). YouGlish. Retrieved July 11, 2021, from https://youglish.com/

[3] Epic Games. (n.d.-d). Niagara Visual Effects. Unreal Engine Documentation. Retrieved July 11, 2021, from https://docs.unrealengine.com/4.26/en-US/RenderingAndGraphics/Niagara/

[4] Epic Games. (n.d.-a). Create a Beam Effect in Niagara. Unreal Engine Documentation. Retrieved July 11, 2021, from https://docs.unrealengine.com/4.26/en-US/RenderingAndGraphics/Niagara/HowTo/BeamEffect/

[5] 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

[6] Epic Games [Unreal Engine]. (2017, February 14). C++ 3rd Person Battery Collector Power Up Game | v4.9 | Unreal Engine [Video]. YouTube. https://www.youtube.com/playlist?list=PLZlv_N0_O1gYup-gvJtMsgJqnEB_dGiM4

[7] Epic Games [Unreal Engine]. (2015, October 7). C++ Battery Collector: Adding Particles to the Pickup | 15 | v4.9 Tutorial Series | Unreal Engine [Video]. YouTube. https://www.youtube.com/watch?v=1-eT_hnjdfg&list=PLZlv_N0_O1gYup-gvJtMsgJqnEB_dGiM4&index=15

[8] Epic Games. (n.d.-c). Distributions. Unreal Engine Documentation. Retrieved July 11, 2021, from https://docs.unrealengine.com/4.26/en-US/Basics/Distributions/

[9] Epic Games. (n.d.-e). Recreate the Starter Content Smoke Effect in Niagara. Unreal Engine Documentation. Retrieved July 11, 2021, from https://docs.unrealengine.com/4.26/en-US/RenderingAndGraphics/Niagara/HowTo/RecreateSmoke/

[10] Epic Games. (n.d.-f). SubUV Modules. Unreal Engine Documentation. Retrieved July 11, 2021, from https://docs.unrealengine.com/4.26/en-US/RenderingAndGraphics/ParticleSystems/Reference/Modules/SubUV/

[11] Epic Games. (n.d.-b). Default Required and Spawn Modules. Unreal Engine Documentation. Retrieved July 11, 2021, from https://docs.unrealengine.com/4.26/en-US/RenderingAndGraphics/ParticleSystems/Reference/Modules/Required/

[12] W3 studios. (2017, August 14). Particles Casting Shadows [Video]. YouTube. https://www.youtube.com/watch?v=Z6F2sqo37bw