<前文>
前文には、アメリカで10年暮らした私が、日本人が誤解しているアメリカ、特に日本文化とキリスト教文化の違いから生じる誤解とその解決法について書いて置きます。
普段は私の話を鼻で笑っている人達が、仕事や学校で突然アメリカに行く事になると、私の所に滅茶苦茶真剣に聞きに来るんです。やっぱりアメリカで逮捕されたり、銃で撃たれたりするのは誰でも怖いみたいですね。でもそういう奴には、ここで書いている話は有料で売る事にしようかと思っています。
良く日本では、宗教、政治、差別の話題はアメリカではタブーである。と言われていますが、全くの嘘です。
実際は、宗教、政治、差別でしっかりした意見を持っていない奴は軽蔑されて全く相手にされなくなります。
今週は、テキサス州の中絶禁止法を例にして説明します。
私の住んでいた場所は結構な田舎の州で、物凄く保守的なんです。日曜日はみんなして教会に行くのが当たり前みたいな。流石に大学生はそこまで宗教的じゃない人も多かったですが、それでもかなりの数の学生が日曜日は教会に行っていました。
そんな中である日、かなり保守的で、日曜日には必ず教会に通うアメリカ人の友達が「今日は教会で長年の疑問に対する答えらしいモノを教えてもらった。」と言うんです。
私も暇だったのでどんな話か聞いたら「家の隣に引っ越して来た人が、ゲイだったらどう対応するのがキリスト教徒として正しいのか?」に対する解答だと言うんです。
何でこんな事に長年悩んでいるのかすら、日本人にはよく分からないかもしれませんが、キリスト教徒にとっては十戒は最も守らなければならない戒律で、下手をすると自分の命より厳しいものなんです。そしてその十戒には「ゲイは禁止する。」と「隣人を(自分の家族の様に)愛せ。」と両方が書かれているんです。
だから「家の隣に引っ越して来た人が、ゲイだったらどう対応するのが正しいのか?」がとても重要な問題になるんです。
はい。
彼の答えは結構複雑で、その意味を理解するためには更なるキリスト教の概念を理解しないといけなかったんですが、簡単にまとめるとこんな感じです。
神様は全知全能である。ので何でも出来る。その中で神の子である我々(彼にとってはキリスト教でない人も、まだキリスト教になってないだけなので我々と言う。)は自分の意思で選択する自由を持って生まれてくる。この選択する自由だけは全知全能の神様も奪う事が出来ない、神の子である我々だけに与えられた究極の自由である。ただしその選択した結果に関しては死んだ後に永遠の罰として受け入れないといけない場合もある。
だからどんなにあの子と結婚したいと神様にお願いしても叶わない時もある。それは彼女(もしくは彼氏)の自由であって神様にもどうする事も出来ない権利だから。
では隣人がゲイだった時はどうするのか?
彼が納得した答えはこうでした。その隣人がゲイである事を選択したのはその隣人の自由なので、どうする事も出来ないしするべきでもない。その隣人は死後、裁きにあって永遠の罰を受ける、つまり地獄に落とされるとしても、それを選択する自由はその隣人が持つ唯一の権利だから、その権利を奪う事は許されない。
そして熱心なキリスト教徒である私の友達に与えられた自由とは、そのゲイである隣人をキリスト教徒として家族のように愛するか否かの選択だけなんだ。と言う事でした。
そして彼はキリスト教徒だから、隣人である限りその人がゲイであっても家族の様に愛すべきだと結論づけました。
熱心なキリスト教徒であるアメリカ人から、こういうような話を沢山聞かされていると、私にもアメリカ人とキリスト教の関係がおぼろげながら分かって来ました。
アメリカ人に取って彼らとキリスト教との関係とはとっても個人的な物なんです。自分とキリスト教の間には他人が入る隙間はないんです。
私はキリスト教徒ではありませんが、この考え方は常識ある人間として生きていく上でとても健全だと思います。
ところがですよ。
今回のテキサス州の中絶禁止の法律は、この健全なキリスト教観の真逆なんですよ。自分の事を顧みないで他人の選択の自由を奪う事ばかり考えているんですよ。こんなのアメリカの田舎に住んでいておじいさんの代から共和党にしか投票した事ない人達だってオカシイと思っていますよ。
ほとんどの日本人は日本にいるアメリカ人から「宗教、政治、差別の話題はタブーである。」と言われて、アホみたいにそれを信じて宗教、政治、差別に対して何も勉強していません。
そしてアメリカに行って初めて、こういう背景のある「今回のテキサス州の中絶禁止の法律」について意見を聞かれた時に、アホみたいに ” I don’ t know. ” を繰り返して、アメリカ人から軽蔑されて挙句の果てには無視されるように成ってしまう訳です。
それでは今週の勉強を始めます。
<本文>
1.今週の予定
今週は以下の事を、
- Particle Systemの勉強
- Niagara : Static Mesh Sampling in UE5 Niagara Tutorial [1] 続き
- Material : 先週の続き
- RPGの作成
- Map1の作成の続き
- Loading Screenの勉強の続き
- Good Skyの復習
やっていきます。
2.Niagara : Static Mesh Sampling in UE5 Niagara Tutorial [1] 続き
今まではParticle System に最もEnergy をつぎ込んでいましたが、今週からは軽くやります。
2.1 先週の復習から
<Lerp Particle Attribute Module>
「このModuleの機能を説明する簡単なEffectを作成したい。」と言っていましたので作成してみましょう。
いつもの等加速度直線運動のEmitterを作成しました。
Lerp Particle Attribute ModuleをParticle Spawn Sectionに追加します。
Position のLerp Positionにチェックを入れます。
するとPosition AとBにParticle のPositionがセットされているのが表示されます。
このAとBの割合を指定してLinear Interpolationに基づいて混合するのがこのLerp Particle Attribute Moduleの働きです。
試しにPosition BにRandom Vectorをセットして値を50にします。
そしてPosition AとBの混合割合を0:100にするためにLerp Particle AttributeのLerp Alphaの値を1にセットします。
その結果、Spriteの発生する場所がRandomに成りました。
ここで大切な事はPosition AとPosition Bの値の混合値をParticle のPosition 変数に代入していると言う事です。
だからPosition AもしくはPosition BにPosition 変数をセットする必要はありません。
以下の方法でも
Position 変数に値はパスされています。
<Orient Mesh To Vector ModuleとInitial Mesh Orientation Module>
このModuleは何をしているのか良く分かりませんね。
解説には以下の説明がありました。
試しにZ軸に対してLockしてみたら
Z軸に対して垂直に生成されるようになりました。
先週は以下の様な方法で使用しています。
これだとCornのMeshを球のMeshの法線に対して平行に生成するんじゃないでしょうか?
あ、その通りでした。それで次のInitial Mesh Orientation ModuleでCornの向きをY軸に対して90度回転させていたんですね。
360度*0.25で90度と言う訳です。
2.2 Static Mesh Sampling in UE5 Niagara Tutorial [1] 続き
先週やらなかった残りをやります。
<Colorを追加する>
Tutorialでは球とドーナツにMayaを使用して色を追加してます。
Starter Kitに含まれるMaterialで代用しました。
と思ったらVertex にMayaで指定した色を保持させてその色をMaterialで引き出して球とドーナツに色付けしています。
この部分の作成は難しいですね。
仕方ないので形だけ真似る事にします。
Materialを作成します。
そのMaterialを球とドーナツにセットします。
Scratch Module内で球やドーナツのそれぞれを構成する一つ一つのMeshの位置や法線を取ったように色をGet Tri Color ノードで取ります。
その値をMy Sphere ColorとMy Torus Colorに保持させます。
Particle Update SectionにColor Moduleを追加します。
以下のような設定にします。
出来ていますが、達成感があまり感じられません。
2.3 Hanging Particulates Templateの再現
流石にこれだけだと短いのでもう少しだけ勉強します。
それで以下のEmitterのTemplateを自分で最初から作成する事に挑戦します。
多分、今の実力なら簡単でしょう。今回はHanging Particulates Templateの再現をします。
こんなやつです。
Emitter Stackはこんな感じです。
Emitter Setting SectionのEmitter Properties Moduleを見ると
CPUで計算しています。
この数ならCPUでも問題ないんでしょうか?
どの位のParticleを生成しているのか確認します。
Emitter Update SectionのSpawn Rate Moduleを見ると
50にセットされていました。1秒間に50回、Particleの生成を行っていますね。
Spawn Burst Instantaneous Moduleを使用して一辺に大量のParticleを生成してキラキラさせていると思っていたのでSpawn Rate Moduleを使用していたのは意外でした。
Particle Spawn Section のInitialize Particle Moduleを見てみます。
Life timeとSpriteのサイズがRandomなのは分かりますね。
Sprite Rotation ModeがRandomなのは、うーん。意味が分からないです。結局、Spriteだから常に面がカメラに向かっている訳でしょう。
そこに移している絵が回転するんでしょうか?
この変数の値によってどんな変化が起きるのか不明ですね。
Particle Spawn SectionのBox Location ModuleとSphere Location Moduleについて
二つのLocation Moduleを同時に使用する事も出来るんですね。
Box Location Moduleのみだと、こんな感じです。
Sphere Location Moduleのみだとこれです。
二つを同時に使用するとこんな感じです。
単純に二つの形を足した形状にはなっていませんね。どういう計算なんでしょうか?
Particle Update SectionのCurl Noise Force Moduleをみます。
このModuleがParticleをふわふわ移動させているんですね。
Curl Noiseって流体の動きを再現するのに使用される奴でしたよね。
Particle Update SectionにはDrag Moduleも使用されていました。
この値は良く分からないです。Drag Moduleがどんな計算をしているのかも知らないです。
うーん。結構簡単なModuleかもしれませんね。
読んでみますか。
Transient Physics Drag変数がありますね。
Transientは今一、良く分かっていないName Spaceなんですが一応、そのSectionが実行される間、生きていると考えています。この場合、Physics Drag変数はParticle Update Sectionの実行中だけ存在する訳です。
それを確認したいですね。
Solve Force And Velocity ModuleにPhysics Drag変数が使用されていますね。
Physics Drag変数については、Hanging Particulates Templateを再現する時にもう一度調査しましょう。
このPhysics Drag変数にInputのDragを追加しているだけですね。
回転にかかるDragは今回は使用していないのでスキップします。
Scale Sprite Size Moduleです。
Spriteのサイズを変更してるだけですね。
Scale Color Moduleです。
α値を変化させているだけですね。
最後にRender SectionにSprite Rendererが使用されています。
大体分かりました。無のEmitterから同じモノを作成してみます。
Emitter Update SectionのEmitter State Moduleの値を変更します。
一応、Templateと同じ値にしましたが、あんまり意味があるとは思ってないです。
Emitter Update SectionにSpawn Rateを追加します。
Spawn Rateは50にセットしました。
やっぱりここで分からないのがSprite Rotation ModeとSprite UV Modeですね。何を指定してるのか予想がつかないです。
更にBox Location ModuleとSphere Location Moduleを追加しました。
値はTemplateと同じです。
こんな感じです。
Particle Update SectionにCurl Noise Force Moduleを追加しました。
Particle がフワフワし始めました。
このCurl Noise Force Moduleの変数の変化を表すEmitterも後で作成します。前に勉強した時はまだNiagaraの仕組みが分かってなかったのでNiagaraで実際に試す事は出来ませんでした。今度はもう少しだけCurl Noise Force Moduleの実態にせまれるでしょう。
Drag も追加しました。
Particleの動きはユックリに成りましたがそれだけですね。
炎のEffectの勉強をした時のEmberの様な地味だけどあると炎らしさを盛り上げる脇役的な凄みも感じません。
Scale Sprite Size Moduleを追加します。
ここはModuleよりDynamic Inputが良く分からないです。
Vector 2D Floatは単に一つの値を2つにしただけです。
何でこんな事をしているんでしょうか?
いきなりFloat from Curveを入れちゃ駄目なんでしょうか?
この辺も後で検討します。
最後の追加するModuleですが、Scale Color Moduleです。
こっちは普通にFloat From Curveを追加しています。
以上です。
こんな感じに成りました。
流石に2か月前とは違ってほとんど何をやっているのかは理解出来ました。
Vector 2D Floatについては来週調査します。
Physics Drag変数の調査も忘れていました。これも来週やります。
3.Material : 先週の続き
3.1 先週の復習など
UE4のVFXを勉強しているとそのVFXが素晴らしくなるかどうかの30%位はMaterialの素晴らしさにかかっている事が分かります。これはLandscapeの作成の時と似ています。それでMaterialの勉強を開始する事にしました。
それでBen Cloward氏のShader Graph Basics [2]でMaterialの勉強をする事にしました。
それで突然思いだしたんですが、池田 亘氏の「HoudiniとUnreal Engine 4で学ぶ リアルタイム VFX」[3] でも2章分ぐらい、Materialについて語っていた気がします。前読んだときは、なんでVFXの勉強するための本なのにMaterialについて解説してるんだと不満に思い、Materialについては軽く読んで終わりにしてました。この辺をもう一度確認します。
不満に思ったと言えば、Sherif William氏の「 Unreal Engine 4 Scripting with C++ Cookbook」[4]の11章、Custom Materials and ShadersでもMaterialについて解説していたんですが、その本で勉強した時は「何これUE4のC++について教えると言って、何でBPで教えてるの?」と激怒してその章は読むのを止めてしまいました。今になってみると、この本のMaterialの内容も一応もう一度確認しておいた方が良い気がしています。
後、公式のDocumentや公式のOnline Learningもチェックします。
この辺について今週はやっていきます。
3.2 Your First Shader - Shader Graph Basics [5] を勉強する
まず、ぱっと見たのですが本当の初心者向けです。全くUEを触った事が無い人でも出来るように教えています。
それでもこの初心者向けのTutorialで知らない事があったら問題な訳で、一応見て置いて損はないでしょう。
後、Unityで同様の操作を教えています。
うーん。これは興味深いです。
C#は問題なく使用出来るんでUnityを勉強する弊害はないんですね。ただ私は本格的なソフト開発はC++でするべきであると強く信じているので、最終的な選択はUEになってしまいます。
ただしUnityのMaterialの以下の構成には惹かれるものがあります。
GLSLそのままですから。
今週は、Unityの部分は見るだけにします。一週間考えてからInstallするか決めます。
このTutorialで教えている内容で私が知らなかった事をまとめておきます。
<UE5の表示されている文字を大きくする方法>
Tool->Debug->Widget Reflectorを選択してWidget Reflectorを開きます。
Application Scaleの値を変更します。文字のサイズを1.5倍にしたいときは1.5と入力します。
<Field of Viewの設定>
次はMaterial EditorのField of Viewの設定箇所の説明です。
Field of Viewの設定箇所は分かったんですが、確かField of Viewって縦と横があったと思うんです。これはどっちを指しているんでしょうか?
私はこの辺の値は弄る気はないのでどうでも良いですが。
<PreviewのBackground を消す方法>
PreviewのBackground を消す方法がここにあるのは知らなかったです。
EffectみたくBackgroundの色を変化する方法はないんでしょうか?あったら知りたいです。
私が以下のボタンの使用方法について知ったのは最近です。
このボタンの使用方法については軽く説明していました。
こんだけです。私が知らなかった事は。
一応結果も貼っておきます。
3.3 Basic Shader Math - Shader Graph Basics - Episode 4 [6] を勉強する
流石にこれだけだと勉強した事にならないのでもっとやります。
まず、ぱっと見ました。特に知らない事は無かったと思います。
Material内における四則計算について解説しています。
3.4 Understanding Texture Maps - Shader Graph Basics - Episode 5 [7] を勉強する
どんどん行きます。
ここから少しだけ本格的になって来ます。
まず、TextureをUE5 にImport しますがUE5内でそのTextureを保持する時は別なFormatで保持されます。
のでそのTextureのサイズを知る為にはTextureを開いてDetailのResource Sizeを見る必要があります。
Alphaを追加するだけでTextureのサイズは約2倍になります。Alphaを使用しないTextureは最初からAlphaは省いておきましょう。
Compression SectionにあるMaximum Texture Sizeの値を変化させると
Resource Sizeも変化します。
今度は圧縮のタイプについてです。現在、DXT5という圧縮方法が選択されています。
これはAlpha Channelが使用されている圧縮方法です。
もしこのTextureがAlpha Channelを使用しない場合は、
にチェックを入れます。
FormatがAlpha ChannelのないDXT1に自動的に変更されTextureのサイズも5461Kbから2731Kbに縮小しました。
元のTextureから圧縮したくない場合はRGBAを選択すれば良いそうです。
実際のTextureではどれを選択すべきかを解説しています。
Base Color用のTexture->DefaultであるDXT5
後、TextureがColorであるため以下のsRGBにチェックを入れる必要があります。
Roughness用のTexture->Masks
sRGBはOffです。
成程、と思って、実際にStarter Kitで使用されているMaterial(M_Brick_Clay_Beveled)を開いて見たら
Roughnessに使用されているTexture(T_Brick_Clay_Beveled_M)は
DefaultでsRGBにもチェックが入っていました。
このTextureのRにはAmbient Occlusion用、BにはRoughness用のデータが入っていますがsRGBにチェックを入れる必要はあるんでしょうか?
この辺は良く分かりませんね。
このすぐ後で説明されていました。
別々なChannelのデータを一つのTextureに組み込んだ場合は、sRGBのチェックは要らないそうです。
成程、とT_Brick_Clay_Beveled_MのsRGBのチェックを外したらErrorになってしまいました。
ウーン。良く分からない。これを理解するためにはsRGBの勉強も必要ですね。
Hight Map用のtexture―>Gray Scale
Hight Map用のTextureにCompressionを掛けると微妙な高さを示すGradientが無くなってしまうので圧縮せずにGray Scaleをそのまま運用するのが良いそうです。
最後はNormal Mapです。
Normal専用の圧縮であるBC5が使用されています。
以上です。
これはかなり勉強になりました。
3.5 公式のDocumentをチェックする
Materialに関する公式のDocumentをチェックするのを忘れていました。
Designing Visuals, Rendering, and Graphics [8] の当りから見るのが順当でしょうね。
この中で以下のTutorialはそのものズバリですね。
On line Learningについても調べて見ます。
Materialで検索すると33個のTutorialがありました。
ぱっと見るとほとんど関係ないのものや、あまり質の良くないのもありそうです。
後でじっくり選別しましょう。
3.6 「HoudiniとUnreal Engine 4で学ぶ リアルタイム VFX」[3]のMaterialに関して述べている部分をチェックする。
ぱっと見ると3~5章がShaderについて述べているようです。のでその辺を軽く読んでみます。
3章はMaterialについてそのものです。ここでの四則計算はTextureとの関連において解説されていてMaterialで説明する意味が分かります。Basic Shader Math - Shader Graph Basics - Episode 4 [6]は単なる四則計算の説明をしてて全くBPの使用方法が分からない人にいきなりMaterialを教えるつもりなのかと???となりました。
4章はMaterialとEffectの関係についての解説ですね。Materialを直す事でEffect自体が変わってくる事を具体的な例を用いて説明しています。
ただ4章で使用されている例は、ちょっと極端な気がします。もう少し基本的なサンプルで解説しても良かったと思いました。
5章はVertex Shaderについてでした。
3.7 「 Unreal Engine 4 Scripting with C++ Cookbook」[4]のMaterialも復習しておく
これはもうずっと前になりますが、この本でUE4C++の勉強をしていた時にMaterialの章になったら全部BPで説明していて何でC++の本なのにBP使ってんっだ騙された。とかなり激怒した記憶があります。
今になって思えば、UE4のMaterialの部分をC++というかShader 言語だけで書く仕組みは元々ない訳で、そこまで怒る必要も無かったかもしれません。
ただそんなにスゴイ事は書いては無いと思いますが一応確認だけはしておきます。
一番最初の節にはBase ColorやRoughnessなどのPBRについての説明がありました。次に水のMaterialを作成するために必要なMaterial内でのPositionの移動方法についての解説です。その後でCustom Nodeについて解説しています。
うーん。結構しっかりした作りでした。
これはもう一回勉強する必要がありますね。
3.8 Materialまとめと感想
MaterialのTutorialについて簡単ですが調べました。その感想をここにまとめます。
MaterialはMeshにTextureを貼る時だけでなくEffectやLandscapeの作成、更にPost Processでも使用される幅の広い機能ですが、基本的に理解しなければならない部分はかなり共通している気がしています。
例えば、PBRについてはBase Color、Roughness、MetallicそしてSpecularについて理解する必要があります。
更に操作方法としてTextureに対する四則計算から始まりTimeなどのNodeの使用方法を覚える必要があります。
ここで応用として色々な物質の質感(例えば木、金属、プラスチック、石など)の出し方も勉強すると効率が良さそうです。
その後で、EffectやLandscapeのためのMaterialの作成について勉強します。
Materialの使用方法を理解して自由に好きなMaterialを組めるようになるための学習ロードマップは以上の様になる気がします。
後、私個人の疑問としては本当に大学レベルの物理も数学も知らない人でもMaterialを自由に組めるようになるのか知りたいです。例えばFresnel 反射について理解出来なくてもFresnel関数のノードの使用方法さえ覚えてしまえばMaterialが組めるようになるのかどうかをです。
4.Map1の作成の続き
4.1 地面の色がオカシイ
先週、Componentの継ぎ目で地面の色がオカシクなっているのに直し方が分からない。と書いていました。
この部分です。
このImageからもComponentの境で地面の色が変化しているのが分かります。
直しました。
直し方は簡単でLandscapeのPaintでGrass_LayerInfoをPaintするだけでした。
一部でもGrass_LayerInfoでPaintされたComponentは地面そのものの色が薄くなります。
この違いが何故現れるのかは分かりません。
4.2 会話の確認
先週作成した会話がオカシクないか確認します。
<村長>
村長との会話です。
最初から文の推敲が必要ですね。
セリフを移す紙の解像度が低すぎます。別なのに変えます。
回答ボタンにもImageを追加してみました。
背景が見えるようにImageを少しだけ透明にしました。
これで行きます。
「金の切符について…」を選択します。
このセリフも推敲の余地ありです。
直しましょう。
他のセリフも推敲しましょう。
直しました。
他のNPCについても直していきます。
<村長の腰巾着>
こいつを直していきます。
セリフも全部直しました。
<天気予報する老人>
このNPCは特に目的がないです。見た目だけ直します。
<引退した戦士>
これも推敲します。
セリフを推敲します。
<魔法研究家>
見た目から直します。
セリフも少しだけ直しました。
<商売人>
直しました。
<政治の話ばかりするおじさん>
直しました。
セリフはあまり推敲する箇所が無かったです。
<山好きな老人>
直します。
<村の詩人>
この詩の内容も物語に関係ないですね。
関係ない話なので、セリフは今回は直さないでおきます。
<村の占い師>
この占い師のセリフもどう直すべきか、まだ決まっていません。見た目だけ直します。
<科学者の卵>
<村の老人>
これも特に直す部分が決まっていないので絵だけ直しました。
<村長の娘>
セリフも少しだけ直しました。
<村の保安官>
見た目だけ直しました。
<荒くれ者の戦士たち>
これも見た目だけ直しました。
これで全部直したはずです。確認します。
<謎の旅人>
謎の旅人を忘れていました。
見た目だけ直しました。
NPCは全部これで直したはずです。
5.Stream Levelの検討
Trigger boxにPlayer の操作するキャラが侵入したらStream Levelを読み込む事にします。
一番簡単なStream Levelは村人です。彼らは村に侵入しない限り登場する必要はありません。
次は村の家や村の内部に生えている木です。これは城壁の外側からでも見えるため村人と同じ扱いには出来ませんが、Stream Levelに入れられます。
川も見えない時は沢山あります。Stream Levelに入れてしまいましょう。
Monsterの発生もStream Levelに入れたいです。
Landscapeも分けたいですね。
5.1 試しにやってみる
色々想像しない問題が発生しそうなのでMap1を別なProjectにMigrateしてそこで試してます。
当然ですがErrorが凄いです。
Map1のBPの機能を全て切りました。
これでCompileする事が出来ました。
Errorはまだ出ている状態ですが、テストするには十分な環境でしょう。
色々試してみます。
<村を別なLevelに移す>
新しいStream Levelを作成してそこに村を移しました。
Trigger boxは以下に示したように作成しました。
テストします。
ここからではまだ村が存在していません。
村が現れました。
村人も普通に生成されています。
今度は奥の岩を別なStream Levelに移します。
テストします。
あれ。
思い出しました。Trigger boxはあくまでBoxにInした時に発動するんでした。Box内に生成されるときは発動しないんでした。
こうしました。
今度は出来ています。
最後に真ん中の広場も別のStream Levelに移動します。
やっている事は一緒です。ので詳細は省きます。
こんな感じで消えます。
今度はLandscapeもStream Level内で作成出来るか試してみます。
以下の様にLandscapeを追加してみました。
テストします。
Stream Level、Landscapeが読み込まれていない状態です。
読み込まれている時です。
うん。
LandscapeもSteam Levelで別々に読み込む事が出来ますね。
そしたら、以下のLandscapeを二つに分けてPersistent LevelとそのStream LevelであるLandscapeTest Levelに配置します。
しかしその方法が分かりません。
色々弄ってやり方を見つけました。
このやり方が最善ではないかもしれませんが、兎に角出来ました。
やり方を下に記録しておきます。
まずLandscapeを選択して
Scriptを選択します。
するとSculptにHeight mapが表示されるので
Export Fileを選択します。
以下のMapのHight MapがExportされたはずです。
こんな感じのやつです。
次に新しくLandscapeを作成するStream Levelを開きます。
ここに先程ExportしたLandscapeと全く同じComponentのLandscapeを作成します。
以下の様にです。
作成したら先程Export したHight MapをここにImportします。
やり方はExportした方法と同じで、最後にImportを選ぶだけです。
すると色なしのLandscapeのCopyがStream Levelに完成します。
要らない部分のComponentをManageのDeleteを使用して消します。
次に色を塗ります。
まず、先程作成したLandscapeを選択してLandscape Materialに元のLandscapeで使用しているのと同じMaterialをセットします。
するとTarget Layersに以下の様なLayerが表示されるのでそれぞれのLayerに元のLandscapeと同じLayer Infoをセットします。
これでLandscapeにPaint出来るようになったので、元のLandscapeと同じようにPaintします。
こんな感じです。
今度は元のLandscapeで新しいLandscapeと重なっている部分を消します。
Trigger Boxを追加します。
今回は2個のTrigger Boxを追加しました。
以下のように二つのTrigger Boxが重なっている部分があるので
Boolean変数を2つ作成して
両方がfalseの時だけこのStream LevelをUnloadするようにします。
以上です。
テストの結果も記しておきます。
Stream LevelがLoadされる前です。
された後です。
二つのTrigger Boxが重なった部分を移動していますが、Stream Levelが消えたりする問題は発生しません。
ただし、つなぎ目ははっきり分かります。
分かるだけじゃなくて所によっては隙間が空いています。
Loadがかなり軽くなっているのは感じます。
PCがうねりを上げる事が無くなりました。
とは言っても上記に記した様な隙間がLandscapeに生じても困ります。
色々調べたらLevel Streaming 用のLandscapeを作成するためには、World Compositionを使用するらしいです。
結構そのものズバリのTutorialでありそうなWorld Composition And Basic Level Streaming - Unreal Engine 4 Tutorial [9] を見つけたので、これを先に勉強します。
5.2 World Composition And Basic Level Streaming - Unreal Engine 4 Tutorial [9] を勉強する。
いつもの空のLevelを作成します。
まず、World SettingsのWorldからEnable World Compositionをチェックします。
これでWorld Compositionが使用出来るように成るみたいです。
Sub Levelを追加します。
このTutorialではStream Levelと呼ばずにSub Levelと普通に呼んでいました。Sub Levelの方が分かり易いですし、私も元に戻ってSub Levelと呼ぶ事にします。
Level1にLandscapeを作成します。
Landscapeの設定はTutorialと同じにしました。
こんな感じです。
Persistent Levelに戻りLevelsの右隣にある2つのIconのWorld Compositionをクリックします。
以下のWindowが開かれます。これがWorld Compositionのようです。
マウスの右クリックで座標を動かします。
Landscapeを選択した状態でマウスの左を押し続けながら移動するとLandscape自体が動かせます。
白い矢印はカメラの位置を示しています。
次に別なLevelにLandscapeを追加する方法を示します。
このLandscapeを選択した状態でAdd Adjacent Landscape Levelから+Xを選択します。
新しいLevelの名前とSaveする場所を聞いて来ます。
答えると
同様の方法で更に3つのLandscapeを追加します。
このように4つのSub Levelに別々に作成したLandscapeですが
LandscapeのSculptから4つの別々なLevelに存在するLandscapeを同時にScript出来ます。
World CompositionをZoom outするとLandscapeの最大値が見られます。
4.23 Kmと表示されています。
今度はどれくらいLandscapeから離れるとUnloadされるのかを設定します。
World CompositionのUncategorizedの隣にある+ボタンを押します。
以下の様に打ち込みます。
Createを押します。これでStreaming distanceが10000であるSD_10Kが出来ました。
しかしSD_10Kを開くと作成したLandscapeはありません。
SD_10Kに先程作成したLandscapeを移すためには、以下に示したように
全てのLandscapeを選択した状態でAssign to Layerを選択してSD_10Kを選ぶ必要があります。
テストします。
Landscapeのつなぎ目に山があって本当にunloadされているのか分かりません。
Landscapeを以下の様に作り直しました。
これならUnloadされたらすぐ分かります。
されました。
5.3 World Compositionを勉強して
World Compositionの基本を少しだけ勉強しました。既にSub Levelを作成しているMap1に直接応用する事は難しそうです。これから作成するMapには使用する事にします。
Sub Level一つに入っているMapの大きさはどれくらいが良いんでしょうか?
これが知りたいですね。
遠くに有っても高い山は見える訳で、単に距離だけでMapをUnloadするのは強引過ぎるとも思いました。
遠くにある山の情報が入らなくなる代わりにSeamlessに動けるようになるのは、現実の世界とはちょっと違う感じがしてストレスを感じます。
ただUE5ではもうこの問題を考える必要が無い訳であんまりこだわるのもアレかとなると適当な所で納得しておくべきかもしれません。
Tutorialに使用したMapの大きさは120平方mでした。Unloadされる基準は100m離れる事でした。
この基準をMap1に当てはめると、Map1はかなり大きいMapになります。
そしてLandscapeの条件は以下のようになっています。
TutorialのLandscapeの条件は以下のようになっています。
2021-03-22のブログにLandscapeのparameterについての簡単なまとめがありました。
Tutorialの方のNumber of Componentsは全てのSub LevelにあるComponentの数を合わせていますね。
15*8=120
であってますね。
120m^2で一つのSub Levelを作成すると考えるべきかもしれませんね。
6.Loading Screen 色々
6.1 宿屋のLoading Screenの確認
コードを見直したら、宿屋に泊まった時はLevelを新しく読み直してはいませんでした。
RPG Game Instance BPにあるDispatcherであるSet Time Spend 0をInn_Welcome Widgetから呼び出す事で時間をResetしています。
このDispatcherはLevel内でBindしており、新しいLevelを作成した時にそのLevelに以下の実装をしないと宿屋は正常に機能しないです。
すっかり忘れていました。
後、睡眠中に使用されている星空ですが、Perlin Noiseで星雲を画いておきます。
こんな感じです。
かなりマシになりました。
Perlin Noiseを追加するだけでこんなに絵のレベルが上がるなんて衝撃的です。
Perlin先生もこんな風に自分の作ったNoise が利用される事になるとは想像もしていなかったと思います。
6.2 Loading Screenの種類を増やす
先週、Loading Screenを作成していて、銀河鉄道に乗る場合とそれ以外のLoading Screenだけでは足りないと思いました。どんなLoading Screenが必要かを調査してまとめておきます。
<死亡してからやり直す場合>
これは戦闘で死んだ後と、落下して死んだ後の場合があります。
<戦闘画面への移行と戦闘画面からの帰還>
これは、なるだけ速く行いたいわけですから文字の表示なども少なくし、Loading Screenで得られる情報も戦闘に関係したものにしたいです。
<不思議な地図でワープした場合>
特別な銀河鉄道に乗るようにします。
<落下して死んだ時>
先程の死んだ後にやり直すのではなく落下して死んだ時は、Map、Fallingに移動します。のでその時にLoading Screenが呼ばれます。
端的に滑落している事を知らせるLoading Screenが必要です。
以上でした。
7.Loading Screenの勉強の続き
7.1 Async Loading ScreenがどうやってOpen Levelノードが呼ばれるたびに呼ばれるようになっているのかを調べます。
どうやって調べたらいいのか全く分かりません。
先週から、暇なときにAsync Loading Screenのコードをパラパラみたり、Unreal Engine 4 Scripting with C++ CookbookのSlateの箇所を読み直したりしたんですが全く分かりません。
そう言えば、Axel Riffard氏による Async Loading Screens and Transition Levels | Unreal Fest Europe 2019 | Unreal Engine [10]ではどうやってLoading Screenを呼び出していたんでしょう。
2021-08-16のBlogに書かれていました。
これなら分かります。
Open Levelノードの前にPlay Loading Screen関数を呼んでいるですから。
これから想像するに、Slate Moduleの機能でOpen Levelが呼ばれると自動的に呼ばれるようになっている訳ではなさそうです。同じようなSlate機能を使用しているAction RPGではOpen Levelの前に関数を呼び出してSlateを起動しているからです。
考えられるのは、
- ModuleとPluginの違い
- Engine Pluginだから
- .iniにそう言う事を指定出来る機能がある
などです。
PluginやModuleの作成方法を今、勉強する気はあんまりないです。メリットを感じません。
Engine Plugin と通常のPluginの違いは何でしょう。
公式のDocumentであるPlugins [11] には、以下の説明がありました。
Engine PluginとGame Pluginがどう違うのかは不明ですがPlugin fileの位置が違う事だけは分かりました。
これにしたがってEngine Pluginが収納されているFolderを探すと、Async Loading Screenが保持されているFolderを見つけました。
先週Downloadしたfileと全く同じ様ですね。
比較のための先週Git hubからDownloadしたFileも見てみます。
BinaryやIntermediate folderがないのは一回もBuildしていないからです。Configはどうでしょう。開いてみます。
うーん。あんまり関係なさそうです。
まあ同じと言って良いでしょう。
.iniの違いはどうなんでしょうか?
これは今の所は分かりませんね。
7.2 Async Loading Screen色々
分からない事だらけなので、分かる所を見てみます。
AsyncLoadingScreen.upluginを開くと
が使用されています。これは2021-08-16のblogで勉強したのと全く同じでした。
次にAsyncLoadingScreenModule.hファイルをみます。
IModuleInterfaceを継承していると言う事はこのクラスはModuleになる訳です。PluginもModuleなんですね。
と言う事はAction RPGにおけるAction RPG Loading Screen Moduleと同じ事をしていると考えられます。
二つを見比べましたが、Action RPGのActionRPGLoadingScreen.hの方が仕組みがかなり単純です。こっちを先に理解すべきですね。
30分位、Cppファイルを基本に眺めてまくって、大体の流れは理解したのですが、分からない所も結構あります。
分かった所、分からない所をまとめておきます。
まずActionRPGLoadingScreen.cppの以下のクラスについてです。
FActionRPGLoadingScreenModuleの実装部を見ると
と言う箇所があります。SRPGLoadingScreenはそのクラスの直ぐ上で定義されています。
そしてこのクラスの中で
が呼ばれています。
そしてこの中の関数であるStartInGameLoadingScreen() が
BPから呼ばれているヤツでしょう。
最後のこれはModuleを実装するためのMacroだそうです。
それで分からない事は、この分かった事以外全部で、一々書いてられないのでここには書きません。
しかしModuleを作るTutorialとSlateを作るTutorialを2,3個やれば結構分かるようになるとは思っています。
今週はここまですね。流石に今からModule とSlateの勉強をやる気力はありません。
来週は、ModuleとSlateのTutorialをやってみます。
8.Good Skyの復習
流石にもう延期は出来ません。少しずつですが復習してLandscapeにも昼夜を追加します。
調べた所、2020-11-08のブログでどのようにGood Skyを使用して昼夜を作成したのかが解説されています。
これをまず復習します。
8.1 昼夜の作成
Map1のLevel BP内に以下の方法で実装していました。
今回は復習だけなのでCodeの変更はしませんが見にくいです。
Delta Secondの値が変化した場合でも昼夜の時間が変化してない事を計算して証明しています。
この辺を理論的にも証明しておきたいですね。
8.2 世界が赤くなる現象
2021-04-26のBlogにGood Skyで赤くなる現象に対する対策が述べられていました。
Sky lightのMobilityをStaticからStationaryに変更すると世界全体が赤くなってしまいます。
CubemapにDaylight Ambient Cubemapをセットすると直ります。
Light Massの数によって赤さの影響がどれ位変わるのかも調べておきたいですね。
以上です。
9.まとめと感想
Niagaraの勉強はStatic Mesh Sampling in UE5 Niagara Tutorial [1] を実装とHanging Particulates Templateの再現を行いました。
- その中でLerp Particle Attribute Module、 Orient Mesh To Vector ModuleとInitial Mesh Orientation Moduleの機能について勉強しました。
今週からCascadeの勉強の代わりにMaterialの勉強を始めました。
- Your First Shader - Shader Graph Basics [5]にある動画の内、最初の幾つかを自分で試した事と他のMaterialの教材の内容を確認しました。
- 公式のDocumentとOnline Learningで、一定以上の基準を満たしていると思われる教材の選別は出来ませんでした。
RPGの作成では
- 最初の村の全部のNPCのセリフを推敲しました。
- Map1にStreaming Levelを導入するための検討をしました。
- Async Loading ScreenがどうやってOpen Levelノードが呼ばれるたびに呼ばれるようになっているのかを調査し、その過程でModuleとStateの作成方法についての復習が必要であるとの結論が出ました。
- Good Skyの復習をやっと始められた。
UE4のModuleの作成方法を検索していると、NiagaraのModuleの作成方法が同時に検索結果に表示されて厄介です。
この二つは全く違うモノなので区別する必要があります。前者をUE4C++のModule、後者をNiagaraのModuleと呼ぶ事にします。
ModuleやSlateの勉強は面白いですが、RPGの完成とは直接の関係はありません。どの程度の勉強をするのかを見極める必要があります。
ModuleやSlate の勉強をするより、Async Loading ScreenでLoading Screen中に動画を流す方法を勉強する方がGameの質の向上には格段に貢献します。
10.参照(Reference)
[1] CGHOW. (2021, August 26). Static Mesh Sampling in UE5 Niagara Tutorial | Download Files [Video]. YouTube. https://www.youtube.com/watch?v=9MJ8YtEs5as
[2] Cloward, B. (n.d.). Shader Graph Basics. YouTube. Retrieved September 26, 2021, from https://www.youtube.com/playlist?list=PL78XDi0TS4lEBWa2Hpzg2SRC5njCcKydl
[3] 池田亘. (2020). HoudiniとUnreal Engine 4で学ぶリアルタイムVFX: レベルアップのための心得と実践 (Japanese Edition) (Vol. 1). ボーンデジタル. http://www.amazon.co.jp/dp/B0872SFBX2
[4] Sherif, W., & Whittle, S. (2016). Unreal Engine 4 Scripting with C++ Cookbook (1st ed., Vol. 1). Packt Publishing. http://www.amazon.co.jp/dp/B01FR2LCF2
[5] Cloward, B. [Ben Cloward]. (2021a, June 24). Your First Shader - Shader Graph Basics - Episode 3 [Video]. YouTube. https://www.youtube.com/watch?v=IAR2izQxsxM&list=PL78XDi0TS4lEBWa2Hpzg2SRC5njCcKydl&index=3
[6] Cloward, B. [Ben Cloward]. (2021b, July 1). Basic Shader Math - Shader Graph Basics - Episode 4 [Video]. YouTube. https://www.youtube.com/watch?v=bihZJzeuwOU&list=PL78XDi0TS4lEBWa2Hpzg2SRC5njCcKydl&index=4
[7] Cloward, B. [Ben Cloward]. (2021c, July 8). Understanding Texture Maps - Shader Graph Basics - Episode 5 [Video]. YouTube. https://www.youtube.com/watch?v=WJkEacYRhPU&list=PL78XDi0TS4lEBWa2Hpzg2SRC5njCcKydl&index=5
[8] Epic Games. (n.d.-a). Designing Visuals, Rendering, and Graphics. Unreal Engine Documentation. Retrieved September 26, 2021, from https://docs.unrealengine.com/4.27/en-US/RenderingAndGraphics/
[9] Aspland, M. [Matt Aspland]. (2021, February 2). World Composition And Basic Level Streaming - Unreal Engine 4 Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=xeJz26M2xn4
[10] Epic Games [Unreal Engine]. (2019, May 20). Async Loading Screens and Transition Levels | Unreal Fest Europe 2019 | Unreal Engine [Video]. YouTube. https://www.youtube.com/watch?v=ON1_dEHoNDg
[11] Epic Games. (n.d.-b). Plugins. Unreal Engine Documentation. Retrieved September 26, 2021, from https://docs.unrealengine.com/4.27/en-US/ProductionPipelines/Plugins/