UE4の勉強記録

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

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

f:id:kazuhironagai77:20210620204450p:plain

<前文>

<発音記号や発音を勉強する前に>

本当に正しい発音を身に着ける必要があるんでしょうか?

アメリカ人が考える正しくない発音の英語の代表がインド英語です。私がアメリカにいた時は、理系の大学院生以外のアメリカ人は何を言っているのか全く分からんとインド英語をバカにしていました。

ところが、最近はYouTubeの理系、時にComputer Science関連で大学生や大学院生が授業の理解や課題を遂行する助けに使用出来る質の高いVideoのほとんど全部がインド人が作成したものになりました。そうなった今「インド英語何言っているかわからねー」と発言したら、それはインド人の英語の訛りが強くて分からないと言う意味には取ってもらえずインド人の講義している内容が理解出来るほどの頭脳を持っていない人と言う意味に取られるようになってしまいました。

つまり発音をアメリカ人と全く同じになるまで勉強するくらいなら、自分の専門分野で英語の動画を作成した方がアメリカでの評価が高くなる訳です。

となると正しい発音を身に着ける為に必要な学習コストを別な学問に振り分けた方がコスパが良いんじゃないでしょうか?

今日はその辺を踏まえた上で日本の英語発音教材についての私見を述べます。

まず日本の発音教材の私が思う3つの嘘について解説します。

  1. 英語の発音を知らないからネイティブの発音が聞き取れない。
  2. 英語の発音が出来るようになると英語の音も聞き取れるようになる。
  3. 英語の発音記号を勉強する事でネイティブのような発音が出来るようになる。

1についてですが、アメリカで10年暮らした私が断言しますが、アメリカで英語漬けの生活を送れば、英語の発音を全く知らなくてもネイティブの英語は全部聞き取れるようになります。大体2年位でほとんどの日常会話は聞き取る事は出来るようになります。ニュースやドラマなどの会話は結構時間がかかります。毎日見てる前提で更に2~3年位必要です。驚くかもしれませんが専門分野の英語を聞き取るのが一番簡単で、これは下手すると3カ月もあれば大体聞き取れるようになります。

この理由を自分なりに考えたんですが、英語はイントネーションとストレスが最も重要で発音はそれに付随するものだからと考えています。そして英語のイントネーションとストレスは英語を直に聞いていれば日本語が母語の人なら誰でも覚えられます。ただしある程度の必死さは必要で上記の例も必死さでランク付けすると、仕事、日常会話、テレビの娯楽やニュースの順で必死さが減少します。

つまりこの私の個人的な経験から断定すると、ネイティブの発音が聞きとれるようになるためには英語のイントネーションとストレスを英語を直に聞く事で脳に覚えさせる事が最も重要です。なので発音記号の音を覚えさえすればネイティブの英語が聞き取れるようになるとは思えません。

しかも最低でも2年は必要な訳で、英語がしゃべれない日本人が思っているほどネイティブの英語が聞き取れるようになる事は簡単ではありません。

2についてですが、私はアメリカで英語が分からなくて困る事は全くなかったですが、それでもLとRの区別は出来ません。特に子音の後にLやRが続く単語、Play とかPrayなんかは日常会話のスピードですらどっちか分かりません。しかし発音は出来ます。私だけ特別なのかと思ったら、同じ事を言っている日本人は沢山いました。

つまり英語の発音が出来る様になっても英語の音素が聞き取れる様になるとは限りません。

3についてですが、発音だけに関しては音声学を正しく理解した英語のネイティブが付きっ切りで指導すれば可能だと思います。しかしあなたのためにそんなに面倒な事をしてくれる人がいますかね。私の経験から言うと、一つの英語の音を正しく発音出来るようになるのに30分から1時間のワンツーマンの練習が必要です。それだけでも大変なのにその音を作る口の動かし方を次の日には忘れてしまいます。次の日にはまた最初からやり直しです。これを毎日繰り返して3週間位するとやっとその音を発音出来るようになります。

ぶっちゃけアメリカ人にとって日本人は、日本人が思っている程重要な存在じゃないです。日本人から見たインドネシア人ぐらいの立場です。あなたが大学で音声学をしっかり勉強したと仮定して、全く知らないインドネシア人から日本語の発音教えて下さいって言われてそんな大変な事やりますか。私が想像するに金だけとって適当に済ませて、発音出来てますよとおだててお終いじゃないですか。アメリカ人だって同じです。面倒くさいから適当に教えてお終いです。

しかもこんな日常が忙しいのに毎日、通える訳ねーだろとなります。つまり奇跡的に音声学を勉強したアメリカ人が超人的な親切さで貴方に発音を教えようとしても貴方の事情のせいで3番も出来ない可能性が高くなるわけです。

正し、これを調べている間に一個だけフィリピン留学というかフィリピンで合宿して英語の発音だけ徹底的に訓練する学校みたいなのが出て来たんですが、ひょっとするとこれは当たりの発音教材の可能性もあります。まずフィリピンですのでアメリカに留学するほどお金がかからないはずです。更にフィリピン人の英語ですが平均は日本と同じ位で日本人が思っている程上手くはないですが、無茶苦茶上手い人達が一定の数います。大卒レベルのアメリカ人と全く同じ英語をしゃべります。この人達の中で音声学を勉強した人からワンツーマンで英語の発音を教わったら結構上手くなる気がします。しかも合宿形式だから毎日発音の練習するわけで正しい発音をする為に必要な3週間毎日繰り返すが自然に達成出来ます。

唯一の問題はこのフィリピン人達は日本語で教える事は出来ない訳で英語で英語の発音方法を教えるはずです。Bi­labial、Labio­dental、Lingua-Dental、Alveolar、Post­alveolar、Palatal、Velar、Glottalなどの専門用語は前もって理解しておく必要がありますし最低限の英会話は出来る必要があります。

まあ、でも全体的に言えば発音教材が宣伝してるような発音出来るようになれば

  1. 英語のネイティブの発音も聞き取れる。
  2. 英語の音も聞き取れるようになる。

は嘘でしょうし

  1. 英語の発音記号を勉強する事でネイティブのような発音が出来るようになる。

も極少数の例外を除いて嘘でしょう。

じゃ何が本当かというと精々、ネイティブが聞いて理解出来るレベルの発音になる位が大体正しい目安だと思います。

私がアメリカで暮らしていて純粋に発音が通じなくて苦労した音を思い付くままに書き出すと

  • Erの発音
  • Vの発音
  • Angryが通じない
  • ンとNの音は全然違った
  • Yの発音
  • Thの発音

ぐらいです。良く聞くdzとzで困った経験は私はないです。後、factsがfu〇kに間違えられた経験もないです。私は発音記号は全く知らなかったですがFactsはフェアクスと聞こえていましたのでフェアクスと言っていました。それで通じなかった記憶はありません。日本人が発音するZooはアメリカ人にはDzooに聞こえると言う話は、日本に帰って来てから始めて聞きましたので分かりません。

これらの日本人が発音出来ない音はガチで問題起こす可能性があります。白人の女の子と会話しててAngryが全く通じないで「私の事uglyって言ってんの?」と言われた時は全身から冷や汗出て来ました。ただしこれは私の発音が悪かっただけじゃなくてアメリカ人はAngryをエィングリーって発音するんです。後、日本語のンは英語のNとは全く違う音なので私のンの音がdark Lの音に聞こえたのかもしれません。

この辺の発音が聞き間違えられないコツみたいなのを発音教材から教わる分にはかなりコスパはイイと思います。

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

<本文>

1.今週の予定

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

  • Niagara の勉強とCascadeの勉強
  • Monster Zoneのバグの直し
  • ゲームの改善点の直し

2. Niagaraの勉強

何か、先週はやる気が起きなかったんですが、その理由が分かりました。

今まで、私は散々UE4VFX を真に理解するためには、どのようにRenderingされているのかを理解するのが最も重要であると口を酸っぱくして語っていました。つまり

  • UE4VFX は全てParticle Systemで作成されている事。
  • Particle 一個一個にMaterialを貼り付けてそのMaterialをカメラに対して常に正面になるように向けるのがSprite。
  • そのParticle一個一個にStatic Meshを貼り付けているのかMesh。

これらの事を理解するのが絶対必要です。この事をしっかり語っているTutorialには出会った事はありません。つまり世界で私だけが断言しています。

のにRibbon Effectを作成するに当たってRibbon EffectがどうやってRenderingしているのか全く理解しないで進んでいました。自分でここが大切であると断言した事を自分で無視していました。

これではやる気出ないのも当たり前です。

今回は徹底的にRibbon EffectがどうやってParticleをRenderingしているのかを調査し解明しましょう。

2.1 Basics of Ribbons in UE4 [1] の勉強

UE4VFXを自在に使いこなすにはParticle SystemとそれぞれのEffectの理論をしっかり勉強する必要がある。これを断言しているのは世界中で自分だけ。と先程宣言しましたが、ちょっとGoogleで検索したら全く同じ事をしている人がすぐに見つかりました。

f:id:kazuhironagai77:20210620204906p:plain

この人のBlogでCascadeの場合ですがUE4Ribbonがどのような方法で生成されているのかを事細かに説明していますので、これを勉強します。

このサイトの解説によると

RibbonはObjectが通った跡の痕跡を示すもので以下の様に黄色の枠で囲われた球のMeshが左から右に移動した場合、球が移動した跡に作成されます。

f:id:kazuhironagai77:20210620204925p:plain

これだけ見ると球のケツにMaterialが貼り付けられている感じですね。

以下の続きの図をみると球のケツに貼りついているMaterialの長さが変化しています。

f:id:kazuhironagai77:20210620204943p:plain

これは向きが変わったらどうなんでしょうか?

2.2 Ribbon Rendering はparticleのケツにSpriteを貼っただけなのか?

Basics of Ribbons in UE4 [1]を読んでいたらRibbon RenderingってParticleのケツにSprite、もしくはMeshを貼っただけなんじゃないの?という疑問が出て来ました。これは実際にRibbon Emitterを作成してみれば分かります。

試してみます。

f:id:kazuhironagai77:20210620205006p:plain

でEmitter Systemを作成して

f:id:kazuhironagai77:20210620205023p:plain

Ribbon RenderingのMaterialをSmile_Matに変更します。

Leftから見た場合です。

f:id:kazuhironagai77:20210620205042p:plain

Topから見た場合です。

f:id:kazuhironagai77:20210620205059p:plain

これを見ると尻尾型のMeshにMaterialを貼っている感じでSpriteではない事は確かです。

もう少し詳しく見てみます。

Beam Emitter Setup ModuleのBeam Endのxを100にセットします。

f:id:kazuhironagai77:20210620205118p:plain

新しいBeam Width Moduleを追加して以下の設定にします。

f:id:kazuhironagai77:20210620205134p:plain

これでMaterialに使用されているTextureが歪まない状態で表示されるはずです。

Rightから見た状態です。

f:id:kazuhironagai77:20210620205150p:plain

Smileが綺麗な形で見えています。

今度はTopから見てみます。

f:id:kazuhironagai77:20210620205207p:plain

あれ、Spriteと同じようにMaterialをCameraに対して正面になるようにRenderingしていますね。

Previewの画面をPerspectiveにして色々動かしてみると

f:id:kazuhironagai77:20210620205225p:plain

f:id:kazuhironagai77:20210620205233p:plain

f:id:kazuhironagai77:20210620205240p:plain

常にカメラに対して正面と言うわけでもないようです。

Beam Width Moduleを元に戻します。だだしサイズを統一する為にScale Curveを100にしました。

f:id:kazuhironagai77:20210620205257p:plain

イメージが以下の様に変化しました。

f:id:kazuhironagai77:20210620205320p:plain

あー。成程ね。こういう事ですか。

もっとはっきりさせるためにBeam Emitter SetupのBeam Endのxの値を200にします。

f:id:kazuhironagai77:20210620205337p:plain

Topから見たイメージです。

f:id:kazuhironagai77:20210620205354p:plain

Leftからみたイメージです。

f:id:kazuhironagai77:20210620205410p:plain

一見Spriteと同じようにTextureを常にカメラに向けて正面になるように向けているのかと思いますが、Perspectiveで確認すると

f:id:kazuhironagai77:20210620205426p:plain

カメラがX軸に沿って移動した時はTextureはカメラの動きに対して全く動きません。

物凄く原始的な観点から言えば、Ribbon RenderingはParticleの後ろに長方形の厚みの無い紙を貼ってそこに描いた絵を表示していると言う事みたいですね。

厚みが無くて細長い長方形はRibbonの形状そのものなんで、そのままを表現していると言えなくもないですね。

2.3 Static BeamのSpawn Burst Instantaneous Module のSpawn Countが100にセットされている件について

これの意味が分かりません。

f:id:kazuhironagai77:20210620205451p:plain

だってParticleをBurstするのに1個で十分じゃないですか。

1にします。

f:id:kazuhironagai77:20210620205508p:plain

あれ。イメージが消えました。

f:id:kazuhironagai77:20210620205525p:plain

2にしたらこれです。

f:id:kazuhironagai77:20210620205547p:plain

3にしたらまた消えました。

4は以下のようなイメージが。

f:id:kazuhironagai77:20210620205603p:plain

8です。

f:id:kazuhironagai77:20210620205620p:plain

10です。

f:id:kazuhironagai77:20210620205638p:plain

25です。

f:id:kazuhironagai77:20210620205656p:plain

段々スムーズなイメージになって来ました。

50です。

f:id:kazuhironagai77:20210620205712p:plain

まだスムーズさが足りませんね。

100です。かなりスムーズですがまだカクカクしている部分もあります。

f:id:kazuhironagai77:20210620205728p:plain

200です。完全にスムーズなイメージになりました。

f:id:kazuhironagai77:20210620205745p:plain

でもなんでEmitter Spawnがイメージのスムーズさに関係しているんでしょうか?

先々週、作成したリボンではどうだったのか確認しましたが、先々週、作成したリボンではSpawn Bust Instantaneous Moduleは実際は使用していませんでした。

f:id:kazuhironagai77:20210620205802p:plain

以下の様にSpawn Bust Instantaneous Moduleを切っても

f:id:kazuhironagai77:20210620205818p:plain

何も変化しません。

f:id:kazuhironagai77:20210620205836p:plain

何でこんな違いがあるのかと更に調べたら、

先々週、作成したリボンではInitialize Ribbon Moduleを使用してRibbon を作成していますが、

f:id:kazuhironagai77:20210620205854p:plain

今回Templateに使用したStatic Beamは

f:id:kazuhironagai77:20210620205910p:plain

Initialize Particle Moduleを使用してその後でSpawn Beam Moduleを使用していました。

Ribbon Renderingを使用してもParticleのSpawn方法については色々な方法があるみたいですね。

2.3 Initialize Ribbon ModuleとSpawn Beam Moduleについて

Particle Spawn Group [2] によると以下の様に解説されていました。

f:id:kazuhironagai77:20210620205937p:plain

Bezier Splineってどんな形でしたっけ。

調べます。

Bezier Curves and Splines [3] に分かり易い解説がありました。MITの公開講座ですね。UndergraduateのComputer Graphicsの授業で使用されたSlide集のようです。

まずSplineの定義です。

f:id:kazuhironagai77:20210620205957p:plain

Control Pointsを使用する事とそのPointの間をInterpolateする事だそうです。

Cubic Bezier Curveは以下の方法で計算するそうです。

f:id:kazuhironagai77:20210620210013p:plain

でもこのやり方だとApproximationでInterpolationじゃないですね。と言う事はSplineじゃないからBezier Splineは別な方法で計算していと言う事でしょうか?

Bezier Splineの計算方法についての説明はなかったです。

以下に行列に書き直したものにSpline Matrixと記載されていますが、Bezier SplineとCubic Bezier Curveは同じ事を指しているんでしょうか?

f:id:kazuhironagai77:20210620210032p:plain

Bezier SplineとCubic Bezier Curveの違いは分からなかったですがslide自体は分かり易かったです。Wikipediaなんかで調べるよりMITの公開講座を直接見る方が断然分かり易いです。こういう事は結構あります。

脱線し過ぎました。Spawn Beamに戻ります。

f:id:kazuhironagai77:20210620210108p:plain

これをもう一回読み直すと、今日、私が発見したRibbon Renderingの特徴みたいなヤツが全部書かれていますね。つまりRibbon Renderingの特徴と思われていたモノは実はSpawn Beamの特徴だったって事でしょうか?

じゃ、Initialize Ribbon Moduleはどうなのかと言うと以下の解説が書かれていました。

f:id:kazuhironagai77:20210620210126p:plain

Several common parametersをどう解釈するかによりますが、Initialize Particle Module+Spawn Beam ModuleとInitialize Ribbon Moduleはほとんど同じじゃないでしょうか?

多分ですが、違いはInitialize Ribbon ModuleはRibbonを捻じる事が出来る事じゃないでしょうか?

2.4 Initialize Ribbon Module

Initialize Ribbon Moduleで「2.2 Ribbon Rendering はparticleのケツにSpriteを貼っただけなのか?」でやった事と同じ事をやってみます。

まず結果から表示します。その後でどのように作成したのかの説明をします。

Top viewです。

f:id:kazuhironagai77:20210620210150p:plain

Left Viewです。

f:id:kazuhironagai77:20210620210206p:plain

Perspective画面で回転してみました。

f:id:kazuhironagai77:20210620210223p:plain

この結果を見る限りはInitialize Ribbon Moduleを使用した場合もInitialize Particle Module+Spawn Beam Moduleと変わらないように見えます。SpriteをParticleのケツに貼りつけているだけです。

正し、大きく違う箇所もありました。それが必要なModuleです。

f:id:kazuhironagai77:20210620210238p:plain

Initialize Particle Module+Spawn Beam Moduleの時は、ParticleをSpawnするためにSpawn Burst Instantaneous Moduleを使用します。

f:id:kazuhironagai77:20210620210259p:plain

Initialize Ribbon Moduleの場合はSpawn Rate Moduleを使用する必要があります。

Spawn Rateの値が低いとまず何も表示されません。

f:id:kazuhironagai77:20210620210317p:plain

例え表示されてもカクカクのアニメーションになります。

f:id:kazuhironagai77:20210620210750g:plain

流石にScreen shootでは伝えきれないのでGifで映像を撮影しました。ただしサイズが1.42MBで普通のScreenshotを100KBとすると14倍です。

圧縮したら約600KBまで下がりました。これ位なら許容範囲ですね。ちょっとずつGifも使っていきます。

次にAdd Velocity Moduleを追加する必要があります。Spawn Beam Moduleの場合は生成されたParticleの後ろに付きます。しかしInitialize Ribbon Moduleの場合はparticleが移動した痕跡に描かれます。Particleが移動する必要があります。

これ以上はParticleそのものの動きをもっと正確に理解しないと解明出来ないです。来週以降の課題にしましょう。

Ribbon RenderingがParticleのケツにSpriteをくっつけているRendering方法であるという事は今週の調査で判明したと思います。それで充分でしょう。

Initialize Ribbon Module を使用したRibbon Renderingを以下に示した様にLevel上で動かすとSpawn Rate Moduleが使用されているのが良く分かります。

f:id:kazuhironagai77:20210620211234g:plain

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

3. Cascade の勉強

3.1 Basics of Ribbons in UE4 [1]の続き

「2.1 Basics of Ribbons in UE4 [1] の勉強」で少しだけ勉強したBasics of Ribbons in UE4 [1]の続きをやります。

<Souler coastersRibbonの違い>

まず、Ribbonはpanning textures、所謂  Souler coastersじゃない事を宣言しています。

Souler Coasterは以下の様な捻じれたMeshにTextureを貼るEffectだそうです。

f:id:kazuhironagai77:20210620211414p:plain

ふーん。

ですがこれだって一種のRibbonと思うんですが違うのでしょうか?

<How Ribbons work with UV sets 0 and 1

ここでUV0とUV1を使用した場合のRibbonの違いについて述べています。ただこれを理解するためにはCascadeRibbonが作成出来ないと理解出来ませんね。

3.2 Intro to Cascade: Creating a Ribbon Emitter | 08 | v4.2 Tutorial Series | Unreal Engine [4] 」でRibbon作成の基礎を学ぶ

もう行ったり来たりして錯綜していますが、しょうがないです。

Intro to Cascade: Creating a Ribbon Emitter | 08 | v4.2 Tutorial Series | Unreal Engine [4]を勉強します。

因みにこのTutorialにやや対応しているContent ExampleのEffectにあるRibbon (ただし下に示したのは4.26版)の例では2.5に配置されています。

f:id:kazuhironagai77:20210620211448p:plain

先週勉強したSampleは1.2のヤツでRibbonは遥か後に勉強します。

出来ました。

f:id:kazuhironagai77:20210620211505p:plain

f:id:kazuhironagai77:20210620211513p:plain

何これ。全然違うじゃん。と思うかも知れませんが、基礎だけ学びました。

そしてもっとそぎ落としていきます。

f:id:kazuhironagai77:20210620211530p:plain

f:id:kazuhironagai77:20210620211536p:plain

これ以上無い位要らない箇所を削ぎ落しました。

3.3 再びBasics of Ribbons in UE4 [1]の続き

前節で作成した最低限の機能しかないRibbon EffectのRequired ModuleのMaterialをSmile_Matに変更します。

f:id:kazuhironagai77:20210620211558p:plain

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

f:id:kazuhironagai77:20210620211856g:plain

これはBasics of Ribbons in UE4 [1]で述べているUV0の場合と同じです。

f:id:kazuhironagai77:20210620211939p:plain

今度はUV1にセットしてみます。

f:id:kazuhironagai77:20210620211957p:plain

はい。

f:id:kazuhironagai77:20210620212011p:plain

あれ?

Tutorialだと以下の様になっているんですが?

f:id:kazuhironagai77:20210620212028p:plain

ひょっとしてUV1ってTexCoord[1]の事じゃないんでしょうか?

調べます。

3.4 UV0とUV1について

Working with UV Channels [5] によるとTexCoord[0]がUV0でTexCoord[1]がUV1で合っています。

更にTexCood[0]の場合、以下のTextureを

f:id:kazuhironagai77:20210620212052p:plain

以下の図のように(つまりそのまま)に貼り付けるそうです。

f:id:kazuhironagai77:20210620212108p:plain

ところが、TexCood[1]の場合、以下の様に貼り付けるそうです。

f:id:kazuhironagai77:20210620212127p:plain

うーん。

同じじゃね。

色々探したんですがUV0からUV1にセットするとTextureの貼り方が

f:id:kazuhironagai77:20210620212145p:plain

から

f:id:kazuhironagai77:20210620212200p:plain

に変わると主張しているTutorialはBasics of Ribbons in UE4 [1]以外見つかりませんでした。

正直ちょっと怪しい気がしてきました。

区切りもいいですし今週はここで止めてCool downします。

4. Monster Zoneのバグの直し

4.1 Monster Zoneのバグについて

Monster Zoneには現在2つのバグが存在しています。

最初のバグは、以下の図で示したようなMonster Zone1のTerritory内かつMonster Zone 2のblock内で戦闘になった場合です。 

f:id:kazuhironagai77:20210620212235p:plain

戦闘後にLandscape4に帰還するとMonster Zone 1のモンスターは生成されますが、Monster Zone2のMonster は生成されません。Monster Zone 2は移動し放題になってしまいます。

次のバグは Block内に侵入はしているが、Territoryにはギリギリ侵入していない状態で戦闘になった時です。

以下の図の場合だと赤く記された部分で戦闘になった場合です。

f:id:kazuhironagai77:20210620212253p:plain

戦闘から戻って来ると、Monsterが消えています。これはTerritoryに侵入していないのでMonsterが生成されないためです。

4.2 Monster Zoneのバグの直し方

これらのバグの直し方は簡単です。

今まで、戦闘から戻った時、記録したTerritoryを元にMonsterの生成を行っていました。これをTerritoryではなくBlockに変更します。これでOKです。

正しBlockはArrayになるので実際のコードは少しだけ複雑になります。

<Territoryの記録などについて>

Blockの記録を作成する前に現状はどうやってPlayerのいるTerritoryを記録しているのか、その記録を元にMonsterを再生しているのかなどを調べておきます。

PlayerのいるTerritoryを記録する変数はRPG Game Instance BPにあるMonster Territory Numberです。

f:id:kazuhironagai77:20210620212322p:plain

この変数を追ってみます。

まずMonster ZoneクラスでTerritory内に侵入した時に呼ばれています。当然ですね。

RPG Game Instance BP のMonster Territory NumberにMonster Zoneクラスの変数である別のMonster Territory Numberの値をセットしています。

f:id:kazuhironagai77:20210620212501p:plain

そして当然ながらTerritoryから出た時にRPG Game Instance BP のMonster Territory Numberを0にセットしています。

f:id:kazuhironagai77:20210620212520p:plain

それだけでした。

ええ。もっと色々使用してたと思ったんですが。

敢えてもう一個だけ挙げるとすればLandscape4 のBeginPlay関数で呼ばれていました。

f:id:kazuhironagai77:20210620212537p:plain

一応RPG Game Instance BP のMonster Territory Number が0の時は使用する予定なのでこれも記録しておきます。

これで全部でした。

あれ。おかしいぞ。

倒したモンスターをMonsterSpawnData_Landscape4から消去する時にRPG Game Instance BP のMonster Territory Numberを使用していたはずです。

f:id:kazuhironagai77:20210620212602p:plain

ありました。

f:id:kazuhironagai77:20210620212619p:plain

更にもう一か所忘れていました。Monster ZoneクラスのEvent Begin Play関数でTerritory内のMonsterを生成する時です。

f:id:kazuhironagai77:20210620212635p:plain

これで全部です。

つまりRPG Game Instance BPにあるMonster Territory Numberを使用しているのは、

  • Monster ZoneTerritoryに侵入する。
  • Monster ZoneTerritoryから退散する。
  • Monster ZoneEvent BeginPlay関数でMonster を生成する。
  • RPGGameModeBPで倒したモンスターをMonsterSpawnData_Landscape4から消去する。

の4つの時に使用されています。

<直し方についての考察>

最後の倒したMonsterをMonsterSpawnData_Landscape4から消去する時はRPG Game Instance BP のMonster Territory Numberから行う必要があります。のでRPG Game Instance BP のMonster Territory Numberも必要です。

残りの3つは新しく作成するMonster ZoneのBlockに侵入した時ための変数で管理すべきです。

4.3 Monster Block Numbersの作成

Monster Block NumbersをRPG Game Instance BPに作成します。

f:id:kazuhironagai77:20210620212712p:plain

ここにMonster ZoneのBlockに侵入した時にそのMonster ZoneのMonster Territory Numberを追加します。

以下のコードを追加しました。

f:id:kazuhironagai77:20210620212729p:plain

更に確認のためにRPG Game Instance BP のMonster Block Numbersにある整数をPrintします。

f:id:kazuhironagai77:20210620212745p:plain

テストします。

f:id:kazuhironagai77:20210620212804p:plain

出来ていますね。

今度はMonster ZoneのBlockから退散した時にそのMonster ZoneのMonster Territory NumberをRPG Game Instance BP のMonster Block Numbersから消去します。

BlockのOn Actor End Overlap Eventに以下のコードを追加します。

f:id:kazuhironagai77:20210620212823p:plain

勿論、この部分のコードは戦闘で別のLevelに移動する時は呼び出されないように作成しています。

テストします。

f:id:kazuhironagai77:20210620212839p:plain

f:id:kazuhironagai77:20210620212845p:plain

Monster ZoneのBlockから退散した時にMonster ZoneのMonster Territory Number と同じ数字をRPG Game Instance BP のMonster Block Numbersから消去出来ている様です。

本当にRPG Game Instance BP のMonster Block NumbersからMonster ZoneのMonster Territory Number と同じ数字を消去出来ているか確認するために以下のコードを追加しました。

f:id:kazuhironagai77:20210620212904p:plain

出来ています。

f:id:kazuhironagai77:20210620212924p:plain

最後にMonster ZoneのEvent BeginPlay関数でRPG Game Instance BP のMonster Block NumbersからMonster を生成するようにします。

Monster ZoneのEvent BeginPlay関数からいかのコードを外して

f:id:kazuhironagai77:20210620212941p:plain

以下のコードを追加しました。

f:id:kazuhironagai77:20210620212956p:plain

これで全部直ったはずです。

テストします。

以下の赤色の部分で戦闘をします。

Monster Zone2 のモンスターと戦闘しますが、Monster Zone1のBlock内にも侵入していますのでMonster Zone1のモンスターも出現しています。

f:id:kazuhironagai77:20210620213014p:plain

戦闘から戻ると遠くにMonster Zone1のMonsterが生成されている事が確認出来ました。

f:id:kazuhironagai77:20210620213035p:plain

勿論、Monster Zone2のモンスターも生成されています。

f:id:kazuhironagai77:20210620213051p:plain

一応成功です。

これで完成です。と思ったら

f:id:kazuhironagai77:20210620213111p:plain

この直し方だと

f:id:kazuhironagai77:20210620213128p:plain

このバグは直せない事に今、気が付きました。

うーん。これは来週に考える事にします。

今週はここまでです。

5. ゲームの改善点の直し

5.1 Start画面の部屋がStarter Kitで作成されているのでFantasy感が薄い

以下の様に直しました。

f:id:kazuhironagai77:20210620213210p:plain

f:id:kazuhironagai77:20210620213222p:plain

f:id:kazuhironagai77:20210620213230p:plain

こうやって見ると使用しているImageがちょっとしょぼいですね。

f:id:kazuhironagai77:20210620213247p:plain

以下の様に描き直しました。

f:id:kazuhironagai77:20210620213309p:plain

f:id:kazuhironagai77:20210620213317p:plain

もう少しレイアウトを考えないと駄目ですね。今週はここまでにしておきます。

5.2 戦闘後にLevelが上がった場合

今週は軽く戦闘後のセリフの管理方法の復習程度で留めておきます。

戦闘が終了してPlayerのキャラのLevelが上がる場合、RPG Game Mode BPの以下の箇所でLevelが上がった事を知られるセリフを追加しています。

f:id:kazuhironagai77:20210620213343p:plain

関数Get Dialogue From Combat Dialogue 2DTの実装は以下の様になっています。

f:id:kazuhironagai77:20210620213358p:plain

Get Data Table Row Combat_Dialouge1からセリフを引っ張って来ています。

Get Dialogue From Combat Dialogue 2DT関数のparameter、Indexの値は15にセットされています。

f:id:kazuhironagai77:20210620213418p:plain

のでGet Data Table Row Combat_Dialouge1の番号16のセリフが選択されます。

f:id:kazuhironagai77:20210620213437p:plain

以上でした。

この後に以下に示した「読みましたボタン」を表示します。

f:id:kazuhironagai77:20210620213452p:plain

そして「読みましたボタン」をクリックするとLevelが上がった事を知らせ更にどのParameterがどれ位上昇したのかを知らせる様にしたいです。

この「読みましたボタン」、自分で作成したくせにどうやって機能しているのか全く忘れていました。

以下にRPG Game Mode BPで実際に使用されている「読みましたボタン」のコードを示します。

f:id:kazuhironagai77:20210620213509p:plain

まずCombat UI ウィジェットのSet Confirmed Button Visible関数を呼び足して「読みましたボタン」が見える様にします。

因みにSet Confirmed Button Visible関数は以下の様な実装になっています。

f:id:kazuhironagai77:20210620213526p:plain

そして見える様になった「読みましたボタン」をクリックするとEvent DispatcherであるConfirm Button is Clickedが呼ばれます。

f:id:kazuhironagai77:20210620213549p:plain

f:id:kazuhironagai77:20210620213556p:plain

すると最初のRPG Game Mode BPのコードに戻って来てBind Event to Confirm Button is Clicked のEventが発動します。

f:id:kazuhironagai77:20210620213614p:plain

ここからがポイントですが、このEventの内容が毎回変わります。

例えば今回の戦闘が終了した後では以下の様な内容になっています。

f:id:kazuhironagai77:20210620213631p:plain

戦闘中に攻撃などの選択をした時は以下の様な内容になっています。

f:id:kazuhironagai77:20210620213647p:plain

こんな方法で「読みましたボタン」を実装していたなんて完全に忘れていました。

因みに「読みましたボタン」を押してConfirm Button is clickedが呼ばれた後は以下のコードが実行されます。

f:id:kazuhironagai77:20210620213706p:plain

GameModeをRPGGameModeBPにCast するのはEvent BeginPlayでやっておくべきでしょう。その後の関数、Had Read Fight is Start()も何をやっているのか不明です。これは後で調べます。その後のSet Visibility()で「読みましたボタン」をCollapsedにするのは「読みましたボタン」を見えなくするためですね。最後のPlay Sound 2Dはボタンを押した時の音を出していますね。

Had Read Fight is Start()関数が何をやっているのか不明なので調べます。後、この関数の名前、もう少し分かり易い名前に変えます。

この関数BPで作成した関数ではなくUE4C++のRPG Game Modeで作成した関数でした。

f:id:kazuhironagai77:20210620213723p:plain

以下の部分を見るとこの変数は戦闘が開始した時にTrueにセットされるべき変数のようです。

f:id:kazuhironagai77:20210620213739p:plain

もう少しコードをキチンと読み直す必要がありますがHad Read Fight is Start()関数を毎回呼ぶ必要はないと思います。これが原因のバグは今まで発生していませんので今週は直しませんが後できちんと調べて直します。

この辺の戦闘システムを作成していた時はまだ手探りの状態で作成していたので、今見ると何でこんな書き方しているの?という部分も結構あります。特にUE4C++とBPの連結部分が曖昧な所がありましたし。その辺も後で直していきます。

今週は実装部は作成しませんが、仮に作成すると以下に示した感じになると思います。

f:id:kazuhironagai77:20210620213757p:plain

Levelが上がったら「読みましたボタン」を表示します。次にそのボタンをクリックした時に発動するEventの内容を実装します。

そのEventでは、最初に以下に示したCombat UIのコメント欄のコメントを総て消します。

f:id:kazuhironagai77:20210620213819p:plain

そしてLevelUpした内容について書き込んでいきます。

セリフだけ先にDataTableに作成しておきます。

f:id:kazuhironagai77:20210620213840p:plain

これで

  • KUMOのレベルが上がりました。
  • KUMOのレベルは2になりました。
  • KUMOの最大HP3上がり103になりました。
  • KUMOの最大MP1上がり21になりました。
  • KUMOの攻撃力は1上がり51になりました。
  • KUMOの防御力は1上がり31になりました。
  • KUMOの運は1上がり2になりました。

のような表示がコメント欄に現れます。

後、魔法の習得についてのコメントを忘れていました。

f:id:kazuhironagai77:20210620213906p:plain

追加しました。

  • KUMOは魔法、炎()を覚えました。

と表示されるようになります。

あれ?RPGGameModeBPのTick()関数内に以下の関数が書かれていました。

f:id:kazuhironagai77:20210620213931p:plain

名前からして明らかにLevel upに関連した関数ですがどこで使用しているんでしょうか?

RPGGameModeBPのheader fileを見たらこの関数はFunction SpecifiersにBlueprint Implementable Eventを使用していました。

f:id:kazuhironagai77:20210620213954p:plain

のでBPを見ると以下の実装をしていました。

f:id:kazuhironagai77:20210620214015p:plain

「うーん。何しているんだ。この関数は?」と眺めていたら思い出しました。

武器や防具を装備した時にキャラの攻撃力や防御力が上昇します。しかしこれは実際にはキャラの攻撃力や防御力が上昇した訳ではなくて武器や防具を外したら元に戻ってしまいます。

しかしUE4C++に作成したキャラクターの属性を管理するクラスであるGameCharacterクラスの変数にはキャラの武器や防具込みの攻撃力と防御力を管理する変数しかなく

f:id:kazuhironagai77:20210620214034p:plain

Levelが上がった後の基礎攻撃力などを計算するのが大変面倒になる場合がありました。

ので別に武器や防具を外した状態の攻撃力、防御力を示す変数をBPでCharacterの3Dなど管理しているThirdPersonCharacterクラスに作成したんでした。

この辺も後でスッキリ整理したいです。

ただし今回のLevel upした後のセリフの追加には関係ないので今回はそのままにしておきます。

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

5.3 PickUpItemクラスにItemを追加

来週やります。

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

来週やります。

5.5 Warp Passの作成

来週やります。

5.6 Landscape4にgood skyを追加

来週やります。

6. まとめと感想

今週は以下の事をやりました。

  • Niagaraの勉強:Ribbon RenderingとはどんなRenderingなのか?
  • Cascadeの勉強:CascadeにおけるRibbon Renderingについて
  • Monster Zoneのバグの直し
  • ゲーム全体の直しの内、Start画面の直し、Level Upした時の表示されるコメントの直しの準備

を行いました。

7. 参照(Reference

[1] Hey, J. (n.d.). Basics of Ribbons in UE4 by Jordan Hey. ArtStation. Retrieved June 20, 2021, from https://www.artstation.com/kanoba/blog/p3yX/basics-of-ribbons-in-ue4

[2] Epic Games. (n.d.-a). Particle Spawn Group. Unreal Engine Documentation. Retrieved June 20, 2021, from https://docs.unrealengine.com/4.26/en-US/RenderingAndGraphics/Niagara/EmitterReference/ParticleSpawn/

[3] Matusik, W. (n.d.). Bézier Curves and Splines. MIT CSAIL. Retrieved June 20, 2021, from https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-837-computer-graphics-fall-2012/lecture-notes/MIT6_837F12_Lec01.pdf

[4] Epic Games [Unreal Engine]. (2014, July 8). Intro to Cascade: Creating a Ribbon Emitter | 08 | v4.2 Tutorial Series | Unreal Engine [Video]. YouTube. https://www.youtube.com/watch?v=jBUF6at1s1o

[5] Epic Games. (n.d.-b). Working with UV Channels. Unreal Engine Documentation. Retrieved June 20, 2021, from https://docs.unrealengine.com/4.26/en-US/WorkingWithContent/Types/StaticMeshes/HowTo/UVChannels/