<前文>
<Kyle Rittenhouse Trialって何?>
最近まで全く知らなかったんですが、今アメリカではこの裁判のニュースでもちきりです。それで慌ててどんな事件なのか調べました。
所があまりにも断片的なソースが多すぎて全体像の把握が出来ません。
NY TimeのこのVideo、A Fatal Night in Kenosha: How the Rittenhouse Shootings Unfolded | Visual Investigations [1]を見てやっとどんな事件だったのか全体像が分かりました。
今更、この話題を追っても遅きに失するで、既にあらゆる議論が尽くされてしまっています。
しかも日本にいるとアメリカの生の空気を感じる事が出来ないので、どっちの意見が事実に近いのかとかそういう事も良く分からないので軽はずみに自分の意見を言う訳にもいきません。
ただ、この映像を見るともうアメリカは実質、内戦状態なんじゃないの?と思ってしまいます。
そしてそれは私がずっと前から抱いていた不安、アメリカの衰退の始まりのような気がします。
日本もかなり終わっていますが、アメリカもこれじゃボロボロじゃないですか。
右派と言うかこの武装市民に共通する思想、「力尽くで、秩序を回復する。」は問題の解決からほど遠いです。成功しても相手に憎しみを生み出し、将来的には更なる巨大な敵を生み出します。しかし彼等はその事に気が付いておらず、Footballの試合でもしているかのようにひたすら力押ししています。
対する左派は、上下の連結が完全に終わっていて上は自分の利益ばっかり追って下に負担ばかり押し付けていています。下が上に文句を言うと右派が邪魔してるからそれは出来ないと言いますが、右派が邪魔出来ない分野、例えば大学ローンの免除なんかでも全くやろうとしてない所を見ると右派の邪魔なんで元から存在していない事が丸わかりです。
ハッキリ言って詰んでいます。
しかしだからと言って日本に未来がある訳では全然なく日本の状況はアメリカより更に悪いかもしれません。
日本は技術立国であるにも拘わらず、企業は30年の間、技術の積み重ねを止めてしまいました。
アメリカにいた時に韓国人の友達から良く聞いたのが、韓国だと夜の10時まで実験してるがアメリカは8時過ぎるとアメリカ人から文句が出るので8時までしか実験出来ない。これじゃ韓国との競争に勝てない。と言う話です。
その時、私は日本の企業は5:30で仕事を終にしてるだけでなく、沢山の上司の許可を取らないとそもそも実験すら出来ない事を知っていたのでこれって日本やばいんじゃないの?と思いました。
大体、PHP文庫を読むと1980年代のバブルの頃の日本では、技術系の会社は徹夜で実験してた事、近所の人達からあそこの会社は電気が消えない。って言われている話が散々書かれています。30年実験しなかったらもう外国の技術に追い付く事は無理ですよね。
が、日本のやばさは企業だけじゃないんです。
日本はそもそも東大クラスの工学系の大学院生の数が少なすぎるんです。例えばComputer Scienceの分野だとアメリカや中国は5万人位います。日本は精々1000人ぎりいるかいないか位でしょう。
基本的に工学系の大学院生ってのは給料もらって勉強するんです。考えたらすぐ分かる事ですが、東大クラスの工学系の大学院に入学できる学力を持っている学生なんでどの国でもそんなにいません。だから給料払う事で世界中からリクルートしてくる訳です。そうやって国が科学技術の基礎力を保持しつつ、企業がお金になりそうな分野の技術をリスク取って開拓する訳です。
戦闘力に50倍の開きがあったらポケモンみたいなタイプ別に優劣があったとしても勝負にならんでしょう。
更に日本は法律を変えてまで、中村修二氏のような一人で革命的な開発をした人を追い出してしまっています。だから奇跡的にある分野だけ成功する可能性まで潰してしまっています。私が噂で聞いたのは次世代のCPUは彼がアメリカに渡った後に開発した素材を使用して作成するらしいです。他の候補もあるらしいですが彼が開発した素材を使用したものが最も有力な候補だそうです。
日本も完全に詰んでいます。
前文には、日本人が誤解しているアメリカ、特に日本文化とキリスト教文化の違いから生じる誤解とその対策について在米歴10年の私が気が付く範囲ですが書いておく予定でしたが、今回は単なる私の感想になってしまいました。
たまにはこんなのも良いでしょう。
それでは今週の勉強を始めます。
<本文>
1.今週の予定
今週は以下の内容をやっていきます。
- Niagara: Position変数の調査
- Material : Content Exampleをみる
- NPCのAIを作成するためのAIの復習の続き(Debugについて)
- World CompositionによるMap1の作成(Itemの配置など)
- UE5におけるWorld Partitionの勉強の続き
2.Niagara: Position変数の調査など
2.1 先週のまとめ
先週、Twisted Ribbon in UE4.27 Niagara Tutorial | Download Files [2] を勉強して以下に示したRibbonを作成しましたがこれが原点にしかおけません。
Niagara SystemのParticle:Position変数の値に元のPositionの値を追加すれば指定した位置におけるはずと試してみました。
そしたら
こんな変な形になってしまいました。
今回はParticle:Position変数について勉強してParticleの発生位置を自由に設定できるようにします。
2.2 Niagara: Position変数について
まず、Fountain Emitterを追加したNSを作成します。
これをLevel上に配置すると配置した場所にParticleをまき散らします。
別に原点に拘る事もありません。
このEffectのParticle Position変数を見てみます。
Particle Spawn SectionのSphere Location ModuleのSphere LocationにParticle:Position変数が使用されています。
以下の様に変形してZ軸方向に500を足してみます。
地面から5m位の位置からParticleが発生するようになりました。
やっぱりParticle : PositionがNSの発生する位置を指定しています。
2.3 Twisted Ribbon in UE4.27 Niagara Tutorial | Download Files [2]の最初だけ作成してPositionをみる
最初の部分だけ作成しました。
Set:Particle Positionの設定です。
これでRibbonはいつでも原点に現れます。
これを以下の様に変えます。
これで元々のPositionの値がParticle:Positionに追加されるのでNSを置いた位置にNSが現れるはずです。
おお、出来ました。
でもNSの位置を移動させると付いて来ません。
あ。これの意味は分かりました。
Emitter Update SectionのEmitter State ModuleのLoop BehaviorにOnce、Particle Update SectionのParticle State ModuleのKill Particles When Lifetime Has Elapsedのチェックを外しているからです。
試しにLoop Behaviorにinfinity、Kill Particles When Lifetime Has Elapsedのチェックを入れてみます。
移動しても今度はついてきます。
うーん。これで生成場所はNSの場所になりますね。
でも前のやり方でもPlayを押してテストすると指定した場所にRibbonを表示しますね。
Play前です。
Play中です。
これだったら前のやり方でも悪くはないですね。
2.4 Convertible Floor in UE5 Niagara Tutorial [3] を勉強する
本当は自分でNiagaraのRibbon Renderingを使用して何かOriginalなVFXを作成しようと思い実際に試したんですが、滅茶苦茶になってしまいました。まだ自分だけで何かを作成するのは無理でした。守破離で言えばまだ守の段階でした。ので今回はCGHOW氏のConvertible Floor in UE5 Niagara Tutorial [3]を勉強する事にします。
これをやっていきます。
びっくりしたんですがCGHOW氏の本名ってAshif Aliだそうです。この名前から推測するとほぼ100%イスラム教徒ですね。勝手にインド出身と思っていましたがもしかするとパキスタンの方かもしれませんね。
うーん。インド辺りは良く分からないです。
今週は兎に角、しっかり学ぶを目標にします。
いつも通りFountain Effectから開始しています。
要らないModuleを全部消します。
今回はSpawn Rateまで消しています。
Spawn Burst Instantaneous Moduleを使用するんでしょうか?
Spawn Particles in Grid Moduleを使用しています。
後、このModuleを使用するためにParticles Spawn SectionにGrid Location Moduleを追加しています。
Spawn Particles in Grid Moduleが存在しているのすら初めて知りました。これってUE5 のNiagaraだけに存在しているんでしょうか?
確認してみます。
普通にありました。
先に進みます。
以下のようなParticleが作成されています。
Emitter Update SectionのSpawn Particles in Grid ModuleのZ Countを0にセットします。
こんな風にSpriteの配置が変化しました。
今度はRender SectionにMesh Renderer Moduleを追加します。勿論、Sprite Renderer Moduleは消します。
Mesh Renderer ModuleのMeshに1M_Cubeを追加します。
こんな感じになりました。
今度はParticle Spawn SectionのGrid Location ModuleのXYZ DimensionsのXとYの値を110にセットしました。
こんな感じになりました。
今度はこのCubicに色を付けるためのMaterialを作成します。
今回のMaterialはこんだけです。
Renderer SectionのMesh RendererのOverride Materialsにチェックを入れて先程作成したMaterialを追加します。
こんな色に変わりました。
今度はScratch Moduleを使用して何かするそうです。
以下の実装を作成しました。
うーん。Particle:Position変数のXの値を取り出してるだけですね。
Particle Update SectionにColor Moduleを追加しまう。
Color Moduleに以下の実装を追加しました。
二つの色を表示するためのLerpを使用してるんですね。
成程です。
更にそのLerpに先程Scratch Moduleで作成した変数であるOutput Xをセットしてます。
結果です。
ああ。Xの位置は真ん中だからこういう色の配置になっているんですね。
でもこれXの位置を動かす必要がありますよね。
どうやって動かすんでしょうか。
まず先程のXの値にSubノードを追加します。
引く値はInputでModuleの外で指定します。
あ。
何となくですが想像つきました。
これで移動するための変数をWipe変数にセットするのかと思ったら、その前に色の変化がShape過ぎるからそちらを直すそうです。
その為にDivideをSubtractの後に追加しました。
何でこれで色がFadeするのか不明です。
試してみます。
色がFadeしました。
理由は後で考える事にします。
更に以下の実装を追加する事で、
こんな色に変化します。
この理由については後で考えます。
WipeにCurveを追加します。
DefaultではCurve IndexにはNormalized Ageがセットされているので、
色が動きます。
今度は色だけでなくMeshのサイズも変更します。
MeshのサイズもColorでやった時と同じようにoutput X変数を使用すれば出来ます。
まずParticle Update SectionにScale Mesh Size Moduleを追加します。
そしたらMeshが消えてしまいました。
その理由は、Particle Spawn SectionのInitialize Particle ModuleのMesh Scale ModeがUnsetになっているからです。
Mesh Scale ModeにUniformをセットします。
またBlockが表示されるようになりました。
Particle Update SectionのScale Mesh Size Moduleに
以下のセットをします。
結果です。
動いていますね。
よく見ると下側にもBlockが伸びています。
下にBlockが伸びても仕方ないので直します。
Renderer sectionのPivot OffsetにZにだけ50を追加しました。
結果です。
0より下はないですから。
回転を加える場合です。
Particle Update SectionにUpdate Mesh Orientation Moduleを追加します。
設定は以下の様にします。
こんな結果です。
回転が途中で止まってしまうのでRotation VectorのYの値を2.5に変更しています。
よく見ると波が最後まで行かない場合もありますね。
どっかでやり方を間違えている可能性がありますね。
この後でCubeのサイズを変更する方法も紹介していますが、今週はここまでとして残りは来週やる事にします。
3.Material : Content Exampleをみる
今週はContent ExampleのMaterialの項目をみてどこが理解出来てどこの勉強が足りないのかを把握する事にします。
Content ExampleにはMaterialに関係したMapが以下に示した数だけあります。
一個ずつ見て行きましょう。
3.1 Material Nodesを見る
多分これが一番基本的なやつでしょう。これから見て行きます。
<Base Color>
Base Colorです。
やっぱりこれがMaterialの一番基本的な機能を紹介していますね。
<Metallic>
Metallic の機能についての解説です。
Metallicは0か1以外の値は取れないはずなのに0.5が例として使用されています。
一応解説には0.5の値を取る場合はほとんどないと書かれています。
Metallic が1の時はMaterialが金属の時です。
このScreenshotを見て突然思いだしたのですが、Specular lightを鏡面反射光と訳している3d Graphicsの教科書があります。
この訳って結構誤解を生む表現だと思います。
鏡面反射光と聞くと普通は上のScreenshotだと鏡のように回りの風景を写している部分を指している事になりかねないからです。3D GraphicsにおいてSpecular lightは白く輝いている点状の反射光を指します。
の事です。
これはDot Productと内積以上のクソ訳ですので、いつか徹底的に追及します。
<Specular>
Specular Reflectionの話をしていたらSpecularについての解説が次にありました。
Specularが0のやつを見れば分かりますが白く光ってる反射光がありません。
これがSpecular lightが無い状態です。
Specularが1の時です。
白く光っている箇所がありますね。この部分がSpecular lightに当たります。
いやいや、Specularが0でも白く光ってる部分があるじゃないか?と指摘する人がいるかもしれません。
確かに下のScreenshotをみるとSpecularが0にもかかわらず白く光っています。
これはうろ覚えなんですが、PBRの計算方法では、Roughnessの値が最終的にSpecularの値に幾分かの影響を与えていたからだと思います。
昔、Epic社の出した論文(たしかReal Shading in Unreal Engine 4だったと思います。)を元にOpenGLでPBRの実装を自分で作成したのですが、その時Roughnessの値がSpecularの値に還元されているのに、自分でSpecularの値を指定する事も出来るので混乱した事を覚えています。
実際、この灰色のプラスチックの部分のMaterialを見ると
Roughnessに0.2の値が加えられています。
ただMetallicの値が0.3と自然界ではありえない値がセットされているので、それもこの白い反射光の生成に影響を与えている可能性もあります。
<Roughnessについて>
Metallicの項でSpecularについての話題を出したら次の項がSpecularで、Specularの項でRoughnessについての解説をしたらこの項がRoughnessでした。
Roughness = 0の場合です。
黒い部分に使用されているMaterialの実装です。
Roughness=0.8の場合です。
うーん。全くSpecular lightがなくなりました。
<Emissive について>
Emissiveに1以上の値を入れると光始める事は知っています。
それ以上の事は知らないです。
<Opacityについて>
OpacityはMaterialの設定がDefaultではなかったはずです。
それから確認します。
Blend ModeがAdditiveに変更されていますね。
これについてちょっと調べて見ます。
公式のDocumentであるMaterial Blend Modes [4] をみるとAdditiveの項に以下に示した様な詳しい解説がありました。
黒が透明として扱われると書かれていますね。貴重な情報です。
そう言えばMaterialに関する公式のDocumentを今まで見ていませんでした。
ちょっと見てみます。
公式のDocumentのMaterials [5] です。
色々な分野の解説がここにまとめられていました。
この辺の話題は直ぐに読みたい分野です。
この分野なんか今、勉強している所と丸被りしてます。
まだ見なければならないMaterialがこんなにあるので、今回は公式のDocumentは読みませんが後でまとめて勉強します。
<Opacityをみる>
Sub Surfaceって人間の皮膚を再現するための機能でしたっけ。
Sub Surface無しが左、有りが右です。
何か粘土っぽさが増している気がします。
Materialの設定をみるとBlend ModeがOpaqueで更にShading ModelがSubsurfaceにセットされています。
公式のDocumentのShading Models [6] にはSubsurfaceの解説が載っています。
更にその先のLinkにSubsurface Shading Model [7]もあります。
ぱっと読みましたが、あんまり詳しい解説ではなかったです。
左がOpacityが0で、右がOpacityが0.5です。
右の方が人間の皮膚などの光の反射をより正確に表しているはずですが、こうやって単に2つ並べると右の方が汚いです。
<Opacity Maskについて>
この機能はNiagaraの勉強で散々使用したので知っています。
設定はBlend ModeがMaskedですね。
公式のDocumentであるMaterial Inputs [8] にOpacity MaskとOpacityの違いが説明されていました。
透明が不透明かをはっきりさせたい時はOpacity Maskを使用する訳ですね。
<Normalについて>
うーん。
このまま見てるだけだとあんまり勉強にはならないかもしれませんね。
Normal Mapと言うと今制作中のGameのガラス瓶の一部に陰が全くつかない理由はそれらのガラス瓶に使用されているMaterialにNormal Mapが使用されていないからじゃないのか?という仮説を随分前に建てました。
これですね。
今考えるとNormal Mapの影響はあんまりないでしょうね。
むしろBlend Modeの設定が違うのが理由でしょうね。
こっちが陰のないガラス瓶に使用されていたMaterialの設定で
こっちが陰のあるガラス瓶に使用されているMaterialの設定です。
実際にこのNormal Mapの例のNormal Mapを使用していない方も陰がしっかりついています。
試しにこっちのMaterialの設定をみたら
陰なしのガラス瓶と一緒でした。
うーん。
分からん。
<World Position Offsetについて>
使用されているMaterialの内の一つを開いてみました。
設定は一番基本のやつでした。
これも何でMaterial内でStatic Meshの位置が動かせるんだ。とか、動かせるようになっているんだ。とかいぶかしげに思うかもしれませんが、OpenGLなどのvertex shaderを思い出すと、ああ、GPUの中でVertexの位置を動かしているからか。と理解出来ます。
<World Displacement について>
初めて知らない奴に出会いました。
なんだこれは。と思って見たらTessellationについてでした。
何だ。Tessellationならこの前(2021-10-31のBlog)使用したわ。と安心してMaterialを開いたら
World Displacement とTessellation Multiplierは違いますね。
これは個別の勉強が必要ですね。後でする事にします。
<Tessellation Multiplierについて>
Tessellation Multiplierだけでもサンプルが配置されていました。
そのサンプルで使用されているTessellationの設定です。
因みに2021-10-31のBlogで使用したTessellationの設定はこれです。
Tessellationについての公式のDocumentがないか探したら1.12 - Tessellation Multiplier [8] が出て来ました。
いやちょっと待ってよ。
Material Nodeって項目があるじゃないですか?
最初から教えて下さいよ。こういうのは本当に。
公式のDocumentのMaterial Nodes [9] のPageです。
今まで見てきた内容の全てに関しての詳しい解説がここに載っていました。
これをもう一回見ないといけないのかよ。
やるしかないです。
<1.1 Base Color [10] >
公式Documentの1.1 Base Color [10]を読んでいきます。
しっかりContent Exampleで提供されているサンプルの解説です。って書かれていますね。
読みます。
あんまり大した解説じゃなかったですね。
要点をまとめると
- RPGの3つの値をパスする
- 値は0~1の間
- Textureをパスする事も出来る。
位でした。
<1.2 – Metallic [11] >
これも短い解説だけです。
腐食したり錆びたりした金属は0と1の間の値を取ると書いてある部分は間違っていると思います。これは錆びた部分は0、錆びてない部分は1になるが正解だと思います。
こんなにグダグダになるとは思わなかったので一端仕切り直しをします。
ここでこれは中止にして来週やる事にします。
3.2 Derivatives DDX DDY - Shader Graph Basics - Episode 18 [12]を勉強する
予定を変更してBen Cloward氏のDerivatives DDX DDY - Shader Graph Basics - Episode 18 [12]を勉強する事にします。
軽く全部見ました。
今回はDDXノードとDDYノードについての理論と3つの応用について勉強します。
<理論>
DDXが提供された点のx軸方向の傾きを返し、DDYが提供された点のy軸方向の傾きを返すそうです。
このTutorialでははっきりとは述べていませんでしたが、Pixel上の点とその左右、もしくは上下の点をWorld Coordinateまで変換して傾きを求めているみたいです。
<応用1>
DDXとDDYを使用してNormal Vectorを計算します。
計算したNormal VectorはTransform ノードを使用してTangent Coordinateに変換した後にNormal Inputにパスします。
以下に実装を示します。
結果です。
なんでこんなにカクカクになるんでしょうね。
後、Transform VectorノードはCoordinate間の変換をするためのノードです。
<応用2>
Long Lat Textureを球体に貼る。
以下の実装でLong Lat Textureを球体に貼る事が出来ます。
使用したLong Lat Textureはこれです。
偶然ですがTutorialに使用しているImageと全く同じモノを見つけました。
結果です。
Tutorialによるとこの球体に一か所だけ切れた場所があるそうですが、
これですかね。
この線をDDX、DDYを使用して消すそうです。
以下の実装をしました。
結果です。
確かに線が消えています。
理屈は全然分からないですね。
<応用3>
Hight Map TextureをBump Mapのように使用して球をデコボコにする。
これは実装が複雑過ぎるの見るだけにします。
以下の実装をしていました。
このノードが上の計算と同じ事をしてくれているそうです。
Perturb Normal LQノードを使用してTutorialと同じ実装を作成しました。
こんな結果になりました。
はっきり言ってTutorialのような
デコボコにはなりませんでした。
使用したTextureの違いのせいでしょうか?
4.NPCのAIを作成するためのAIの復習の続き(Debugについて)
公式のDocumentのAI Debugging [13]を勉強していきます。
4.1 AIのDebugを勉強する前にしなければならない事をやる
<キーボードが日本語設定のUE4に必要な設定の変更>
ここで大変だったのが日本語設定のUE4だと’を押してもDebug機能が働かない事です。
2021-02-07のBlogを見ると
と書かれていました。
あれ。こんな簡単だったけ。兎に角、試してみます。
Playを押してゲームを開始します。そして1を押します。
普通に出て来ました。
<Play中にTab keyを押す事で自在に動きまる>
2021-02-01のBlogでOnline Learningにある
を勉強していますがそこでDebug中の移動に関して
と述べています。
確かこれのやり方は後で判明したんですが、覚えていません。
調べます。
ありました。同じ週のBlogに書かれていました。
試してみました。
<AI Debugが表示されない>
対象となりNPCを見ながらDebug key(私の設定の場合は1)を押します。
4.2 AI Debugging [13] を勉強する
もうどうでもいいですけど、今度はAI Entityですか。Agentって読んだりして統一してほしいです。
AIによって操作されるNPCと一々言うのは面倒ですが、
<Enabling AI Debugging>
Apostropheを押す事でAIのDebugが出来ます。と書かれています。
ふと思ったんですが、公式のDocumentなので日本語訳ってついているはずです。
その日本語訳ではどうしてるんでしょうか?
普通にApostropheを押したら出来ますって書かれていますね。
ひょっとすると今は出来る様になっているでしょうか?
わざわざこのためにAIを組むのは面倒なので昔、AIを組んだProjectを開いてApostropheを試してみました。
Shift+7を押してみましたが、AI Debugは表示されませんね。
うん。
分かりません。
でも実用面では、Shift+7で出来たらそれでOKですし、出来なかったら上記の方法で直せば良いだけです。
Numpadのkeyで表示される内容が変えられるとあります。
表示されているDebug AIを読むと最初から1のAIと2のBehavior Treeの情報は表示されていますね。
ちょっと見にくいですがAIの情報です。
Behavior Treeの情報です。
思い出して来ました。
この辺は前結構しっかり勉強したはずです。
Numpadの4を押してPerceptionを起動します。
これですわ。前回はこれを見てMonsterのAIを調節していたんです。
<Nav Mesh>
Nav MeshですがNumpadの0を押すとNav Meshが表示されます。としか説明していません。
確かにNumpadの0を押したら現在使用中のNav Meshが表示されています。
これらの表示の解説はないですね。
これだけでは何をDebugしているのかは分かりません。
先週のバグでMonsterが動かない時がありましたが、
こういう時にこのDebugをすると使用中のNav Meshが視覚化されてNav Meshが働いていないとかが分かるのでしょうか?
それぐらいしかこのDebugの使い道が分かりません。
<AI>
今度はNumpadの1を押した場合です。
今度は表示されているそれぞれのParameterについての解説がありました。
Controller Nameは使用しているAI Controllerの名前ですね。
Pawn Name は対象のNPCの名前みたいです。名前を確認したらNPCとなっていました。
Movement Modeですが、これ具体的に何を指しているのか分かりません。
Baseは現在、NPCがいるMeshを表しているそうです。
Nav DataはNavigation classを表してるとありますが、それが何なのかが分かりません。Defaultだとどうなるんでしょうか?
Path FollowingはNPCが向かっている方向を示しているんでしょうか?MovingがNPCが現在動いている事を示しているのかもしれませんね。
Behavior。これは分かります。Behavior Treeのどれが実行されているかを示してるはずです。
違いました。
Behavior Treeが実行されていたらRunningと表示されるそうです。
じゃさっきのMovement ModeはNPCが走ったらRunningとかに変わるんでしょうか?
変わらなかったです。
調べたらCharacter クラスのCharacter Movement内に
Default Land Movement ModeとDefault Water Movement Modeがありました。
これを表しているでしょうか?
でもこれを知る必要ってどんな時なんでしょうか?
Movementについては全然知らないので実は重要なのかもしれませんが分かりませんね。
Treeは使用しているBehavior Treeを表示します。これは沢山のBehavior Treeを使用するようになると重要になりそうです。
Active Taskは現在Behavior Treeで実行されているTaskを表示します。
この辺はBehavior TreeのDebugを使用した方が分かり易いですね。実際、ここではMove toが実行されていると表示されていますが、使用しているBehavior TreeであるNPC_BTを開いてみたらTaskのMove toは3つもあってどのMove to を使用しているのかはこれからは分かりません。
Game Taskは
と説明されていました。このQueueが所謂Computer scienceでいう所のQueueならば処理待ち中のTaskの数と言うことでしょうね。
そう言えばQueueとかStackってどのComputer scienceの教科で習ったんでしたっけ。当たり前過ぎて覚えていません。
今、日本で流行っている3カ月でProgrammerになれるみたいな学校って本当にこういう基礎教えているんでしょうか。こういう基礎って地味に後で効いてきますよね。知らないと。
Montageは全く何の事か分からん。
説明を見たら
と書かれていました。
Animationに関係がある事は分かりました。
Third Person Anim BPを開くと
Montageと言う言葉はそこかしこで使用されています。
調べて見ます。
公式のDocumentでAnimation Montage[14] がありました。
このRemarkはMontageが何なのかを簡潔に説明していますね。
しかもこんな沢山の節がその中にあります。
この辺を勉強した後じゃないとここのMontageが何を指しているのかは分からないです。
この辺は後でじっくり勉強しましょう。
<Behavior Tree>
Behavior Treeに関してです。
左側ですが、今使用しているNodeを表示してるそうです。
となると以下のNodeが使用されている事が分かります。
Behavior TreeのDebugから確認しても同じ結果を示していました。
右側のBlackboard は今Behavior Treeで使用されているBlackboard内の変数とその値を示してます。
この情報は結構有り難いです。
<EQS>
これは来週EQSを勉強した後にやります。
<Perception>
はいやっとPerceptionに来ました。
これについては解説がありませんでした。
多分ですが赤で囲ったGreenがSight、その両脇のGreenがRange Inでしょう。
でもそうするとRange OutのNeon Pinkがないですね。
となると以下のNeon Pinkの部分がRange Outでその中のGreenが Range Inと言う事になりますね。
黄色のHearingもこれなら緑の内側の枠になります。
Range LoSについては分かりませんね。
後はこのボールですがLast Known Locationと言うそうです。
NPCから見えたPlayerの操作しているキャラの位置を示すものだそうです。
これでDebugの復習も大体終わりました。
5.Game Designについて
AIのDebugの復習のために2021-02-01のBlogを読んでいたら、HxHの念能力をGameに応用したらこうなる。的な話が書かれていました。
こんな事を書いた事すっかり忘れていたんですが、改めて読み直したら大変面白かったです。
それで何でこんなに面白かったのか後で考えてみました。
その時のBlogにも書かれていますが、戦闘が開始した時点で勝敗が決定してしまっているのを戦術次第で逆転出来る可能性が出て来るからだと思います。
私を含めて多くの人がHxHの念能力をポケモンなどの火とか水などのタイプによる分類の亜流と捉えています。
これが間違っていました。
ポケモンなどのタイプによる分類を突き詰めると戦闘の勝敗は戦う前に全部決まってしまいます。言い換えれば戦略が全てです。
それに対してHxHの念能力は戦闘中の使い方を工夫する事でいくらでも逆転出来る可能性があります。つまり戦術で戦略を凌駕する事が可能になるんです。
つまりポケモンなどのタイプによる分類とHxHの念能力の分類は全く違うものなんです。ここを理解しないと何でHxHの念能力が面白いのかが分からなくなってしまうんです。
Turn制のゲームで今最も人気があるのは、タイプ別で勝敗が決まるポケモンだと思います。しかしあまりゲームをしない私でもポケモンの戦闘の勝敗は戦う前に結構な確率で決まってしまう様に感じます。ここにHxHの念能力を組み合わせる事が出来ると、ポケモンの戦闘における戦略的な面白さにHxHの念能力による戦術的な面白さが加わった今までにない仕組みのTurn制のゲームが出来る気がします。
これってひょっとすると次世代のTurn制ゲームのためのとっかかりを見つけたのかもしれません。
RPGにおける魔法をHxHの念能力のような戦闘中に使用すると逆転勝利につながるものと、ポケモンの様な火とか水などの属性に関するモノ(つまり戦闘前に準備すべきもの)に分類して、今まで漠然と存在していたRPGの魔法を2種類に分類しました。
その中でHxHの念能力のような戦闘中に使用すると逆転勝利につながるもの(仮に戦術的魔法と呼ぶ事にします。)を念能力に合わせて分類し直すと、結構無理が出て来ました。
そこで新しく分類表を作成し直して以下の様にしました。
<祝福系>
味方のStatusを一時的にUpする魔法
回復、治癒を行う魔法。
味方の不利な属性を有利な属性に変更する魔法
HxHの強化系と変化系に回復能力や徐念の能力を加えた。
<呪い系>
敵のStatusを一時的にDownしたり、眠らせたりするタイプの魔法。
毒のような持続的なダメージを与える魔法。
敵の有利な属性を不利な属性に変更する魔法。
HxHの操作系と変化系にドラゴンクエストの補助魔法の一部を追加した。
<召喚系>
Monsterを召喚するだけ。
HxHの具現化系の能力はここに追加
<霊感>
敵の戦闘力や使用出来る魔法の種類を見たり、自分の存在を敵から感知されないようにするタイプの魔法。
Narutoの感知タイプのようなもの
流石に今回のRPGに組むのは無理ですが次回のゲームにはこのアイデアはぜひ追加したいです。
6.World CompositionによるMap1の作成(Itemの配置など)
一応、先週でItemの配置以外のMap1の改良は終わったので色々なテストをしてバグ出しをしたいと思います。
6.1 銀河鉄道に乘ってLandscape4に移動した後、Map1に戻って来る
普通に戻ってこれました。
6.2 Start 画面からMap1に移動
Start 画面からMap1に移動しました。
問題なく始められます。
勿論、Warpした後、Landscapeが表示されない問題は解決していません。
6.3 死亡した後、特に落下死の後
死亡した後に表示されるLoad画面が戦闘時に移動する時と同じです。死亡専用のLoad画面を作成しこの画面で使用する必要があります。
死亡後に表示される画面です。
ゲームオーバーではなく墜落死ですね。
6.4 墜落死画面の直し
墜落死画面を直していきます。
墜落死用のテストのために崖を登っていたんですが、結構楽しいです。
これだけで1本のゲームになりそうです。
6.5 山の隙間に短剣(小)を配置する
取りあえず静的に短剣(小)を配置してみました。
これを取りに行きます。
こんな感じで配置されていました。
装備してみます。
普通に使えますね。
6.6 山の隙間に短剣(小)を配置する
探検(小)が配置されているSub Level3_3のBPに以下の実装をしました。
当然、Game Instance BP内には
新しい配列、Item Spawn Data 3_3を作成し
先程、静的に配置した短剣(小)のDataを写しました。
Sub Level3_3のBPに作成した関数、Spawn ItemはMap1のBP内に設定されているものをそのままCopyしました。
これ見るとMonsterをSpawnした時と少しだけ実装が違います。なぜか最初にLevel名を確認しています。
何故これをやったのか覚えていないのでこのままにしておきます。
テストします。
はい。短剣(小)が動的に生成されていました。
6.7 取ったアイテムが二度と再生されないようにする
先週、Monsterでやったのと同じ様に一回取ったアイテムが再生されないようにします。
何と、一回取ったアイテムをGame Instance のItem Spawn Dataから消去する実装はWidget BPであるPick Up Item内で実装されていました。
その部分を以下の様に改良しました。
Remove Picked Item関数の実装。
まだ一か所にしかItemを配置していないのでこれだけです。後でSwitch内のNameが増えます。
Remove Picked Item Helper関数の実装です。
今度は参照するData Tableは間違っていません。
テストします。
一回Itemを取ってから、Monsterと戦闘して戻って来ました。
Itemは再生されていません。
出来ました。
7.UE5におけるWorld Partitionの勉強の続き
先週、World Partitionの勉強をしていて
One File Per ActorとLevel Instancingの勉強はしていない事に気が付きました。
今週はこれらを勉強します。
7.1 One File Per Actor [15] の勉強
公式のDocumentであるOne File Per Actor [15]を勉強します。
UE4までは一人がLevel Designをしている時は他の人はその人が作業を終えてからLevel Designをする必要がありました。UE5は同時に複数の人がLevel Designをする事が出来ます。
それを可能にしたのがこのOne File Per Actor(OFPA)だそうです。
One File Per Actor(OFPA)はLevel上に配置されたActorのDataを別なFileにSaveするそうです。
<Enabling One File Per Actor>
えっ。
One File Per Actorって勝手に自動でやってくれてるんじゃないの?
こっちでEnableに設定しないといけないの?
と思いながら読んだら、手動で色々な粒度(granular)に設定出来て、その設定方法についての解説のようです。
それぞれのActorのDetail画面から設定する方法です。
例えばMap上に配置したCubeの場合ですと、
Cube(Instance)を選択して
Actorの中の
Package Modeを
ここで突然説明が終わってしまっています。
これをExternalにしないといけないのか、InternalでもOne File Per Actor(OFPA)が作動しているのか分かりません。
というかInternalだとOne File Per Actor(OFPA)が作動していないのなら、最初の解釈が間違えていてOne File Per Actor(OFPA)を起動するには手動でセットする必要があるとなります。
解説を見てみます。
うーん。
これ読むとInternalでもExternalでもOne File Per Actor(OFPA)は作動しているけどSaveするDataの細かさが違うとは読めませんね。
Actor is packaged alongsideはOne File Per Actor(OFPA)ではない従来のActorのDataの保持方法を指しているように思えます。
良く分からない。
この辺を詳しく解説した他のTutorialが出るのを待つか、Package ModeをInternal にしたまま、2人で同時のLevelを編集してもActorがきちんとSaveされているかを確認するかしないと結論は出せませんね。
と思ったら図の下に詳しい解説がありました。
読んでなかった。
分かりました。
最初の解釈が間違っていました。
2行目の文に以下の様に書かれていますが、
このEnableは「OFPAを使用出来るようにするためには」と言う意味が主で「手動で出来る」と言う意味が主ではなかったです。
このPackaging ModeをExternalにして初めてそのActorはOne File Per Actor(OFPA)でSaveされるようになるみたいですね。
後、Granularの意味は粒度というより「細かく」と解釈するのが正しいみたいですね。
調べたら粒度はgranularityでした。
次はLevel毎にOne File Per Actor(OFPA)を設定出来る方法が書かれていました。
--ここでEnable World Composition と述べている箇所は、Use External Actorsの間違いです。次の週に訂正を載せます。--
World SettingのEnable World Compositionにチェックを入れれば良いそうです。
いやその後がまだありました。
チェックを入れた後でSaveする必要があり、Saveすると
出て来るのでこれをYesと選択する必要があるそうです。
試してみます。
Enable World CompositionにCheckを入れた瞬間に聞いて来ました。
これだけ確認出来れば十分なのでNoを押してCancelします。
あれ、それでもチェックが付いていますね。
Yesを選択した場合はこのLevelに存在している全てのActorをexternal packagingに移すのは理解しましたが、Noを選択した場合はどうなるのでしょうか?
Cancelした場合とは違い一部のActorはExternal packagingに移すのかもしれませんね。
<<Enabling One File Per Actorのまとめと感想>>
軽く読んだだけですが、幾つか重要な知見を得る事が出来ました。
まずOne File Per Actorは勝手に自動でやってくれている訳ではなかったです。手動でセットする必要があります。
次にOne File Per Actorの設定方法は2種類あり、一つ目はActorのInstance毎にセットする方法で、そのActorのInstanceのみがOn File Per Actorになります。2つ目の方法はLevel毎にセットする方法で、そのLevelに配置されているActorのInstanceすべてがOne File Per Actorとなります。
正しこの2つ目のやり方で
にNoと答えた時に一部のActorはOne File Per Actorにセットされるのかどうかは不明です。
後、おまけでGranularは細かいが正しい訳で、粒度は間違っていました。粒度の正しい訳はGranularityでした。
この単語についてはいつか前文で詳しく検討したいです。
<Converting Sub Levels>
Use External Actorsを使用した場合、つまり先程の2番目のやり方で、OFPAにした場合ですね。この時は今のLevelに存在しているActorのInstanceのみがOFPAになるそうです。
うーん。ちょっと意味が分からない。
どういう事?
先を読んだら分かりました。
このLevelに属している全てのSub Levelに存在しているActorのInstanceもOFPAにするためにはそれぞれのSub LevelをLoadしてActiveな状態にしてUse External Actorsを使用する必要があると書かれていました。
つまり今LoadしてなかったりActiveな状態になってないSub Level上に存在しているActorのInstance達はOFPAにはなってない。と言う事です。
でもそれだと一々新しいSub Levelを読むたびにUse External Actorsを使用する必要があって大変面倒くさいです。
それを解消するためのCommandがあるそうです。
UE4Editor.exe -run="ConvertLevelsToExternalActorsCommandlet" -nosourcecontrol -convertsublevels " OFPAにしたいLevelの場所"
だそうです。
勿論、試しませんが一応頭に入れておくだけします。
<OFPA With Source Control>
source control applicationが何を指しているのか分かりませんね。
まずView Changelist windowを開いて見ますか。
うーん。これも分からん。
あ。分かりました。Source Control ってGithubみたいな所でVersion ControlしてProgrammingを一括で管理している時の話でした。私は今一人でPRGを作っているのでVersion Controlは使用してませんから私のUE5からでは出来ないはずです。
今度、二人以上でGameを作成する事になったらVersion Controlを使用するのでそん時に試します。
8.まとめと感想
今週と言うか最近の傾向として、量は沢山やったんですが質が落ちている気がします。やれる量には限りがあります。精々頑張っても2倍が限界でしょう。その代わり質は3倍でも10倍でも下手したら100倍にも出来ます。もっと頑張る方向を質を向上する方に向けるべきでした。
質を向上するための努力は量を増やす努力とは方向性が違います。
昔どうすれば質を向上出来るのかまとめたんですが無くしてしまいました。のでもう一回ここに書いて置きます。
- 練習は完璧を作らない。練習が作るのは習慣だけである。完璧な練習のみが完璧を作る
- 三時間、三週間、三カ月で成果の確認を。期待した成果が出ない時はその練習や勉強の中止を。
- よい教科書やTutorialは常に探しておく。人が30時間かけて理解した事でも、説明するのは30分で済む。
- ストレスを貯めない。ストレスがあると頭が働かなくなる。
- 良く休む。
- 成功した人の意見を聞く。失敗した人ややらない人、出来ない人でも威厳があってもっともらしい事を言う人は多い。しかしそういう人の意見を聞くのは無駄。
- 慌てない。正しくやる人には、常に十分な時間がある。
- データは正確に読むように心がける。Correlation(相関関係)とCausation(因果関係)を間違えない様にする。
後、最近気が付いたのは一端、こいつは駄目だ。と一端烙印を押した人が、たまたま凄い発見をしたり良いアイデアを思いついた時に、その発見やアイデアそのものをきちんと検討しないで、こいつが言ってんだから駄目に決まっている。とはなから無視して折角の良い発見やアイデアを無駄にしてしまう事がある事です。
<参照(Reference)>
[1] The New York Times. (2021, October 28). A Fatal Night in Kenosha: How the Rittenhouse Shootings Unfolded | Visual Investigations [Video]. YouTube. https://www.youtube.com/watch?v=VpTW2AJE9MQ
[2] CGHOW. (2021b, October 11). Twisted Ribbon in UE4.27 Niagara Tutorial | Download Files [Video]. YouTube. https://www.youtube.com/watch?v=RvTQup0Jxf4
[3] CGHOW. (2021a, August 23). Convertible Floor in UE5 Niagara Tutorial | Download Files [Video]. YouTube. https://www.youtube.com/watch?v=pxSdLRMv8hY
[4] Epic Games. (n.d.-f). Material Blend Modes. Unreal Engine Documentation. Retrieved November 21, 2021, from https://docs.unrealengine.com/4.27/en-US/RenderingAndGraphics/Materials/MaterialProperties/BlendModes/
[5] Epic Games. (n.d.-h). Materials. Unreal Engine Documentation. Retrieved November 21, 2021, from https://docs.unrealengine.com/4.27/en-US/RenderingAndGraphics/Materials/
[6] Epic Games. (n.d.-j). Shading Models. Unreal Engine Documentation. Retrieved November 21, 2021, from https://docs.unrealengine.com/4.27/en-US/RenderingAndGraphics/Materials/MaterialProperties/LightingModels/
[7] Epic Games. (n.d.-k). Subsurface Shading Model. Unreal Engine Documentation. Retrieved November 21, 2021, from https://docs.unrealengine.com/4.27/en-US/RenderingAndGraphics/Materials/LightingModels/SubSurface/
[8] Epic Games. (n.d.-c). 1.12 - Tessellation Multiplier. Unreal Engine Documentation. Retrieved November 21, 2021, from https://docs.unrealengine.com/4.27/en-US/Resources/ContentExamples/MaterialNodes/1_12/
[9] Epic Games. (n.d.-g). Material Nodes. Unreal Engine Documentation. Retrieved November 21, 2021, from https://docs.unrealengine.com/4.27/en-US/Resources/ContentExamples/MaterialNodes/
[10] Epic Games. (n.d.-a). 1.1 - Base Color. Unreal Engine Documentation. Retrieved November 21, 2021, from https://docs.unrealengine.com/4.27/en-US/Resources/ContentExamples/MaterialNodes/1_1/
[11] Epic Games. (n.d.-b). 1.2 - Metallic. Unreal Engine Documentation. Retrieved November 21, 2021, from https://docs.unrealengine.com/4.27/en-US/Resources/ContentExamples/MaterialNodes/1_2/
[12] Cloward, B. (2021, October 14). Derivatives DDX DDY - Shader Graph Basics - Episode 18. YouTube. Retrieved November 21, 2021, from https://www.youtube.com/watch?v=1HTMoCaY0xw&list=PL78XDi0TS4lEBWa2Hpzg2SRC5njCcKydl&index=18
[13] Epic Games. (n.d.-d). AI Debugging. Unreal Engine Documentation. Retrieved November 21, 2021, from https://docs.unrealengine.com/4.27/en-US/InteractiveExperiences/ArtificialIntelligence/AIDebugging/
[14] Epic Games. (n.d.-e). Animation Montage. Unreal Engine Documentation. Retrieved November 21, 2021, from https://docs.unrealengine.com/4.27/en-US/AnimatingObjects/SkeletalMeshAnimation/AnimMontage/
[15] Epic Games. (n.d.-i). One File Per Actor. Unreal Engine Documentation. Retrieved November 21, 2021, from https://docs.unrealengine.com/5.0/en-US/WorldFeatures/OneFilePerActor/