UE4の勉強記録

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

「Unreal Engine 4.xを使用してRPGを作成する」の足りない部分を作成する 村人用のAIの開発‐EQSの復習 Part 2

f:id:kazuhironagai77:20211212224953p:plain

<前文>

<brand力について>

アメリカの大学の研究室にいた時は、今まで誰もやってない方法で解決策を思いついて発言したら、同僚や教授からこいつ天才じゃないか?的な扱いをされました。勿論、それは私だけが思いつくんじゃなくてそこにいるみんなとは言わないですがだいたいの人が色んな場面で思いつくんですが、新しい計算方法を思いついてアルゴリズムが劇的に速くなったりすると回りから天才じゃないのかと畏怖されるわけです。

もっともいつも成功するわけじゃなくて、例えばある式がどうしても解けないでみんなで悩んでいる時に、すぱっと解いて次の日にみんなに解答をメールで送ったら、みんなの反応が今一なんです。後で理由を知ったんですが、自分が帰った後で、教授がこの式の解き方は分からんけど、答えはほぼ1になる事は間違いないから1を入れて計算してしまえ。と言って計算が終わった後だったんです。勿論、私の正しい解答も0.998…みたいな数字で無駄な努力を一生懸命した時もありました。

で、日本に返って来て思ったんですが、日本語のネットとかに落書きみたく書いてある発想で、これは天才じゃないの?と思うに出会う事が結構あるんです。

あるんですが、そう言う発想が日本で好意的に評価される事ってないですよね。

そういう天才的な発想が出来ると言う事は、それが天才的な発想であると評価できる人も一定数いるわけでアメリカの研究室の時と同じように天才的な発想だと評価されても良いはずですが絶対にそうはなりません。

これには色々な理由が考えられますが、その理由の一つにBrand力があると私は考えます。

人はその人の話の内容を評価しているじゃなくてその人のBrand力を評価している訳です。その人のBrand力が高ければ好評価、低ければ低評価をつけるだけでその人の話している内容に関してはどうでも良いんです。

つまり、人はネットとかに落書きみたく書いてある発想を評価するんじゃなくて、ネットとかに落書きみたく書く人のBrand力を評価していたんです。だから低評価しかつかなかったんです。

後、誤解のないように言っておきますが、これはアメリカだって同じです。研究室と言うBrand内に私がいたから同僚から一定の高評価を受けただけで、もし私が英語で匿名で同じ発言を書いていたらバカだと思われていたでしょう。これは日本だけが特別おかしい訳ではありません。

それでですね。

私は今作成しているRPGを沢山売りたいんです。しかし残念な事に今の私と私のGameの持つBrand力はほとんど0なんです。でももし私の作成したGameのBrand力がポケモン並みにあったらゲームが同じ内容でも凄い売れるわけです。だからズルにならない範囲で私の製作しているRPGのBrand力を出来るだけ挙げる方法を考えてみました。

<<HxHと言う言葉を何処かに入れてしまう>>

HxHと言う言葉をDirectに使用したら駄目でしようが、HxH風RPGとかだったらギリOKかもしれません。こうやって大手の有名なマンガのBrand力をそのまま借りてしまうのはどうでしょうか?

流石にマンガは無理かもしれませんが、パンダとかカブトムシなどのBrand力のある動物とかだったら絶対OKでしょう。後は、ワンパンチマン風のキャラを出すのはどうでしょうか?禿げていて必ず一撃で敵を倒すキャラ位ならいけるでしょう。

兎に角、大手のBrand力にただ乗りするんです。

後、日本の会社のキャラなら見つかってしまってOUTでも外国のBrand力を利用するなら結構無理しても大丈夫かもしれません。イカゲーム風とか、Samsungのロゴを真似るのは超えてはいけないLineがもう一歩奥にあるかもしれません。

三国志とかSherlock Holmesなどの著作権が切れたBland力のある作品を利用するのもありかもしれません。

<<表紙のキャラは美男、美女に変更する>>

私は仕事柄、コロナが流行る前はアメリカ人と一緒に行動する事が多かったんですが、日本で白人達と一緒に喫茶店やレストランに行くと普段の対応と違い滅茶苦茶丁寧で親切にしてくれます。特にイケメンの人と一緒に喫茶店に行くと私までおまけで凄い親切にしてくれます。

これも美男、美女のみが持つ一種のBrand力でしょう。

ただし3Dモデルを美男・美女に変更するのは無理です。私にはそんな技術はありませんし、ツテもありません。

でもGameの表紙だけ美男、美女にするのはどうでしょうか?

これなら出来るかもしれません。

<<有名なYouTuberとかにゲーム実況してもらう>>

英語圏のYouTuberでゲームの評価に対して一定の信頼がある人が、このゲーム面白いねと。私のGameを実況してくれればBrand力爆上げします。

でもどうやって宣伝してもらうかです。日本に住んでる英語圏YouTuberにどうにかして知り合いになるとか…。

うーん。無理か。

<<マンガのキャラに褒めさせる>>

美味しんぼとかが良くやっているんですが、漫画に登場する外人に日本の食品を褒めさせるんです。これを読んだ読者は外人が言ってるから本当だとコロッと騙されてしまいます。しかし現実には納豆が食べれる白人とかクジラの肉を上手いと言うアメリカ人とかいませんから。

でもこれは詐欺に当たらないんです。マンガはFictionですから。

だから、ゲームの裏表紙に1ページだけマンガを追加して、その漫画の中に任天堂の社長にそっくりな人が、こんな面白いゲームがあったなんて。て感涙しているシーンを追加したらどうでしょうか?

流石にOUTでしょうか?

では次点の策として、なろう系の作者に推薦文を書いてもらうのはどうでしょうか?

例えば、私のRPGを販売したら300個Downloadされたとします。同じ位の読者数のなろう系の作者に推薦文を書いてもらうんです。なろう系の作者は私のGameを通して自分の作品を宣伝出来ますし、私はそのなろう系の作者のファンからも私のGameをDownloadしてもらえるようになり上手く行くと倍の600個Downloadされるかもしれません。これをさらにPixivでイラスト描いてる同程度のファンがいる人と組んだらお互いのファンが混ざって900人のファンを獲得出来るかもしれません。

考えたら何とか道が開けそうな気がしてきました。それでは今週の勉強を開始します。

<本文>

1.今週の予定

今週もいつも通りやっていきます。

  • Niagara: HLSL Triangle code to UE4 Material nodes Tutorialの続き
  • Material : Content Exampleをみるの続き
  • NPCAIを作成するためのAIの復習の続き(Environment Query Systemの続き)
  • Game DesignポケモンHxHの念能力 Part 4
  • Map1Bug直しの続き
  • UE5naniteの勉強

今週は先週終わらなかった部分を終わらせるのが主になりますね。

2.Niagara: HLSL Triangle code to UE4 Material nodes Tutorialの続き

先週勉強したCGHOW氏のHLSL Triangle code to UE4 Material nodes Tutorial [1]で分からなかった関数やノードまたは実装方法について調査します。

2.1 Customノードを使用してHLSLをMaterial内で使用する方法

<CustomノードでMaterialの色を指定する実装で遊ぶ>

先週、Custom Nodeを使用してMaterialに色を追加する方法を幾つか習いました。

一つ目は単に数字を入れる方法です。

f:id:kazuhironagai77:20211212225128p:plain

これでConstant 3 VectorのRGBに(1,1,1)がセットされた状態と同じになります。

2つ目はHLSLで指定する方法です。

f:id:kazuhironagai77:20211212225148p:plain

Return Float3(1,1,0)でConstant 3 VectorのRGBに(1,1,0)がセットされた状態と同じになります。

3つ目は変数を使用する方法で

f:id:kazuhironagai77:20211212225206p:plain

CodeでReturn 変数名と書き

f:id:kazuhironagai77:20211212225224p:plain

その変数名をInput Nameに記入します。

最後に以下の様に実装します。

f:id:kazuhironagai77:20211212225247p:plain

正しこの方法だけではCustom Nodeがなくても同じ機能を示すのでCustom NodeにもっとHLSLの実装を追加する時に使用するべきですね。

先週、この部分を勉強した時に以下の様に述べています。

f:id:kazuhironagai77:20211212225306p:plain

そうです。

色々勉強しただけでは本当に理解したとはいえません。これらを弄って色々遊んでみます。

そうする事で深い部分で理解が進むからです。

<色の違いを確認する>

先週、Custom Nodeで作成したMaterialは色が暗い気がします。と書いています。

f:id:kazuhironagai77:20211212225400p:plain

これを確認してみます。

まずConstant 3 Vectorノードを使用した場合です。

f:id:kazuhironagai77:20211212225419p:plain

この位の白さです。

f:id:kazuhironagai77:20211212225440p:plain

次はcustom Nodeを使用した場合です。

f:id:kazuhironagai77:20211212225457p:plain

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

f:id:kazuhironagai77:20211212225515p:plain

結果です。

f:id:kazuhironagai77:20211212225532p:plain

結果を比較する前に正式なHLSLで書いた場合も調べておきます。

f:id:kazuhironagai77:20211212225602p:plain

結果です。

f:id:kazuhironagai77:20211212225623p:plain

3つの結果を比較しようとしたらLitでは無理でした。のでUnlitに変更してRGBを比較しました。

f:id:kazuhironagai77:20211212225642p:plain

全部同じR=255、G=255 、B=255でした。

同じ色だと言う事が確認出来ました。

<HLSLをNotepad++で開く>

先週、Notepad++の言語設定をHLSLに変更しようとしたら出来ませんでした。

f:id:kazuhironagai77:20211212225706p:plain

まずNotepad++のVersionを最新にします。Notepad++のスペルが間違っていますね。このBlogの原稿はWordで書いているんですがWordのSpell Checkは本当に糞です。こういう間違えると恥ずかしいミスは全然指摘してくれません。

f:id:kazuhironagai77:20211212225740p:plain

しました。

Notepad++はTextを開くのに便利なのでそれなりに重宝しています。HLSLのファイルも色付けで読める様にしておきます。

f:id:kazuhironagai77:20211212225758p:plain

あれ。

HLSLがないです。Pluginで追加しないといけないみたいです。先週は確かに言語の項目にHLSLがあったはずなんですが、まさかHTMLと見間違えていたの?

Notepad++、HLSLで調べたらこのサイトが無料でNotepad++用のHLSLを提供していました。

f:id:kazuhironagai77:20211212225817p:plain

正し古いです。作成したのが2012年です。

Google Driveに置いてあるのでそれをDownloadしてくれとあります。

うーん。

しようとしたらこのFileがPC内に入って勝手に動く可能性がありますとか出て来ちゃいました。

どうしようかな。

一端、Notepad++は中止してVisual studio Coreで開いて見ます。

ここではHLSLに関して以下のExtensionがありました。

f:id:kazuhironagai77:20211212225844p:plain

良く分からないので一番上のヤツをInstallしました。

先週のコードもやっと色付けして見れるようになりました。

f:id:kazuhironagai77:20211212225904p:plain

でもVisual Studio Codeを使用する時ってWebGLを勉強する時ですよね。となるとHLSLじゃなくてGLSLを入れるべきだったのか?

そういう考え方でいくとHLSLはVisual Studioを必ず使用して書くわけだから別にNotepad++やVisual Studio Coreから見れる必要もないのでは?

<Void Main Image()って何ですか?>

先週のBlogを見ると

f:id:kazuhironagai77:20211212225927p:plain

と書かれています。

まずこのコードがHLSLじゃなくてGLSLで書かれていた事についてですが、GLSLはそれなりに勉強したはずなのに気が付きませんでした。

ここで言い訳を言わせてもらうとGLSLでVoid mainImage()なんて関数の書き方は知らないです。

今のGLSLはこう書くんでしょうか?

Learn OpenGLのShader [2] の項では普通にMainを使用していますね。

f:id:kazuhironagai77:20211212225945p:plain

と言う事は、このコードを取って来たshadertoy.com [3] 特有の関数なのかもしれません。調べたらそうでした。

f:id:kazuhironagai77:20211212230004p:plain

そら分かりませんは。

HLSLと勘違いしてもしょうがないです。

何書いてあるか今一分からないんですこのSiteのコードは。

この例だと

f:id:kazuhironagai77:20211212230124p:plain

Float2 UVやFloat2 centerと書かれていますがこれ、宣言しているのか、あるいは別な所でこれらの変数は既に初期化されていて単に値をAssignしているだけなのかすら分かりません。

このサイトの実装方法に深入りするとまた粒度(Granularity)が変わってしまいます。

UEから離れない範囲で調査していきます。

<FragCoordとTexCoord[0]について>

f:id:kazuhironagai77:20211212230153p:plain

これは2番目のHLSLのコードをMaterialで実装し直してる所で確認します。

<I Resolutionについて>

f:id:kazuhironagai77:20211212230251p:plain

これは想像ですが、shadertoy.com [3]では画面全体をPixelで表しているのだと思います。だからTextureのサイズが基本1にならずに画面のサイズになっていると、のでTextureのサイズを1に変換するために画面のサイズ、つまり画面のPixel数で割る必要があると。一方でUEのMaterialは普通に1であらわしてるので画面のPixel数で割る必要はない。それで1で割っているのだと考えると辻褄があいます。

後は気になる箇所を書いておきます。

f:id:kazuhironagai77:20211212230327p:plain

この部分を読むと単にFloat 2 UVと{}内に書いた場合は変数として認識されていませんね。

Custom Node内で使用されている最終的なHLSLのコードです。

f:id:kazuhironagai77:20211212230344p:plain

こっちを読む事にします。

<以下の二つの実装が同じ事をしている事について>

これが分からんと言っていますので検証します。

f:id:kazuhironagai77:20211212230410p:plain

f:id:kazuhironagai77:20211212230420p:plain

FragCoordとTexCoord[0]の違いはここでは置いておきます。その後の計算は全く同じです。

はい。よく見たらFragCoordはCustom NodeのInputでした。

f:id:kazuhironagai77:20211212230438p:plain

勿論その先にはTexCoord1[0]が繋がっていました。

f:id:kazuhironagai77:20211212230457p:plain

つまりFragCoordとTexCoord[0]は全く同じものでした。

のでこの二つは全く同じ計算になります。

2.2 HLSLのコードをノードを使用して作成するの検証

Atan2とAtanの違いは?>

MicrosoftのHLSLのサイトによると両方ともArctangentを計算しますが、AtanはParameterが一個、

f:id:kazuhironagai77:20211212230522p:plain

Atan2はParameterが2個

f:id:kazuhironagai77:20211212230547p:plain

計算するのが違いだそうです。

うーん。

それよりもWikipediaのatan2[4]の解説が分かり易かったです。

一般のTangentはy/xで計算します。

y/x = tan (角度)です。

Arctangentなんで角度とy/xが逆になります。

角度 = atan(y/x)になります。

これがAtan() 関数です。しかしこの計算だとほしい答えが返ってくれない時の方が多くなってしまうそうです。例えばxとyの値の両方がマイナスの時は180度から270度の間の答えが返ってくる事を期待しますが、この計算式だと0から90度の間の答えが返って来ます。

のでxとyの値をそのまま入力する事で、xとyの値の両方がマイナスの時は180度から270度の間の答えを返すようにしたのがAtan2()関数だそうです。

成程、分かりました。

f:id:kazuhironagai77:20211212230617p:plain

f:id:kazuhironagai77:20211212230634p:plain

を計算します。ただしUEのArctangentの値はy、xで計算されるので結果はxとyが逆になるはずです。

これをxとyと答えの3つでGraph化しようとしたんですが、複雑過ぎてみても分かりません。以下にarctan()の計算結果を示します。

f:id:kazuhironagai77:20211212230654p:plain

何故かExcelAtan2(x,y)となっていてもうどっちがxでどっちがyが分からなくなってしまいました。

ただこの計算結果が正しいとするとyの値が0より小さければxがどんな値を取っても答えが+になる事はないですね。

UEのAtan2がxとyが逆だとすると以下の様な計算結果になるのもオカシクはないですね。

f:id:kazuhironagai77:20211212230714p:plain

次にこの計算結果にPiを足します。

f:id:kazuhironagai77:20211212230729p:plain

私の先程の計算結果にPIを足すと全部Positiveになってしまいます。

うーん。どこで計算間違えたのか?

この計算は複雑過ぎる。

分かりました。先程のWikipediaのatan2[4]にatan2のグラフがありました。

f:id:kazuhironagai77:20211212230747p:plain

WikiのGraphの引用の記載方法がわかりません。ここ [5]から引用しました。

このグラフのy軸はyの値じゃなくてAtan2 () の値です。x軸もxの値じゃなくてy/xの値です。じゃAtan2()じゃなくてAtan()のグラフじゃないかと、先程Wikipediaのatan2[4]を読んだときに思ったんですが良く見るとX<0の場合は別な値が記されていました。

このAtan2 ()がPieの分だけ上にずれます。

するとほとんどのAtan2 ()の値は1以上になりますが、x、y共にnegativeな場合だけ0から1まで値が上昇してる箇所があります。これが

f:id:kazuhironagai77:20211212230809p:plain

の値を表していると思われます。

分かり易いようにUnlitにしてみました。

f:id:kazuhironagai77:20211212230824p:plain

暗い部分の割合がWikipediaのatan2[4]のGraphにぴったりです。

なんで私のAtan2の計算結果がオカシイんでしょうか?

Atan2()のグラフの書き方が分かったのでもう一回計算し直してみます。

まずAtan()でY/xとatan()の値を計算します。

f:id:kazuhironagai77:20211212230844p:plain

これにxの値がNegativeな場合をAtan2()を使用して計算します。

f:id:kazuhironagai77:20211212230908p:plain

グラフ化します。

f:id:kazuhironagai77:20211212230935p:plain

さっきのWikipediaのグラフと比較するとxの値が0付近の結果が違いますね。

f:id:kazuhironagai77:20211212230955p:plain

xの値が0付近の所を細かく計算し直してみます。

f:id:kazuhironagai77:20211212231012p:plain

f:id:kazuhironagai77:20211212231023p:plain

おお、やっぱりxとYが両方negativeな場合は‐3.14に近づいていますね。

ただExcelの計算ではxの値が0丁度の時は3.14になってしまい、‐3.14という計算結果はどうやっても出て来ませんでした。

うん。

まてよ。

f:id:kazuhironagai77:20211212231055p:plain

よく見たらWikipediaのグラフもxの値が0丁度の時の-piは白抜きになっていました。と言う事は全く同じ計算結果になりました。

ArcTangent2のこのグラフの書き方を発明した人は天才ですね。

こんな分かり易く可視化したなんて。

誰が考えたんでしょうか。

オレンジの値にPiを足して見ました。

f:id:kazuhironagai77:20211212231122p:plain

全然1に届いていません。

以下の結果から推測すると45度付近ではまだグレイです。60度位で1を超えているかどうか。

f:id:kazuhironagai77:20211212231214p:plain

計算してみます。

f:id:kazuhironagai77:20211212231231p:plain

f:id:kazuhironagai77:20211212231238p:plain

なんとY/xが1になってもArcTan2(y,x)+Piの値は1になりませんでした。

f:id:kazuhironagai77:20211212231412p:plain

と言う事は

f:id:kazuhironagai77:20211212231558p:plain

赤い線で囲った部分は白く見える箇所も実は1以下と言う事なんでしょうか?

うーん。納得いかない。

Smooth StepノードでMin =1、Max=1にして確認します。

f:id:kazuhironagai77:20211212231647p:plain

f:id:kazuhironagai77:20211212231654p:plain

結果です。

f:id:kazuhironagai77:20211212231716p:plain

やっぱり途中までしか黒くないです。

あ。

もしかするとxとyを逆にしているので

f:id:kazuhironagai77:20211212231737p:plain

なのかもしれません。それならxの値を0.5で固定して計算すれば1を超える値が途中で出るでしょう。

試してみます。

f:id:kazuhironagai77:20211212231759p:plain

その通りでした。

やっとAtan2()が理解出来ました。

<rは何を計算しているのか?>

先程のAtan2()の計算をみても分かる様にこの三角形を求める計算は複雑すぎます。何かの科学的、もしくは技術的なBreak throughに関連した計算を誰かがここに応用してる気がします。

このまま計算を追ってもその元の計算が分からないと計算方法だけ何とか理解したみたいな結果にしかなりません。

ので今回はNodeの働きを理解する程度に抑えておきます。

f:id:kazuhironagai77:20211212231822p:plain

ここではNの値が変化するとRの値がどう変わるのかについてのみ調べます。

これは端にr = 2Pi/Nを計算しているだけです。

Nに何かの意味があるのでしょうか?

何かこのNは分子の自由度を表している気がしてきました。

<Dの計算について>

f:id:kazuhironagai77:20211212231845p:plain

まずa/rを調べます。

f:id:kazuhironagai77:20211212231909p:plain

当然黒い部分が増えます。

先程のSmooth Stepを使用して確認するとこんだけ増えています。

f:id:kazuhironagai77:20211212231952p:plain

0.5を加えます。

f:id:kazuhironagai77:20211212232009p:plain

何をしているのか全く不明です。

Smooth Stepで確認します。

f:id:kazuhironagai77:20211212232028p:plain

これと最初のaの結果です。私には違いが分かりません。

f:id:kazuhironagai77:20211212232052p:plain

何らかの式の計算をそのまま利用しているか、誰かの計算をそのままコピーしたんだけど宿題にそれを提出すると0点になるので無駄に複雑な計算を追加したのか、どちらにしても三角形を作成するだけならもっと単純な計算で出来るはずです。

floor(0.5 + a / r)を計算します。

f:id:kazuhironagai77:20211212232112p:plain

あれ。さっきと同じ絵が。

Floorノードの機能は1未満は0にするので結果的に同じ絵になるんですね。

floor(0.5 + a / r) * rを計算します。

f:id:kazuhironagai77:20211212232133p:plain

同じ結果です。

そらそうです。黒い部分は0なんですから。0に何を掛けても0です。更に白い所に1以上を掛けても1以上のままです。

うーん。

この辺の無駄な計算を見るとこれは「誰かの計算をそのままコピーしたんだけど宿題にそれを提出すると0点になるので無駄に複雑な計算を追加した。」感が出て来ましたね。

floor(0.5 + a / r) * r‐aを計算します。

f:id:kazuhironagai77:20211212232154p:plain

おお、一気に絵が変化しました。

何でこうなるんでしょうか?

分からんので先に行きます。

Cos(floor(0.5 + a / r) * r‐a)を計算します。

f:id:kazuhironagai77:20211212232216p:plain

f:id:kazuhironagai77:20211212232225p:plain

これにLength(UV)を掛ければDになります。

先にLength(UV)を計算します。

f:id:kazuhironagai77:20211212232251p:plain

真っ黒じゃん。

確認のためにSmooth Stepノードを追加します。

f:id:kazuhironagai77:20211212232310p:plain

真っ黒と言う訳ではなさそうです。

f:id:kazuhironagai77:20211212232329p:plain

あ。UとVの長さを求めているんだから中心(0,0)以外はそれなりの長さはあるはずですね。

この二つを掛けるとdに成る訳です。

f:id:kazuhironagai77:20211212232350p:plain

x線回析(X‐ray diffraction)のような結果になって来ました。やっぱりすごい計算してる気がしてきました。

<三角形を作る>

最後にSmooth Stepで三角形にします。

f:id:kazuhironagai77:20211212232413p:plain

f:id:kazuhironagai77:20211212232422p:plain

<Smooth Stepノードについて>

残りは知らないノードについて調べます。

f:id:kazuhironagai77:20211212232456p:plain

これ前も調べました。すっかり忘れていました。

2021-11-14のBlogでがっつり調べていました。

Valueの値がMinで指定された値より小さい時は0、Maxより大きい時は1を返します。

今回のようにMinにMaxより大きい値を入れると返し値が逆転します。

f:id:kazuhironagai77:20211212232517p:plain

以下の例を示します。

f:id:kazuhironagai77:20211212232537p:plain

結果です。

f:id:kazuhironagai77:20211212232553p:plain

MinとMaxを逆にします。

f:id:kazuhironagai77:20211212232610p:plain

結果です。

f:id:kazuhironagai77:20211212232627p:plain

逆の値というかOne minusと同じ結果ですね。

f:id:kazuhironagai77:20211212232644p:plain

f:id:kazuhironagai77:20211212232652p:plain

これがいつでもそうなのか、一種のUndefined behaviorで機種やOSによって挙動が違うのかは分かりません。心配ならOne Minus ノードを併用した方が良いかもしれませんね。

2.3 三角形を作る

このHLSLの実装が、何かの科学的もしくは技術的なBreak throughに関連した計算を誰かがここに応用してるか、あるいは誰かの計算をそのままコピーしたんだけど宿題にそれを提出すると0点になるので無駄に複雑な計算を追加したのかは分かりませんが、三角形を作るだけならこんな難しい事しなくても良い気がします。

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

f:id:kazuhironagai77:20211212232757p:plain

実装部です。

f:id:kazuhironagai77:20211212232843p:plain

結構頑張ったんですが無理でした。

2.4ノードを改良して見た目を綺麗にする

来週やります。

3.Material : Content Exampleを見るの続き

3.1 Volumetric Directional Lighting Intensityを自作する

先週のVolumetric Directional Lighting Intensityを自作してNormal の影響を確認します。

以下の設定で作成しました。

f:id:kazuhironagai77:20211212232914p:plain

f:id:kazuhironagai77:20211212232921p:plain

Material内の実装です。

f:id:kazuhironagai77:20211212233217p:plain

Opacityは0.5にセットしています。

結果です。左からDirectional Lighting Intensityが0.5、1.0、5.0です。

f:id:kazuhironagai77:20211212233237p:plain

はい。

まずここにある全てのDirectional Lighting Intensity のサンプルにおいてNormal Mapによって作成される球の表面の凸凹が確認出来ます。

これによってLighting ModeにVolumetric Directionalを選択した場合、半透明なMaterialでもNormalの値が使用される事が確認出来ました。

Opacity MaskにDither Thermal AA ノードを使用して疑似的な透明感を出す場合を除いて半透明な物体にNormal Mapのデータを反映させる事は出来ません。それをVolumetric Directionalは可能にします。これが確認出来ました。

次にDirectional Lighting Intensityの影響です。

上記のScreen shotを見るとDirectional Lighting Intensityが強くなるほど、透明感が無くなっています。実際は半透明でも見た目には不透明な物質に見えます。

以上です。

3.2 Material Instanceを見る

今週は、Content Examples の中のMaterial Instanceを見て行きます。

<Material

f:id:kazuhironagai77:20211212233333p:plain

展示品に書かれている解説を読むと左側のMaterialは単なる値を指定しただけですが、右側のMaterialはParameterを使用していてInstanceを作成した場合、それらの値をInstance側で自由に変更出来る設定になっているそうです。

それぞれのMaterialを開いて確認してみます。

左側の展示物に使用されているMaterialです。

f:id:kazuhironagai77:20211212233351p:plain

MetallicとRoughnessの値はConstantノードで指定されています。

右側の展示物に使用されているMaterialです。

f:id:kazuhironagai77:20211212233413p:plain

MetallicとRoughnessの値はParameterノードを使用して指定されています。

公式のDocumentに

f:id:kazuhironagai77:20211212233431p:plain

からJumpして読みましたが値の指定はParameterを使うとUEの利点を引き出せるみたいなセリフがちょっと書かれていただけでした。

<Instance

f:id:kazuhironagai77:20211212233456p:plain

解説によると一番左側がMaterialそのものを使用した場合、真ん中がそのMaterialから作成したInstanceを使用した場合、右端のが一番左のMaterialのInstanceを使用して更に値を変化させた場合だそうです。

それぞれのMaterialを開いて確認します。

一番左側のMaterialです。

f:id:kazuhironagai77:20211212233518p:plain

MetallicとRoughnessの値がParameterで指定出来るようになっています。

真ん中のMaterial Instanceを開きました。

ああ。画面一杯にMaterialのPreviewが!

f:id:kazuhironagai77:20211212233540p:plain

上記のScreenshotのようにMaterial Instanceを小さくしました。

Material Instanceの利点の一つに実際にLevel上に配置したMeshを見ながらInstanceの値を調節出来ると言うのがあると思うんです。言い換えると微妙な値の調整が実際のLevelを見ながら出来る訳です。その場合Material Instanceの画面はEditorの脇に置いて作業するのでMaterial Instanceの画面は小さい方が使いやすいはずです。

公式のDocumentである1.2 - Material Instance [6]も読んでみました。

Instanceを使用する2つの利点について解説していました。一つ目はTechnical Artistが作成した複雑なShadingを弄る事なくParameter値やTextureのみを変える事で色々なバリエーションが作成出来る事。二つ目はInstanceを利用する事で早くMaterialを作成出来る事だそうです。

私が考えるMaterial Instanceの利点は、Shadingを組む事が出来ないArtistやDesignerがMaterial instanceを使用する事でParameterの値のみを弄る事によりMaterialの最適化が出来る事だと思います。

特にPhotorealisticなShadingは複雑な光の物理現象を示す式を理解する物理の知識とそれをShading上に落とすProgramming力が必要とされます。ArtistやDesignerにそれを要求するのは無理でしょう。

<Instance of an Instance

f:id:kazuhironagai77:20211212233635p:plain

Material InstanceはMaterialからだけじゃなくてMaterial Instanceからも作成出来るそうです。この事自体は知っていましたがそれが出来るとどう違うのかとか、実際にはどんな場面で使用すべきなのかなどは全く分かりません。

まずここには載っていませんが、左端のMaterial Instanceの元になっているMaterialを見ます。

MetallicとRoughnessの値にParameterがセットされています。

f:id:kazuhironagai77:20211212233654p:plain

左端のInstanceから見てみます。

f:id:kazuhironagai77:20211212233712p:plain

あれ。DiffuseやNormal MapもParameterでした。

f:id:kazuhironagai77:20211212233735p:plain

これは気付きませんでした。

他には特にコメントはありませんね。

普通のMaterial Instanceです。

次に真ん中のMaterial Instanceを見てみます。

このMaterial Instanceは左端のMaterial Instanceから作成したMaterial Instanceです。

Materialから作成したInstanceとはどう違うんでしょうか?

f:id:kazuhironagai77:20211212233759p:plain

全部のParameterをチェックしたんですが同じです。何の変化もありませんでした。例えば親のMaterial Instanceで使用していないParameterは小のMaterial Instanceからは使用出来ないとか、そう言う事は一切なかったです。

これだとMaterial InstanceからMaterial Instanceを作成するMeritが無い気がしますが。

最後に右端のMaterial Instanceを調べます。このMaterial Instanceは真ん中のMaterial Instanceから作成したものです。

f:id:kazuhironagai77:20211212233821p:plain

なんと、Defaultで指定されているTextureが最初の親であるMaterialで指定したTextureではなく、直親が指定したTextureに変わっています。

ああ。これがMaterial InstanceからMaterial Instanceを作成する理由のようです。

Material InstanceのParameterの値を最適化します。それは別は場所に配置されたActorにも大体は使用出来るはずです。そんな時でも一々Material からInstanceを作成して最適化を行っていたら8割位は同じ事の繰り返しになり時間が勿体ないです。ので別な場所に配置したActorには既に最適化したMaterial Instanceを元に作成したMaterial Instanceを使用して最適化を行う事で時短に繋がる訳です。

納得しました。

最後に公式のDocumentである1.3 - Instance of an Instance [7] を見てみます。

ここの解説にしっかり書かれていました。Material InstanceからMaterial Instanceを作成した場合、その親のParameterの設定がそのまま子に引き継がれると。

そう言う事ですね。

<Grouped

f:id:kazuhironagai77:20211212233846p:plain

これは最初は何を言っているのか不明だったのですが、途中から理解しました。

Materialで使用されているParameterにはGroupと言う項目があり、Group名を指定する事が出来ます。

f:id:kazuhironagai77:20211212233909p:plain

ここで同一の特徴を持つParameterを同じGroupにしておくとMaterial Instanceから値を調整する時に楽ですよ。と言っています。

実際にGroup化された方のMaterial から作成したInstanceは以下に示したようにBrickというGroup内に全てのParameterが整理されていて見やすくなっています。

f:id:kazuhironagai77:20211212233957p:plain

Group化されていないMaterialから作成したMaterial Instanceです。

f:id:kazuhironagai77:20211212234024p:plain

もうこの時点で見にくいですね。

公式のDocumentも見ましたが特に記録すべきコメントはないです。

以上です。

3.3 Shader Optimization – True Instruction Cost, Performance Tips // Tutorial [8] を勉強する

先週、先々週とMaterialの最適化に関する勉強をしました。

最近、Tech Art Aid氏もShaderの最適化に関する動画を上げているのを知ったのでこれも勉強しておく事にします。

Tech Art Aid氏はHierarchical Instanced Static Mesh Componentを使用する事で何万ものActorをLevel上にとても小さいサイズで配置で配置出来る事を教えてくれたTutorialを作成した人で、彼の作成するTutorialはかなり重要な情報を含んでいる場合が多いです。

<Basic shader in HLSL

もう初っ端からShader playground [9] が紹介されています。

f:id:kazuhironagai77:20211212234052p:plain

ざっと全部見ましたが、先々週、Ben Cloward氏のShader Performance Measurement - Shader Graph Basics - Episode 21 [10]で学んだShader playground [9]の内容を既に全部忘れてしまっているのでどの部分が新しい情報で、どの部分は既に知っているのかが分かりません。

全部新しい情報に見えます。

先々週のBlogを読み返して復習しながら勉強する事にします。

f:id:kazuhironagai77:20211212234110p:plain

まずこれです。

Material →HLSL Code → Assembly Language → Hardware-specific Commands

この流れでMaterialのBPは変換さえてGPUが理解出来る言語に変換されます。

f:id:kazuhironagai77:20211212234131p:plain

と書いています。

しかしこのTutorialではShader playground [9]は色々な有名どころのShader Compilerであると言っています。

f:id:kazuhironagai77:20211212234147p:plain

つまり最後のAssembly Language からHardware-specific Commandsに変換する所を担当するのではなく真ん中のHLSL CodeからAssembly Language にCompileする処を担当していると言っています。

言われてみれば当たり前で左側にHLSLのCodeが書かれていて

f:id:kazuhironagai77:20211212234205p:plain

真ん中でCompilerを選んでいます。

f:id:kazuhironagai77:20211212234225p:plain

そしてShader Assembly Codeの解説に繋がる訳です。

いやあ。

その前にHLSLを教えてくれ。

と思ったら一寸だけ以下のHLSLのCodeについて解説してました。

f:id:kazuhironagai77:20211212234244p:plain

UEのMaterialだと、Base ColorやRoughnessなど沢山のOutputする値がありますが、HLSLはUEのUnlitのようにEmitter Color一個を返すだけです。

UEはこのShaderをWrappingしてさっき言ったような沢山の値をOutputしています。UEではOutputされたそれぞれの値はG-BufferにSaveされ、さらにUserが触る事が出来ないLighting Shaderが実行されると解説されています。

何でそんな事常識みたいに知ってるの?

deferred renderingの事を言っているんでしょうか?

先程のShader playground [9]の右側部分を少しScrollすると以下のコードが現れます。

f:id:kazuhironagai77:20211212234301p:plain

この部分が、Microsoft DXCによってCompileされたAssembly Codeだそうです。

ただこの最新のAssembly Languageは人間にはとても読みにくい物なので別なCompilerを使用するそうです。

Radeon GPU Analyzerを選択しました。

f:id:kazuhironagai77:20211212234316p:plain

Compileした結果です。

f:id:kazuhironagai77:20211212234333p:plain

先々週のBlogのBen Cloward氏のShader Performance Measurement - Shader Graph Basics - Episode 21 [10]で勉強している箇所を見るとほとんど同じ事をしています。ただしこっちはMicrosoft FXCを使用しています。

f:id:kazuhironagai77:20211212234355p:plain

うーん。何か怪しい。

両者がEpic Games社の技術者のための勉強会みたいので全く同じ方法を習った気配を感じます。

f:id:kazuhironagai77:20211212234417p:plain

やっぱりここを変更してCycle数を表示しました。

このCycle数はHardware-specific Commandsの数なはずです。

f:id:kazuhironagai77:20211212234441p:plain

さすが、Tech Art Aid先生。そこは抜かりなくHardware-specific Commandsの数であると説明しています。

更にそれゆえに以下に示したASICでどのGPUを使用するのかを具体的に選択する必要がある事について解説しています。

f:id:kazuhironagai77:20211212234458p:plain

これHawaiiとかSpookyとかあるんですけどそういうGPU本当にあるんですかね。

<Cost of sin instruction (sine, cosine)

Shader Assembly Languageの読み方を解説していますが、直接有効な情報はまだないですね。先々週のBlogのBen Cloward氏のShader Performance Measurement - Shader Graph Basics - Episode 21 [10]で勉強したShader playground [9]の最も重要で最も大切な内容はShader Languageの本当のInstruction数はISA Breakdownで表示されるCycle数であり、

f:id:kazuhironagai77:20211212234522p:plain

f:id:kazuhironagai77:20211212234528p:plain

Materialの所で表示される

f:id:kazuhironagai77:20211212234554p:plain

これじゃないと言う事です。

それ以上かそれ以外の情報は特にないです。

<Test material in UE5. Are constants optimized? Unreal instruction count is fake

以下に示したUEのMaterialに表示されるInstruction数が正しくない事について述べています。

f:id:kazuhironagai77:20211212234616p:plain

<How expensive is tan (tangent) on GPU

Tangentの実際の計算がSinやCosと比べても大変Costが高い事を示しています。

まあ、想像したらそうだろうなとは思いますね。

試しにAtan()をHLSLに追加してみました。

f:id:kazuhironagai77:20211212234648p:plain

f:id:kazuhironagai77:20211212234659p:plain

同じコードでAtanなしの時です。

f:id:kazuhironagai77:20211212234715p:plain

92 Cycle位増えていますね。

<Be careful with material functions in Unreal

Material 関数についてですが以下に示した様な青いヘッダーのノードは関数で

f:id:kazuhironagai77:20211212234738p:plain

中に沢山のノードが含まれています。

f:id:kazuhironagai77:20211212234801p:plain

<Do unconnected nodes contribute to instruction cost?

UEでは繋がってないノードはCountされません。

HLSLでも返し値に関係のない計算が実装されていても無視します。UEと同じです。

<Can we beat the compiler?

生半可な方法では出来ません。

ので書き方をちょっと工夫する位で効率が良くなる事はないと考えておくべきです。

うーん。

非常に単純な例ですが、Subtractノードで1を引いた場合とAddノードで-1を足した場合もCompileした後は同じになるんでしょうか?

f:id:kazuhironagai77:20211212234825p:plain

この辺ぐらいは知っておきたいですね。

<Texture sampling. How mipmaps & cache improve speed

Texture Samplingは最もコストの掛かるノードです。

それは知っています。

その理由について少し解説されていましたが、どこまで信用していいのかは不明です。

<Free math trick (thanks to texture memory latency)

Texture SampleがTextureを取ってくるのに時間がかかります。その待っている間にする計算のコストは実質0になります。

はあー。

これは盲点でした。

盲点なだけじゃなくてBen Cloward氏のShader Performance Measurement - Shader Graph Basics - Episode 21 [10]で述べられていない情報です。

やっぱりTech Art Aid氏は非凡です。

<Scalar memory (SGPR) vs vector registers (VGPR)

Shader Assembly Codeについてです。

<Wait counter

Shader Assembly Codeについてでが、Textureの読み込みが終わるまで次のcodeが実行出来ないので待ちますと言う意味だそうです。

<Modifying UV coordinates can affect performance. Cache coherence

以下の様にTexCoord[0]に色々なOperationをした場合、

f:id:kazuhironagai77:20211212234913p:plain

Pixel1個毎にTextureのサンプルを取りに行く事態になり、とんでもないCostがかかります。

f:id:kazuhironagai77:20211212234954p:plain

成程。

でもTexCoord[0]に色々な計算をしたけどTexture Sampleノードと繋げない場合はどうなんでしょうか?

その場合だったらそんなにcostはかからない気がします。

<Packing grayscale into RGB channels in Substance Designer

一つのTextureに複数のグレイスケールのTextureを入れた場合、別々なTextureを読み込むよりCostが少なくて済みます。

<Gradient mapping. Color curve atlas in Unreal Engine

ここは何しているのか良く分かりませんでした。見た事ない機能を使用してました。

<結論>

結論を言えば、Materialに関して言えばBen Cloward氏のTutorialで勉強しておけば、Tech Art Aid氏のTutorialを見る必要はないですね。あらゆる意味でTech Art Aid氏のTutorialの方が勝っています。

ただBen Cloward氏のTutorialの内容をより深く理解するために寄り道をすると言う意味で見るのは良いかもしれません。

Tech Art Aid氏のMaterialのPerformanceに対する問題提起や、その解決方法を探るためのアプローチは正しいですが、そのために提供された方法や結果からの推測がBen Cloward氏のそれと比較すると弱すぎます。

Ben Cloward氏のやり方で全部代用が効いてしまいます。

後、あんまりHLSLやShader Assembly Codeに深入りしてそれ自体が目的になってしまうのも問題だと思いました。UEのMaterialを組むに当たって無駄なCostは減らしたいと言うのが目的です。そのためにHLSLを理解する必要はないです。それは先週、Ben Cloward氏のTutorialで勉強した方法を使用すればMaterialの正確なCostが測定出来るからです。

HLSLやShader playground [9]を使用するのはUEのMaterialで説明されるInstruction数が実際のCycle数と全く違うと言う事が分かる為に必要なのであったそれ以上のものではありません。

4.NPCAIを作成するためのAIの復習の続き(Environment Query Systemの続き)

4.1 Environment Query System Quick Start [10]のDebugの続き

先週、Environment Query System Quick Start [10]をやりましたが、期待した動きをAIがしません。今まで習ったDebugの技術を使用してBugを直します。

まずDebugからEQSを調べて見ます。

f:id:kazuhironagai77:20211212235050p:plain

EQSが呼ばれてすらいません。GameをPauseしてBehavior Treeを見てみます。

f:id:kazuhironagai77:20211212235112p:plain

最初のBlackboard Based ConditionはTarget Actorがセットされているかどうかです。

そしてセットされているとあります。

次のBlackboard Based ConditionはHasLineOfSightがTrueかFalseでTrueとなっています。

その結果、Target Actorつまりplayerが操作するキャラの方を見ます。

見るだけです。

つまりこのBehavior Treeで指定した通りの挙動をNPCは取っています。

うん。

どういう動きをNPCがすれば正しいのか今一理解してませんでした。

Environment Query System Quick Start [10]を読み直したらNPCがどのような動きをするのかが書かれていました。

f:id:kazuhironagai77:20211212235136p:plain

NPCはPlayerの操作するキャラを見つけるまで適当に動き回ります。

Playerの操作するキャラを見つけたら回転してPlayerの操作するキャラを見つめます。

その後でPlayerの操作するキャラが見えなくなると、新しい場所に移動しようとします。

この移動する時にEQSを使用する訳でした。

と言う事はここまでは予定通りの動きをしている?

もう一回テストしてみます。

Debugを開始したら今度はいきなりEQSが発動しました。

f:id:kazuhironagai77:20211212235153p:plain

うーん。でもBehavior Treeを100まで遡ってもEQSは呼ばれていませんね。

f:id:kazuhironagai77:20211212235211p:plain

この状態でPlayerの操作するキャラをNPCから見えない位置に移動したらEQSが呼ばれました。

f:id:kazuhironagai77:20211212235253p:plain

EQSのItemである球も色が青になったり緑になったりしています。

f:id:kazuhironagai77:20211212235314p:plain

この後、何度もNPCから見えない様に隠れてみましたが、そのたびにNPCは移動してPlayerの操作するキャラを探しに来ました。

f:id:kazuhironagai77:20211212235333p:plain

つまり、Bugってなかったです。先週実装したコードは合ってましたしEQSも正常に作動していました。

4.2 UEのAIについての総括

これでUEのAIの復習が一通り終りました。

2021-10-03のBlogから始まったUEのAIの復習をここで総括します。

2021-10-03Blog

今までのUEのAIの勉強を復習しています。

その中で大事な事として

  • UEAIは単なるIF節の塊
  • UEAIを作成するために必要な4つのクラス
  • その4つのクラスの繋ぎ方

について解説しています。

2021-10-10Blog

以下の事について勉強しています。

  • Behavior Treeを作成するのに必要な3つのクラスであるTask BPService BPそしてDecorator BPについて
  • SequenceSelectorの違いについて
  • Task BPクラスのFinish Execute ノードについて
  • Task BPAbort関数、Execute 関数、そしてTick関数とFinish Abortノードについて
  • Behavior TreeDebugのやり方について
  • Decorator BPObserver abortsNoneSelfLower Priority、そしてBothについて

2021-10-17Blog

  • Decorator BPのObserver Abortの機能を実際にテストして示す。
  • 公式のDocumentであるArtificial Intelligence [12] に以下の項目のTutorialがありそれぞれを勉強する必要があると宣言。

f:id:kazuhironagai77:20211212235444p:plain

  • Behavior Trees [13] の勉強を使用としたらその中に更に4つのTutorialが合った事とこれらを全部勉強した事。

f:id:kazuhironagai77:20211212235523p:plain

  • Online LearningのIntroduction to AI with Blueprintsについて

f:id:kazuhironagai77:20211212235556p:plain

  • Mathew Wadstein氏のWTF Is? AI [14] について
  • Ryan Laley氏のAI [15] について

2021-10-25Blog

f:id:kazuhironagai77:20211212235645p:plain

  • 上記のBasic NavigationとModifying the Navigation Meshを勉強

2021-10-31Blog

先週の続きとして以下の二つのTutorialをやる

f:id:kazuhironagai77:20211212235715p:plain

2021-11-08Blog

先々週の続きとして以下の二つのTutorialをやる

f:id:kazuhironagai77:20211212235734p:plain

2021-11-14Blog

公式のDocumentであるAI Perceptionを勉強する。

もう引用が多すぎて全部は書けませんので、Artificial Intelligence [12]内のTutorialはArtificial Intelligence [12]から検索して下さいとだけ書く事にします。

f:id:kazuhironagai77:20211212235755p:plain

これを見ても実際の使用方法は全然分からないので、Mathew Wadstein氏のWTF Is? AI [14] やRyan Laley氏のAI [15] で実装方法を勉強していました。

2021-11-22Blog

公式のDocumentのAI Debugging を勉強していきます。(Artificial Intelligence [12]内を参照)

f:id:kazuhironagai77:20211212235815p:plain

これをしろと書かれています。

2021-11-29Blogから今日まで>

公式のDocumentのEnvironment Query Systemの勉強です。(Artificial Intelligence [12]内を参照)

<UEのAIの勉強のまとめ>

まず、UEのAIは単なるif節なんだけどBehavior Treeを採用しているために4つのクラスが必要になった。という私独自のUEのAIに対する解釈は全く問題なかったです。問題ないというかUEのAI初心者はこの考え方は必ず学ぶべきで、そうする事でUEのAIの基礎の基礎が理解出来ます。

その上で公式のDocumentにあるAIやその他のTutorialを勉強する事でAI PerceptionやEQSなどの応用技術やDebug方法が身につきます。

公式のDocumentにあるNav MeshのTutorialはBehavior Treeを使用しないでUEのAIを実装していてそういう観点からも面白いTutorialです。

後、Decorator BPのObserver abortsのNone、Self、Lower Priority、そしてBothについての検証方法も結構ためになると思います。

Behaviorクラスで実装するためには更にTask BP、Service BPそしてDecorator BPの3つのクラスやSequenceとSelectorなどについて知る必要がある事やTask BPクラスで使用するFinish Execute ノード、Abort関数、Execute 関数、Tick関数とFinish Abortノードについては一応は解説を書きましたがそんなに上手い説明ではなかったです。

以上です。

5.Game DesignポケモンHxHの念能力 Part 4

5.1 今週の作業について

戦闘が開始する前に勝敗が決してしまうポケモンなどの火とか水などのタイプ別な要素に、戦闘中でも逆転出来るHxHの念能力的な要素を追加する事で戦闘そのものが面白いRPG用の戦闘システムを考えました。

ただしこの二つを混ぜるにはバランスが大切で戦闘中でも逆転出来るHxHの念能力な要素を追加し過ぎると、重要な戦闘前に単純なレベル上げやポケモンのようなモンスターを集める意義が無くなりゲームのPlayそのものがつまらなくなってしまいます。

戦闘が開始する前に勝敗が決してしまうポケモンなどの火とか水などのタイプ別な要素が8割、戦闘中でも逆転出来るHxHの念能力的な要素が残り2割位が丁度良い気がします。

ただし戦闘中でも逆転出来るHxHの念能力的な要素をドラゴンクエストの補助魔法の様な存在にしてしまうと、せっかく私が見つけたHxHの念能力的なタイプ別要素がポケモンなどの火とか水などのタイプ別な要素と全く違うと言う事が明確に示せなくなってしまいます。

そこで2021-11-29のBlogの「5.Game Design:ポケモン+HxHの念能力 Part 2」で以下の様な戦闘システムを考えました。

f:id:kazuhironagai77:20211212235909p:plain

これなら戦闘中でも逆転出来るHxHの念能力的な要素が2割しか占めていないにも関わらず明確に主を司る事が出来ます。

これのプロトタイプをUEで作成する事で本当にこのゲームシステムが面白いのか確認します。

ただしこのアイデアだけではプロトタイプの製作を行うのすら十分ではありません。

ので今週はプロトタイプが作成できる程度までこのアイデアを膨らませます。

5.2 戦闘システムの展開について

戦闘は以下のような状態で始まります。

f:id:kazuhironagai77:20211213000117p:plain

Userが操作するキャラは魔術師で使用出来る魔法は、戦闘中でも逆転出来るHxHの念能力的な要素を持つ魔法のみです。2021-11-22のblogで書いた以下のタイプの魔法しか使えません。

f:id:kazuhironagai77:20211213000135p:plain

ので直接、敵の魔術師を攻撃する事は出来ません。

敵の魔術師を攻撃するためには、戦闘が開始する前に勝敗が決してしまうポケモンなどの火とか水などのタイプ別な要素を持つMonsterを召喚する必要があります。

Monsterは戦闘力と直接相手を攻撃出来る魔法を持っています。ので敵の魔術師を攻撃する事が出来ます。

魔術師は戦闘になったら直ぐにMonsterを召喚します。そうしないと敵の魔術師が召喚したMonsterに直ぐに殺されてしまうからです。

f:id:kazuhironagai77:20211213000153p:plain

ここまでが第一Roundです。

第2 Roundでは、魔術師と召喚されたMonsterの両方が戦闘に参加します。

召喚されたMonsterは敵の魔術師を攻撃しようとしますが、敵の魔術師が召喚したMonsterが邪魔しているのでまずは敵のMonsterと戦う事になります。

次に魔術師は、

  • もっとMonsterを召喚する召喚魔法
  • 敵のMonsterを眠らせたり、あるParameterを下げる呪い系魔法
  • 味方のMonsterを回復させたり、あるParameterを上げる祝福

から一個だけ選択して実行します。

霊感はピンとこないので消しました。

この第2 Roundと同じ行為をどちらかの魔術師が死ぬまで繰り返します。

5.3 戦闘システムの展開について Part 2

別なパターンも考えています。

この場合はMonsterと魔術師の戦闘です。

f:id:kazuhironagai77:20211213000244p:plain

この場合は魔術師は最初から一体だけMonsterを召喚しています。

最初のRoundからMonsterは敵のMonsterに攻撃します。

魔術師は

  • もっとMonsterを召喚する召喚魔法
  • 敵のMonsterを眠らせたり、あるParameterを下げる呪い系魔法
  • 味方のMonsterを回復させたり、あるParameterを上げる祝福

のどれかを実行します。

これを繰り返して敵のMonsterが死ぬか魔術師が死ぬと戦闘が終了します。

5.4 プロトタイプのデザインについて

プロトタイプなんで適当に作成します。以下の様な感じで作成してみます。

f:id:kazuhironagai77:20211213000348p:plain

来週から作ります。

6.Map1Bug直しの続き

先週やらなかった戦闘用のMapの直しをやります。

6.1 Good Skyを追加する

f:id:kazuhironagai77:20211213000424p:plain

Good skyは既にセットされていました。

Sky PresetをSun Setに変更しました。

f:id:kazuhironagai77:20211213000442p:plain

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

f:id:kazuhironagai77:20211213000502p:plain

こっちはMidnightです。

f:id:kazuhironagai77:20211213000522p:plain

f:id:kazuhironagai77:20211213000531p:plain

3パターン位作成したいですね。

ただSky Presetの値はBPから変更出来なかったはずです。

Map1でどうやって昼夜を再現しているのかを調べると以下の様に結構Costのかかるやり方でやっていました。

f:id:kazuhironagai77:20211213000554p:plain

Good Skyの方が弄れないのでLight Sourceの値を弄ってその結果、Good skyの値を変更させると言うやり方です。

あ。Good Sky Realtime Updateノードを忘れていました。

f:id:kazuhironagai77:20211213000613p:plain

これを使わないとGood Skyの値を変えても何も変化しないんでした。

昼、夕方、夜の3パターンを作成しました。

f:id:kazuhironagai77:20211213000633p:plain

f:id:kazuhironagai77:20211213000643p:plain

テストします。

f:id:kazuhironagai77:20211213000659p:plain

f:id:kazuhironagai77:20211213000718p:plain

f:id:kazuhironagai77:20211213000736p:plain

3パターン確認取れました。

3つしかパターンがないと結構重複します。最後の赤いパターンを出すために8回位かかりました。

また見た目は良くないですが、前よりはマシになりました。

6.2 石像の(!!)を見えやすくする

f:id:kazuhironagai77:20211213000803p:plain

以下の様に変更しました。

f:id:kazuhironagai77:20211213000822p:plain

足元に(!!)が表示されます。

f:id:kazuhironagai77:20211213000838p:plain

6.3 Monsterの死体を消す

f:id:kazuhironagai77:20211213000901p:plain

消しました。

以下に実装を示します。

f:id:kazuhironagai77:20211213000938p:plain

戦闘が終わって石像から報酬が貰える時に浮遊している骸骨群を消しますが、そのついでにMonsterのActorも破壊しました。

UE4C++の方のRPGGameModeクラスでこのMonsterを消す実装をしてるかもしれませんが実害はないのでそっちはチェックしません。

結果です。

f:id:kazuhironagai77:20211213000954p:plain

綺麗に消えています。

6.4 警告文の表示

f:id:kazuhironagai77:20211213001021p:plain

良く考えたら(!!)を表示するには、ThirdPersonCharacterクラスやUE4C++のRPGGameModeクラスもいじらないといけないし、先週述べた井戸と同じで

f:id:kazuhironagai77:20211213001042p:plain

この問題もあります。

のでこれは今週は中止して

f:id:kazuhironagai77:20211213001102p:plain

看板だけ作成しました。

6.5 所持金を直す

f:id:kazuhironagai77:20211213001134p:plain

探しても探してもSet Game Goldノードで10000をセットしているBPが見つからなくてほとんど絶望してましたが、

f:id:kazuhironagai77:20211213001153p:plain

ここでした。

直しました。

f:id:kazuhironagai77:20211213001219p:plain

結果です。

f:id:kazuhironagai77:20211213001238p:plain

6.6 Playerの操作するキャラの名前を直す

f:id:kazuhironagai77:20211213001322p:plain

ここで名前の指定をしています。

f:id:kazuhironagai77:20211213001341p:plain

変更します。

f:id:kazuhironagai77:20211213001354p:plain

あれ。日本語は表示出来ませんでした。

f:id:kazuhironagai77:20211213001409p:plain

ジョパンニの英語(イタリア語)名はGiovanniでした。

f:id:kazuhironagai77:20211213001426p:plain

直しました。

f:id:kazuhironagai77:20211213001441p:plain

あれ、JOJOの第5部の主人公と同じ名前ですね。

ひょっとして荒木先生はJOJOの第5部の主人公の名前を銀河鉄道の夜の主人公から取ったんですかね。同じ東北出身ですし。もしかするとあるかもしれません。

7.UE5Naniteの勉強

先週までUE5のWorld Partitionの勉強をしました。

World PartitionはUE4には無い機能で、Early Access であるUE5だけの機能です。言い換えると何時無くなっても文句言わないでね。となっている機能です。それでもUE5のWorld Partitionの勉強はとても面白かったです。のでUE5の新しい機能について勉強します。

今度はNaniteについて勉強します。

今週は公式のDocumentであるNanite Virtualized Geometry [17] を読みます。

その前にNaniteってどんな機能なのかもう忘れちゃっています。

最初の文で簡単にNaniteについて解説してました。

Naniteは新しいGeometry Systemで、Pixelレベルの細かさかつReal TimeのRenderingが出来る技術だそうです。

ああ。思い出しました。

要するに今まではGameのPlay中に動かせるActorやMeshはMayaで作成した細かさのLevelで、Z-Blushレベルで作成したMeshは動かせなかった。もしくは物凄い負担をHardwareに強いて動かしていた。それがNaniteを使用する事で普通に動かせるようになる。みたいな技術です。

ただし、この技術に詳しい人のコメントでは、今の時点でNaniteが使用出来るのはNon-SkewなMeshだけ、つまりRigなどでMeshの構造が歪まない固体だけで利用できるみたいな事を聞きました。

この位の前提の知識があればとりあえずNanite Virtualized Geometry [17]を読む事は出来るでしょう。

それでは読み始めます。

7.1 Benefits of Nanite

ここでは、まあ一般人(?)向けにこんな特徴がNaniteにあります。と述べています。

何点か興味深い事が述べられています。それについて感想などを記録しておきます。

f:id:kazuhironagai77:20211213001517p:plain

まずこれです。PolyCountつまりポリゴン数の事だと思うんですが、もうNaniteを使用するからPolygon数をどんなに増やしてもFPSは劣化しないよ。と書いてあります。

こう言われると、Naniteの凄さが良く伝わります。もう単純に凄え!としか言いようがありません。

しかし私が注目したのはこの後のコメントで、Draw CallやMemory Usageの影響も受けないよ。という所です。

凄い。

f:id:kazuhironagai77:20211213001536p:plain

やっぱりZ-Brushについて述べていますね。Z-Brushで作成した3D ModelをそのままUnreal で使用出来るようにするのがUE5の新しい目的の一つみたいです。

f:id:kazuhironagai77:20211213001553p:plain

これは凄い事は凄いですが、Normal MapはNormal Mapで凄い技術だと思うんです。何でNormal Mapを使用しない方が良いのかの説明がほしいですね。

f:id:kazuhironagai77:20211213001617p:plain

おお。LODの仕組みもLODの使用方法も今一分かっていない私にとってはNanite万歳という感じです。このままLODの勉強をしないで済むなら私は大喜びです。

7.2 How a Nanite Mesh is different from a Static Mesh

いきなり核心を説明してくれるみたいです。Nanite MeshとStatic Meshの違いについてです。

で読んだんですが、今一理解出来ませんでした。

まずここで読者が一番知りたい事って、Naniteだとなんでそんな複雑な形状のMESHでもFrame Rateを落とさずに読み込む事が出来るの?という事だと思うんです。その解答として従来のStatic Meshとはここが違うから。のが来るはずなんです。来るはず何ですが、その部分が良く分からないです。

以下にNanite MeshがどうStatic Meshと違うのかについてまとめます。

  • Nanite Meshには(Static Meshと違って)沢山のLODとDataの圧縮が施されています。更にNaniteのRenderingには全く新しい技術が採用されています。

Dataの圧縮は具体的に何を指しているのかは不明です。

全く新しいRenderingの方法の採用に関しては、だからNaniteは複雑な形状のMESHでもFrame Rateを落とさずに読み込む事が出来る。と言えそうですね。

  • NaniteのMeshは複数のUVやVertex Colorを持っています。Materialも動的に変更したり別のShadingを使用したりする事も出来ます。Static Meshと違いMaterialのBakingは必要ありません。

何これ。魔法ですか?

これってNaniteのMeshのサイズがカメラからの距離で変わるからそうなってるんでしょうか?

はい。

素人に「なんでNanite Meshだと複雑な形状のMeshでもFrame Rateを落とさずに読み込む事が出来るの?」と聞かれたら、Nanite MeshはStatic Meshと違って、LODや複数のUV、Vertex ColorそしてMaterialの情報を持っていて、さらに全く違うRenderingをするからだよ。とは答えられそうですね。

合っているかどうかは分かりません。

といか全く知らない事について語ってるので本当にこの解釈で合っているのか自信がないです。

Naniteを理解した後で、もう一回ここを読んだら顔から火が出る位間違った事を言っているかもしれません。しかしそれも何か新しい事を学習するためには通らないといけない道でしょう。転ばないで自転車に乗れるようになる子供はいませんから。

ここで時間が無くなってしまいました。

キリが良いので今週はここまでとします。

8.まとめと感想

このBlogの感想ではないですが、ゲームの事情に疎い私は最近になって知ったんですがPS5って日本では手に入らないらしいです。

UE5の普及とPS5の普及は結構重要な関係があると思っています。この辺の問題について来週のBlogで考察したいと思います。

9.参照(Reference

[1] CGHOW. (2021, November 22). HLSL Triangle code to UE4 Material nodes Tutorial | Download Files [Video]. YouTube. https://www.youtube.com/watch?v=JUnjDu33Nq8

[2] LearnOpenGL. (n.d.). LearnOpenGL - Shaders. Retrieved December 12, 2021, from https://learnopengl.com/Getting-started/Shaders

[3] shadertoy.com. (n.d.). How To - Shadertoy BETA. Retrieved December 12, 2021, from https://www.shadertoy.com/howto

[4] Atan2. (2021, November 21). In Wikipedia. https://en.wikipedia.org/wiki/Atan2

[5] Wikipedia contributors. (2021, November 27). Atan2. Wikipedia. Retrieved December 12, 2021, from https://en.wikipedia.org/wiki/Atan2#/media/File:Arctangent2.svg

[6] Epic Games. (n.d.-a). 1.2 - Material Instance. Unreal Engine Documentation. Retrieved December 12, 2021, from https://docs.unrealengine.com/4.27/en-US/Resources/ContentExamples/MaterialInstances/1_2/

[7] Epic Games. (n.d.-b). 1.3 - Instance of an Instance. Unreal Engine Documentation. Retrieved December 12, 2021, from https://docs.unrealengine.com/4.27/en-US/Resources/ContentExamples/MaterialInstances/1_3/

[8] Tech Art Aid. (2021, July 11). Shader Optimization – True Instruction Cost, Performance Tips // Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=y0QASid1v8w

[9] Jones, T. (n.d.). Shader Playground. Shader Playground. Retrieved December 12, 2021, from https://shader-playground.timjones.io/

[10] Cloward, B. [Ben Cloward]. (2021, November 4). Shader Performance Measurement - Shader Graph Basics - Episode 21 [Video]. YouTube. https://www.youtube.com/watch?v=E82XxlXMJs4&list=PL78XDi0TS4lEBWa2Hpzg2SRC5njCcKydl&index=23

[11] Epic Games. (n.d.-d). Environment Query System Quick Start. Unreal Engine Documentation. Retrieved December 12, 2021, from https://docs.unrealengine.com/4.27/en-US/InteractiveExperiences/ArtificialIntelligence/EQS/EQSQuickStart/

[12] Epic Games. (n.d.-c). Artificial Intelligence. Unreal Engine Documentation. Retrieved December 12, 2021, from https://docs.unrealengine.com/4.27/en-US/InteractiveExperiences/ArtificialIntelligence/

[13] Epic Games. (n.d.-d). Behavior Trees. Unreal Engine Documentation. Retrieved December 12, 2021, from https://docs.unrealengine.com/4.27/en-US/InteractiveExperiences/ArtificialIntelligence/BehaviorTrees/

[14] Wadstein, M. (n.d.). WTF Is? AI. YouTube. Retrieved December 12, 2021, from https://www.youtube.com/playlist?list=PLSlkDq2rO1t47gMJ0GdO5aSTfOKy_TTln

[15] Laley, R. (n.d.). AI. YouTube. Retrieved December 12, 2021, from https://www.youtube.com/playlist?list=PL4G2bSPE_8ukuajpXPlAE47Yez7EAyKMu

[16] Epic Games. (n.d.-f). Navigation System. Unreal Engine Documentation. Retrieved December 12, 2021, from https://docs.unrealengine.com/4.27/en-US/InteractiveExperiences/ArtificialIntelligence/NavigationSystem/

[17] Epic Games. (n.d.-f). Nanite Virtualized Geometry. Unreal Engine Documentation. Retrieved December 12, 2021, from https://docs.unrealengine.com/5.0/en-US/RenderingFeatures/Nanite/