UE4の勉強記録

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

「Unreal Engine 4.xを使用してRPGを作成する」の足りない部分を作成する  Widgetの整理など

f:id:kazuhironagai77:20210418232534p:plain

<前文>

牛は食べて良くて馬は食べたらいけない件について

今の日本のクリエーターが最も恐れる事の一つにネットの炎上が挙げられると思います。

しかも炎上は国内だけじゃなくて海外から起きる事もちょくちょくです。ネットで作品を発表する人達にとって、炎上するかしないかはほとんど運まかせです。この海外からの炎上は主に、中国、イスラム圏、そして英語圏がありますが、アメリカに10年暮らしていた私は、この英語圏の炎上を防ぐためのアドバイスはかなり的確に出来ます。

今回はその話です。

アメリカ人はいつも激高しているように思う日本人も多いと思いますが、実際はアメリカ人が激怒するのは非常に稀です。

それにはれっきとした理由があって、キリスト教の価値観においては激高した事実自体を罪と見なすので、激怒すると社会から制裁を受けるからです。

しかし例外があります。例外に関してはいくらでも激高してもOKです。

その例外の一つに、馬、クジラやイルカ、そして犬を食べる人に対してはいくらでも切れて良いと言うのが有ります。

食い物に関して、そんな例外があっていいのか、と思いますし、実際、おかしいんじゃないの?と私も思いますが、事実なんでしょうがないです。

日本人が中国人とかベトナム人が犬を食べると聞くと、気持ち悪いと思う人は居るかもしれませんが、激怒する人はほとんどいないと思います。

それは日本人の文化では、馬、クジラやイルカ、そして犬は、畜生であって人ではないからです。

英米文化圏では、馬、クジラやイルカ、そして犬は、友人であって日本人が思う畜生ではないです。

おかしいと思うかもしれませんが、英語文化圏では、

  • 牛は食っていいが、馬は駄目。
  • ねこは可愛くないが、犬は可愛い。
  • クジラやイルカは見た事ないが友達。

なんです。

勿論、美味しんぼのように全力で、そのお前の文化。偽善だろ。と戦いを挑むのも選択の一つとして有りますが、日本人で馬やクジラを食った事ある人はほとんどないでしょう。無用な炎上は避けたいと思うのなら馬やクジラを食べる話などは避けるべきです。

どれくらいが許容範囲なのかですが、JOJO進撃の巨人が例として分かり易いです。どちらも欧米で大人気の作品ですが、JOJOでは犬が虐待されている。進撃の巨人では馬が虐待されている。と英語圏では認識されています。これぐらい大人気の作品だと、ファンも凶暴なので、虐待と指摘しづらく、野放しにされていますが、無名のクリエーターがJOJOと同レベルで犬を扱ったり、進撃の巨人と同レベルで馬を扱ったら炎上する確率はかなり高くなるでしょう。

一体JOJOのどこで犬が虐待されているの?とか進撃の巨人で馬の扱いは丁寧じゃない。と思う人は、自分の作品には馬や犬は出さない方が、炎上を避ける意味では賢明だと思います。

そう言えば、私、中学生の時、ムツゴロウさんの本が大好きで全著作を暗記する位読んだんですが、大人になった今思い返すと、犬と馬に対しては特別扱いしていたんだなと分かります。例えば、ムツゴロウさんが満州で馬の肉を食べる話ですが、ショックで食べれなかった点が強調されています。犬を食べる話は、私が覚えている限りですが、大学の野良犬が痩せて死にそうなので、ムツゴロウさんが一計を案じて、太らせて食べようと嘘ついてみんなから餌を集めて太らして、食べるために殺す前の日に逃がそうとしたら空手部の連中が先に殺してしまったみたいな話だったと思います。更に捕鯨にも終始反対の立場でした。

ムツゴロウさんなんて平気でライオンの口に頭突っ込む人です。そんな人でさえ、馬、クジラ、そして犬のタブーには首突っ込まなかったのかと思うと、常人は絶対避けるべき話題なのかもしれません。

勿論、これはあくまでもクジラや馬の食用なんでどうでも良い人向けで、人生には炎上しようが命掛けて戦わないといけない時もありますので、絶対、俺の作品から馬や犬は削らないと主張する人に強制するつもりはありません。

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

<本文>

1.今週の予定

以下の事を行います。

  • Environmental artist用のTutorialの続き
  • Widget内のBPの整理
  • Map1からLandscape4にWarp出来るようにする。
  • Landscape4で戦闘出来るようにする。

2.Environmental artist用のTutorialの続き

Becoming an Environment Artist in Unrealの続きとConstructing Believable Environmentを勉強します。

今週こそはLightingに集中して勉強したいです。

Lightingの勉強の目的ですが、実は以下に示した様に、Medieval KingdomからImportした建物やその影で非常に暗い部分があるんです。

 

f:id:kazuhironagai77:20210418233801p:plain

f:id:kazuhironagai77:20210418233907p:plain

これの理由を知りたいからです。

2.1 Becoming an Environment Artist in Unrealの続き

先週、残り二つで時間が無くなって途中で中断せざるえなかったので、その残りから勉強します。

<Lighting

基本的なLightの説明でした。

  • Static light -> light map のみに記録。最も低コスト。
  • Moveable light ->light map関係なし。全てRun time中に計算するため、最も高コスト。
  • Stationary light ->light mapに記録。ただし明るさと光の色はRun timeに計算。コスト的には2つの間。

Light mapって遥か昔の記憶では、空間上に点々で表現されていたような気がします。Medieval KingdomからImportした建物が暗いのはこのLight mapのせいなんでしょうか?

Sky light について興味深い話が説明されていましたので記録しておきます。

Sky lightは空の光の反射光を追加します。

以下の様に空の色を指定すると

f:id:kazuhironagai77:20210418233956p:plain

Sky lightによって以下の様に空の色が淡く追加されます。

f:id:kazuhironagai77:20210418234013p:plain

Affect Worldを切ってSky lightの影響を消すと

f:id:kazuhironagai77:20210418234029p:plain

以下の様になります。

f:id:kazuhironagai77:20210418234048p:plain

更に、Stationary やMovableでは以下の様にSky lightの反射光が見えますが、

f:id:kazuhironagai77:20210418234105p:plain

Staticだと以下のようにSky lightの色は全く表示されていません。

f:id:kazuhironagai77:20210418234127p:plain

Build light onlyを実行すると、Sky lightの反射光が追加されました。

f:id:kazuhironagai77:20210418234200p:plain

<Lightmaps

Light mapについてです。

最初からLight mapに関して間違って理解している事が分かりました。Light mapって空間上に点々で表現されているそれぞれの箇所で360°カメラの撮影みたいな方法で影をTextureに焼き付けていると思っていました。実際はMeshのUVをもう一枚作成してそのTextureに影の情報を追加していました。

World SettingのLightmassの項目でLight mapの質を調節出来ます。

f:id:kazuhironagai77:20210418234226p:plain

実際に作成されたLight mapも表示されています。

f:id:kazuhironagai77:20210418234246p:plain

Mayaを使用してLight mapを作成する方法が紹介されています。

f:id:kazuhironagai77:20210418234303p:plain

以下の様にLightmapの場合、それぞれのTexture上に配置されているMesh同士の間を4 ~ 8 pixelは確保する必要があるそうです。

f:id:kazuhironagai77:20210418234320p:plain

このTutorialでは、Mayaを使用して作成していますが、後でBlenderの作成方法を勉強する必要がありますね。

今回は、Meshが持つ二つ目のUV mapはLightmapとして使用されていた。と言う事だけ覚えておきます。

Importする時は、Generate Lightmap UVsのチェックを外す必要があるそうです。

f:id:kazuhironagai77:20210418234336p:plain

と言う事は、Lightmapを作成しなくてもUE4で勝手に作成してくれるみたいですね。

Meshを開いてDetailのLight Map Coordinate Indexに記されている番号のUVがLightmapに使用されるそうです。

f:id:kazuhironagai77:20210418234353p:plain

最後にLight mapの質についてです。

Light map ResolutionがLight mapの質を表します。

f:id:kazuhironagai77:20210418234527p:plain

Lightmap Densityを選択する事で適切なLight map Resolutionを選択出来ます。

f:id:kazuhironagai77:20210418234545p:plain

以下の様に表示されるので、Light map Resolutionの値を調節して最適化します。

緑色が適切なLight map Resolutionだそうです。

f:id:kazuhironagai77:20210418234602p:plain

こんなの本当に初耳です。

UE4内でLightmapを作成する方法ですが、Mesh内のDetailからGenerate Lightmap UVsをチェックするだけでした。

f:id:kazuhironagai77:20210418234707p:plain

ただその後がちょっと複雑です。

Source Light map Indexで元になるUV mapを選択します。

Destination Lightmap Indexで作成したLightmapを保存する箇所を指定します。

f:id:kazuhironagai77:20210418234731p:plain

これでSaveすれば完成かと思ったら、この後でApply Changesを押せと言っています。

f:id:kazuhironagai77:20210418234750p:plain

所がApply Changesって三か所あるんです。一応Tutorialをじっくり見るとReduction SettingsのApply Changesを押しているみたいです。

Lightmapの時はtexture上に配置されているMesh同士の間を、最低でも4 ~ 8 pixelは確保する必要があると言っていましたがUE4でLightmapを生成した時はそれはどうなってるの?

と思っていたら早速その説明がありました。

Min Lightmap Resolutionの値を大きくするとTexture上に配置されているMesh同士の間が小さくなって、小さくすると隙間が大きくなるそうです。

f:id:kazuhironagai77:20210418234810p:plain

試してみます。

付属のイス(SM_Chair)でLightmapを作成してみます。

f:id:kazuhironagai77:20210418234827p:plain

このイス、なんどUV mapが一個しかありません。

f:id:kazuhironagai77:20210418234842p:plain

じゃLightmapないの?と思ったら、Lightmap Coordinate Indexが0にセットされていました。

f:id:kazuhironagai77:20210418234934p:plain

この一個のUVmapがUVmap兼Lightmapになっているみたいです。

Generate Lightmap UVsにチェックを入れます。

f:id:kazuhironagai77:20210418234959p:plain

Reduction SettingのApply Changesをクリックします。

f:id:kazuhironagai77:20210418235014p:plain

新しいUV mapが作成されました。

f:id:kazuhironagai77:20210418235030p:plain

f:id:kazuhironagai77:20210418235038p:plain

Lightmap Coordinate Indexの値を1に変えました。

f:id:kazuhironagai77:20210418235054p:plain

以下に作成したLightmapを使用したイスを表示します。赤枠で囲ったほうがLightmapを作成した方です。隣のイスは元々のLightmapを使用しています。

f:id:kazuhironagai77:20210418235116p:plain

Lightmap Resolutionを64から128に挙げて見ました。

f:id:kazuhironagai77:20210418235135p:plain

まだ緑色ですのでこれぐらいの細かさでも適正と見なされています。

次はMin Light map Resolutionの値を変えてみます。

f:id:kazuhironagai77:20210418235153p:plain

2倍の128にしました。

f:id:kazuhironagai77:20210418235219p:plain

当たり前ですが、数字を変えただけではUV mapは変化しません。Reduction SettingのApply Changesをクリックする必要があります。

Texture上に配置されているMesh同士の間が半分になったはずです。Texture上に配置されているMeshの位置も変わりました。素人目にはこれでも十分な隙間があるような気がします。

一番の違いはTexture上に配置されているMeshのサイズそのものが大きくなっていますね。

Lightmap Densityも見てみます。

f:id:kazuhironagai77:20210418235237p:plain

こちらは特に変わっていませんでした。

<Wrapping Up and What is Next

特になしです。

このTutorialには続きがあるみたいですのでそれも調べて見ます。

f:id:kazuhironagai77:20210418235305p:plain

作者名から調べたのですが、これ以外のTutorialは作成していないみたいです。

<Quiz 4

二つも間違えてしまいました。SwitchとConstant1ですが一体何の話をしているのか分からなかったです。間違えてから気が付いたんですが、問題はLight関連だけじゃなくて先週勉強した範囲からも出題されていました。

要するにSwitch nodeとConstant 1 nodeの機能についての説明だったんですが、それに気が付きませんでした。

ちょっと後味の悪い終わり方になってしまいました。

2.2 Constructing Believable Environmentの勉強

こっちは確かボリュームが凄かったはずです。

7章もあります。1章だけで普通のTutorial位あるはずです。

f:id:kazuhironagai77:20210418235346p:plain

慌てずにIntroducing Global Illuminationからやって行きます。

2.3 Constructing Believable Environmentの勉強1: Introducing Global Illumination

Global Illuminationって何でしたっけ?

度忘れしちゃいました。

Indirect lightingの事でした。壁が赤いと壁に当たった光も赤くなってその光を浴びた物質もすこしだけ赤くなるやつです。

あれ。Ray Tracingとの違いは?

このビデオ[1]でくわしく解説されていました。

そう言えばこのビデオ、昔見てました。その時かなり勉強になった事を思い出しました。

<Introduction to Global Illumination>

このTutorialは建築家がUE4を使用する時に考慮しなければならない光の加減にフォーカスしています。

Global illuminationには2種類あります。Baked Global Illuminationと Dynamic Global Illuminationです。

<Understanding Lightmass - Baking Checklist

Light map にBakeするためにはMobilityがStaticである必要があります。

Stationary はIndirect lightの情報だけlight map にBakeします。

UV mapについての説明もありました。「2.1 Becoming an Environment Artist in Unrealの続き」の「Light map」で勉強した事と同じです。

Lightmapの自動生成についての説明もほとんど同じでした。

唯一の違いは、Apply Changeは真下についているのをクリックしていました。

f:id:kazuhironagai77:20210418235502p:plain

こっちのTutorialでは

Min Lightmap ResolutionとLight Map Resolutionについて値を同じにするとだけ述べています。

f:id:kazuhironagai77:20210418235521p:plain

名前は同じですし、こういう解釈もありなんですね。

そう言えば、もしMin Lightmap Resolutionの値がLight Map Resolutionの値より大きくなった場合はどうなるんでしょうか?

試しにLight Map Resolutionの値を64にしてみたんですが、イスの色が青味がかる以外の変化はみられませんでした。

f:id:kazuhironagai77:20210418235555p:plain

<Quiz1

もうクイズ。と思ったら2問しかありませんでした。満点でした。

<Intro to Lightmass

Lightmassについてです。色々とLightmassが何かについて解説していますが、LightmassはLightmapへのBakeをする事を指しているみたいです。

<Visualizing Lightmass

Lightmass以外の影響を消した3D viewportの作成方法についてです。

Lighting onlyにセットします。

f:id:kazuhironagai77:20210418235647p:plain

次にScreen Space Ambient Occlusionのチェックを外します。

f:id:kazuhironagai77:20210418235705p:plain

Exposureの設定でGame Settingを外します。

f:id:kazuhironagai77:20210418235723p:plain

Game Settingになっていると光具合が動的に変化してしまうので光具合にブレが生じてしまいます。

Bloomのチェックも外します。

f:id:kazuhironagai77:20210418235741p:plain

Bloomって何してるんでしたっけ?

WikipediaのBloom (shader effect)[2]によると強く光っている部分がはみ出して回りをぼやかす事を指しているようです。

もっと分かり易い説明がありました。UE4DocumentationのBloom[3]です。

f:id:kazuhironagai77:20210418235805p:plain

もうそのままです。

以上です。

ちょっと疑問が沸いてきたんですが、ここで紹介しているやり方はこの人が考えた方法なんでしょうか?それともEpic games社の技術者からやり方を聞いたんでしょうか?これで完全にLightmap以外の光の影響が消えているのかそれともParameterで操作出来る限界なだけでLightmap以外の効果もまだ残っている状態なんでしょうか?

よく分かりません。

別にこのTutorialの作者がそうだと言っている訳ではないですが、Designerの人の中には、ロジックが全く通じない人が居て、言っているそばから言った内容と180°違う事をする人がいます。まるで出来損ないのアニメの主人公のようにです。

もう少し解説がほしいですね。

ちょっとここで一端中止にしておきます。

もし続ける価値がある場合は来週、勉強します。

3.Widget内のBPの整理

もう、1カ月以上前の話なので、BPでどんな整理をしていたのか忘れてしまいました。

Blogを見直しましたが、はっきりとは書かれていません。

Blogを見直していて思い出したのですが、BeginPlay関数で変数にGame ModeとGame InstanceをAssignし、その変数からGame ModeとGame Instanceにアクセスすると、BPが格段に見やすくなる事を発見したはずです。それでそれを元に整理したはずですが、その辺の記述が全くありません。

今週はその辺から直してみます。

3.1 Combat_Itemウィジェットの整理

Combat_Itemウィジェットですが、Parent Widget変数やItem変数を繰り返し呼び出しています。

f:id:kazuhironagai77:20210418235851p:plain

Parent Widget変数やItem変数の呼び出しは一回にしてRe-route ノードを使用します。

f:id:kazuhironagai77:20210418235909p:plain

こんな感じで整理しました。

整理している内にProgramが動かなくなったら大変なので、テストして動作確認もしておきます。

このWidgetは戦闘で使用するアイテムを選択した時にそのアイテムを使用する対象者を選択するためのボタンを表示する機能が実装されています。

ここがきちんと動くように確認します。

f:id:kazuhironagai77:20210418235926p:plain

使用するアイテムを選択します。

f:id:kazuhironagai77:20210418235944p:plain

使用する相手を選択します。

f:id:kazuhironagai77:20210419000013p:plain

セリフの今まで通り表示されています。

f:id:kazuhironagai77:20210419000038p:plain

この部分のセリフはちょっと不自然ですね。後で直します。

普通に動いていますね。大丈夫でしょう。

念のためにOnClicked_ButtonItemにBreak pointを付けて確認して見たら、

f:id:kazuhironagai77:20210419000055p:plain

この画面から動かなくなってしまいました。

f:id:kazuhironagai77:20210419000111p:plain

Break pointを付けた時だけ発生するこの現象もバグの一種と考えるべきなのでしょうか?

良く分かりませんね。

一応、原因だけ追究しておきます。

通常の場合だと、アイテムを選択した時点で、そのアイテムの効能を表示しているWidgetは消えています。

f:id:kazuhironagai77:20210419000129p:plain

カーソルをアイテム名が表示されているボタンに乗せた時に以下の実装で、Combat_DisplayToolImageウィジェットを表示させています。

f:id:kazuhironagai77:20210419000146p:plain

このWidgetが消える前にアイテム名が表示されているボタンをクリックしているから今のバグが発生しているはずです。

直してみます。

ボタンをクリックした時も、このWidgetが消えているかどうか確認して消えていない時は消すようにします。

まず、このWidgetを変数にassignします。

f:id:kazuhironagai77:20210419000209p:plain

この変数がwidgetを保持している時、ClearするためのCustom Eventを作成します。

f:id:kazuhironagai77:20210419000226p:plain

このEventをボタンをクリックした時も呼び出す事にします。

f:id:kazuhironagai77:20210419000241p:plain

勿論、カーソルがボタンから外れた時も呼び出します。

f:id:kazuhironagai77:20210419000258p:plain

これでBreak pointでDebugしている時でも、Combat_DisplayToolImageウィジェットが消えるはずです。

テストします。

f:id:kazuhironagai77:20210419000313p:plain

Debug中ですが、既にCombat_DisplayToolImageウィジェットは消えています。

その後、アイテムを使用する相手を選ぶと、読みましたボタンが表示され普通に戦闘を続行出来ました。

f:id:kazuhironagai77:20210419000329p:plain

出来ました。

3.2 Itemウィジェットの整理

今度はItemウィジェットを整理します。

このItemウィジェットは、道具屋で買い物をする時に表示される商品ボタンと、Pause 画面でアイテムを使用する時に、所持アイテムとして表示されるアイテムボタンを表すWidgetです。

f:id:kazuhironagai77:20210419000400p:plain

道具屋で買い物をする時に表示される商品ボタンです。

f:id:kazuhironagai77:20210419000417p:plain

Pause 画面でアイテムを使用する時に、所持アイテムとして表示されるアイテムボタンです。

f:id:kazuhironagai77:20210419000434p:plain

在庫表と表示されていますが、道具袋の中身と言う意味です。ここも直しておきます。

Itemボタンをクリックした時の実装です。

f:id:kazuhironagai77:20210419000452p:plain

上が、Pause画面でItemを使用した時です。Itemの種類に応じてHPやMPを追加します。その後で、RPGGameInstanceBP内のItemsから使用したItemを消去します。

下が、道具屋でItemを買った時です。Itemの値段に応じて所持金が減ります。その後で、RPGGameInstanceBP内のItemsに購入したitemを追加します。

カーソルをボタン上に置いたときの実装も改善しました。このやり方はCombat_Itemウィジェットの時と全く同じです。

f:id:kazuhironagai77:20210419000509p:plain

テストします。

先ず道具屋で、アイテムボタン上にカーソルを乗せた時です。

f:id:kazuhironagai77:20210419000527p:plain

Display Item Tool Imageウィジェットがきちんと表示されています。

回復薬を買いました。金貨が5減って、道具袋に回復薬が追加されました。

f:id:kazuhironagai77:20210419000544p:plain

今度は道具屋を出て、Pause画面から道具を使用します。

Pause画面から道具袋を開きます。

f:id:kazuhironagai77:20210419000602p:plain

ダークイーサーを使用します。

f:id:kazuhironagai77:20210419000618p:plain

ダークイーサーが道具袋から消え、KUMOのMPが20無くなりました。

イーサーを使用します。

f:id:kazuhironagai77:20210419000636p:plain

MPが20回復しましたが、イーサーが道具袋から消去しました。

出来ているようです。

3.3 Target Characterウィジェットの整理

以下の様に整理しました。

f:id:kazuhironagai77:20210419000700p:plain

このウィジェットは戦闘でアイテムを選択した際に、そのアイテムの使用する相手を選択するためのボタンです。

テストします。

ゴブリンとの戦闘で回復薬、ダークイーサー、イーサーをKUMOに使用しました。

全部のアイテムがKUMOに対して指定した効果を示しました。

f:id:kazuhironagai77:20210419000715p:plain

多分OKです。

3.4 Weaponウィジェットの整理

このWidgetはPause画面で武器を装備する時に、所持している武器や防具を表示するボタンです。

更に、武器屋で、武器や防具を売ったり買ったりする時にも使用します。

現状は以下のように実装されています。

ある程度は整理されていますが、Game ModeやGame Instanceはあちこちで呼び出されています。

f:id:kazuhironagai77:20210419000738p:plain

整理します。

f:id:kazuhironagai77:20210419000754p:plain

正直、あんまり見やすいとは言えないですね。

やっぱり、一つのボタンに沢山の機能、Pause画面で所持している武器や防具を表示するボタンでそのボタンを押す時と装備出来る機能と、武器屋でこのボタンを押すと武器や防具を売ったり買ったりできる機能をつけてしまったからでしょうね。

この辺は考える必要がありますね。

一つのボタンに沢山の機能を詰めるだけつんで使い回すのか、それとも機能毎に、たとえ見た目は一緒でも、別のボタンを作成するのか?どちらが機能的に有利なんでしょうか?

テストします。

武器の売り買い、装備(剣盾、弓矢の両方)を試しましたが特に問題はありませんでした。

f:id:kazuhironagai77:20210419000814p:plain

3.5 PickupItemウィジェットの整理

ここからは直したBPの実装部だけ表示します。

f:id:kazuhironagai77:20210419000835p:plain

3.6 PauseEquipmentウィジェットの整理

f:id:kazuhironagai77:20210419000856p:plain

3.7 Inn_welcomeウィジェットの整理

f:id:kazuhironagai77:20210419000921p:plain

3.8 WeaponShopSellウィジェットの整理

f:id:kazuhironagai77:20210419000942p:plain

3.9 Widget 整理まとめ

これである程度複雑なBPの実装をしている全部のWidgetを整理しました。

この整理の方法を編み出した時は、これしかないと思うくらいの整理の方法だったのですが、一カ月たってから見直して見るとそんなにスゴイ訳でもありませんでした。

4.Map1からLandscape4にWarp出来るようにする。

折角ImportしたLandscape4にMap1からワープできるようにします。

以下のActorを作成しました。

f:id:kazuhironagai77:20210419001009p:plain

このBox内にPlayerが操作するキャラが侵入するとワープ出来る仕組みです。

実際はこのBox内に入ると以下のWidgetが開くようにします。

f:id:kazuhironagai77:20210419001024p:plain

「ワープします。」と選択するとLandscape4へワープします。「止めます。」を選択するとそのままです。

実装も以下のものだけです。

f:id:kazuhironagai77:20210419001040p:plain

テストします。

f:id:kazuhironagai77:20210419001058p:plain

以下のUIが表示されました。

f:id:kazuhironagai77:20210419001356p:plain

「ワープします。」を選択します。

Landscape4にワープしました。

f:id:kazuhironagai77:20210419001413p:plain

これだけだとちょっと物足りないですね。

もう少し考えます。

5.Landscape4で戦闘出来るようにする。

兎に角、簡単に作成します。その後で、徐々に直していこうと思います。

5.1 戦闘の準備

まずは、モンスターを静的に配置しました。

f:id:kazuhironagai77:20210419001446p:plain

この時点で画面がグルグル動いて3D酔いします。

思い出しました。カーソルを常に表示しておかないとこの現象が起きる事を。

先にカーソルを表示させます。

やり方を見るのに、Map1のLevel BPを開く必要があります。

でもMap1のBPを開いたらLandscape4のLevel BPが開けません。2つのLevel BPを同時に開くにはどうすれば良いでしょうか?

調べます。

UE4 Answer HubのHow do I open multiple Level Blueprints at the same time?[4]にやり方が書いてありました。

f:id:kazuhironagai77:20210419001506p:plain

そうこれ。

今まで、何度もやっていてこの方法で沢山のLevel BPを同時に開いて編集していました。

多少、裏技的な気もしますが、試してみましょう。

Map1のLevel BPで作成した変数、MyGameModeを検索します。

f:id:kazuhironagai77:20210419001522p:plain

Map1にあると検索結果が出て来ました。

この結果をクリックします。

Map1が開きました。

f:id:kazuhironagai77:20210419001537p:plain

Landscape4のLevel BPを開きつつ、Map1のLevel BPも開く事が出来ました。

これです。Show Mouse Cursor if Not関数です。自分で作成して名前を忘れてしまいました。

f:id:kazuhironagai77:20210419001552p:plain

この関数内の実装が、結構複雑でこの関数内の実装通りの手順でやらないと問題が発生したはずです。

今回は無難にこの関数をそのまま使用しましょう。

ついでに、BGM、Game Instance、Game ModeそしてThird Person Characterの変数も作成しているのでこれもコピーします。

f:id:kazuhironagai77:20210419001608p:plain

f:id:kazuhironagai77:20210419001616p:plain

以下の様に成りました。

f:id:kazuhironagai77:20210419001632p:plain

テストします。

f:id:kazuhironagai77:20210419001649p:plain

普通に動いています。

BGMが聞こえます。

5.2 戦闘出来る様にする。

試しに戦闘をしてみましょう。

f:id:kazuhironagai77:20210419001710p:plain

あれ。近づいても戦闘が始まりません。

どうしてでしょう?

分かりました。

MonsterはPlayerが操作するキャラがbox内に侵入するとRPGGameModeBPにあるEvent DispatchersであるCombat Beginを呼びます。

f:id:kazuhironagai77:20210419001728p:plain

このCombat BeginはBindしていないので、呼ばれても何もしません。

Combat BeginのBindは、Map1でしていました。以下にその実装部を示します。

f:id:kazuhironagai77:20210419001753p:plain

f:id:kazuhironagai77:20210419001801p:plain

これをLandscape4でも作成する必要があります。

このやり方はActorとLevel BPは直接、データのやり取りは出来ないですが、間にGameModeBPのEvent Dispatchersを挟むとActorとLevel BPでやり取り出来てしまうと言う秘策でした。

すっかり忘れていました。

この部分の実装をそのまま使用します。

f:id:kazuhironagai77:20210419001824p:plain

解説します。

時間を記録する変数です。戦闘から戻って来た時に、何時も朝になっていたら大変ですので、戦闘の始まった時間をGame Instanceに記録しておきます。

f:id:kazuhironagai77:20210419001847p:plain

Landscape4はまだGood Skyを組んでいないので、この部分は今回は何もしません。

場所を記録する変数です。戦闘から戻って来た時に何時も最初の場所になっていたらユーザーは発狂します。

f:id:kazuhironagai77:20210419001903p:plain

同様に向きを記録する変数です。戦闘から戻って来た時に何時も同じ向きになっていたらかなり使いづらいです。

f:id:kazuhironagai77:20210419001917p:plain

思い出してきました。

この向き、幾らここで指定してもPlayer Startの向いている方向に向き直してしまって直すのが大変でした。

最終的にはPlayer Startを消す事で解決しました。

f:id:kazuhironagai77:20210419001932p:plain

今回は、向きまでは関係ないので、無視しておきます。

最後にBattle Field Mapにワープします。

f:id:kazuhironagai77:20210419001947p:plain

これだと、戻ってこれませんね。Map1に戻ってしまいます。

LocationをMap1の最初の発生場所にセットしておきます。

f:id:kazuhironagai77:20210419002005p:plain

向きもMap1の最初の発生と同じにします。

f:id:kazuhironagai77:20210419002020p:plain

これでテストします。

戦闘マップには移動しました。

f:id:kazuhironagai77:20210419002044p:plain

何かエラーが出ています。

f:id:kazuhironagai77:20210419002058p:plain

死んでしまった。

f:id:kazuhironagai77:20210419002115p:plain

予想外でした。武器も魔法も持っていなかった。

後、Z軸も間違っていまいした。

f:id:kazuhironagai77:20210419002128p:plain

NavMeshはMap1のNavMeshのサイズと位置を変更したのでその事を指していると思われます。Map1を開いてBuildします。

Buildしたら以下の警告が出ました。

f:id:kazuhironagai77:20210419002146p:plain

LandscapeのLODを見たら、-1にセットされています。

f:id:kazuhironagai77:20210419002201p:plain

良く分からないですね。

後で調べます。

もう一回テストします。今度は武器を装備してきました。

f:id:kazuhironagai77:20210419002217p:plain

普通に戦闘出来ました。

戦闘に勝利して戻ってくると

f:id:kazuhironagai77:20210419002233p:plain

神官、道具屋、武器屋の三人のNPCがいません。

あれ、バグったと焦っていたら、

f:id:kazuhironagai77:20210419002255p:plain

後ろにいました。

取りあえず、ここまでは成功としましょう。

5.3 戦闘終了後に、同じMapに戻って来れる様にする。

まず戦闘終了後に、必ずMap1に飛ぶ理由は、RPGGameModeBPでそう実装しているからです。

f:id:kazuhironagai77:20210419002317p:plain

ここに戦闘前のマップに戻るようにセットすれば、戦闘終了後に、同じマップの同じ場所に戻って来れるはずです。

RPGGameInstanceBPに、戦闘前のマップのマップの名前を保存するための変数、MapNameBeforeBattleを作成しました。

タイプは取りあえずNameにしました。

f:id:kazuhironagai77:20210419002333p:plain

はい。

戦闘終了後、RPGGameInstanceBP のMapNameBeforeBattleに書かれているマップに戻るようにRPGGameModeBPで実装し直しました。

f:id:kazuhironagai77:20210419002348p:plain

新しいLevelを開いた時、以下のコードをevent begin playに実装する事でRPGGameInstanceBP のMapNameBeforeBattleにmapの名前を記録します。

Map1とLandscape4のLevel BPに実装しました。

f:id:kazuhironagai77:20210419002413p:plain

これで、戦闘が終わったらもとのLandscapeに戻るはずです。

Landscape4で戦闘してみました。

f:id:kazuhironagai77:20210419002430p:plain

Landscape4に戻って来てます。

戻ってきていますが、場所が最初にワープした所です。

5.4 戦闘終了後に、同じMapの同じ場所に戻って来れる様にする。

理由が分かりました。

RPGGameModeBPの以下の箇所でPlayerが操作するキャラの発生場所を指定してますが、開いているLevelがLandsape4の場合、戦闘後でもワープでも同じ個所を指定しています。

f:id:kazuhironagai77:20210419002456p:plain

直します。

RPGGameInstaceBPにBoolean変数であるBackFromBattleFieldを作成します。

f:id:kazuhironagai77:20210419002511p:plain

戦闘画面に飛んだらBackFromBattleField変数をTrueにセットするようにします。

f:id:kazuhironagai77:20210419002536p:plain

戦闘が終り元のマップに戻って来た時に、BackFromBattleField変数がTrueならば、戦闘前の場所へ戻るようにします。

f:id:kazuhironagai77:20210419002600p:plain

何故か前の実装ではMap1はDefaultで指定されていたのでそこも直します。

f:id:kazuhironagai77:20210419002617p:plain

これでlandscape4内で戦闘した場合でも、戦闘が終わったら元の場所に戻ってくるはずです。

ただし、Landscape4ではMonsterは静的に生成しているので、全く同じ場所に戻ってきたらまた戦闘が始まってしまいます。

それを避ける為に少し戻る位置をずらしておきます。

f:id:kazuhironagai77:20210419002639p:plain

テストします。

Landscape4で戦闘を終了したらLandscape4の戦闘した位置から200cmx軸側にずれた位置に戻って来ました。

f:id:kazuhironagai77:20210419002658p:plain

大成功ですが、200cmだと本当にモンスターの隣でした。500cmに直しておきます。

念のために、Map1でも戦闘してみましたが、Map1の時の普通に元の場所に戻って来ました。

f:id:kazuhironagai77:20210419002715p:plain

一応出来ました。

今週の予定は終わってしまったので別な事を時間がある限りやっていきます。

6.Warp Spotの改良

Warp Spotを作成しましたが、色々な点が酷いです。

f:id:kazuhironagai77:20210419002742p:plain

まず、近づくとどこからでもWidgetを表示します。

f:id:kazuhironagai77:20210419002805p:plain

単に後ろを通っただけでもWidgetを表示します。

しかもWidgetを表示したまま移動できます。

f:id:kazuhironagai77:20210419002822p:plain

直していきます。

6.1 NPCの復習

NPCとの会話は上手く作成出来ていたはずです。

それを利用して直します。

NPCに近づくと(!!)が光ります。

f:id:kazuhironagai77:20210419002843p:plain

光っている状態の時にEを押すとWidgetが開きそのNPCと会話出来ます。

f:id:kazuhironagai77:20210419002910p:plain

会話中はキャラを動かす事は出来なくなります。

6.2 (!!)の表示

イキナリ、Widgetを表示するのではなく(!!)を表示します。

Warp Spotを改良するよりNPC_Personを改良した方が簡単そうです。

f:id:kazuhironagai77:20210419002943p:plain

f:id:kazuhironagai77:20210419002950p:plain

NPC_Personをduplicateして以下の様に改良しました。名前はWarpSpot_NPCとしました。

f:id:kazuhironagai77:20210419003006p:plain

とりあえずInstanceをMap1に配置し、そのInstanceの設定は以下のようにしました。

f:id:kazuhironagai77:20210419003025p:plain

近づくと(!!)が光ります。

f:id:kazuhironagai77:20210419003043p:plain

後ろから近づいても(!!)が光るだけになりました。

f:id:kazuhironagai77:20210419003058p:plain

6.3 職業の作成

NPCは職業によってどのWidgetを開くかを決定します。

UE4C++のRPGGameModeにNPCが成れる職業の一覧があります。

f:id:kazuhironagai77:20210419003118p:plain

ここにWarp Gate Keeperを追加します。

うん。Warp SpotよりWarp Gateの方がカッコイイですね。Warp GateとWarp Gate Keeperで統一します。

f:id:kazuhironagai77:20210419003137p:plain

追加しました。

Buildして一回、UE4Editorを閉じます。再起動します。

ThirdPersonCharacterのWarpGatekeeperに以下のコードを追加します。

f:id:kazuhironagai77:20210419003200p:plain

テストします。

(!!)が表示されている状態でEを押すと、Warp用のWidgetが表示されました。

f:id:kazuhironagai77:20210419003215p:plain

f:id:kazuhironagai77:20210419003223p:plain

Set Game PausedとSet Input Mode Game And UIを使用しているので、Widgetが開いている間はキャラは全く動けません。

ワープを選択するとLandscape4に移動しました。

f:id:kazuhironagai77:20210419003240p:plain

かなり良くなりました。

7.まとめと感想

今週はまだ時間がありますが、キリが良いのでここで終わりにします。

今週は、

  • Environmental artist用のTutorialとしてBecoming an Environment Artist in Unrealの残りとConstructing Believable Environmentの最初の章であるIntroducing Global Illuminationを途中まで勉強しました。
  • WidgetBPのコードを読みやすいように整理しました。
  • Map1からLandscape4にWarp Gateを使用する事で移動出来るようにしました。
  • Landscape 4でモンスターと戦闘が出来るようにしました。

来週は、

  • バグの直し
    • 戦闘中にアイテムを使用した時のセリフの直し
    • Map1でBuildするとLandscape_0 instead mesh…と警告される
  • Effectの勉強
  • Effect(魔法陣)をWarp Gateに追加する。
  • Landscape4にもっとモンスターを配置する。
  • Landscape4からMap1に戻るためのWarp Gateを作成する。
  • 地図のワープ機能とLandscape4をどうやって絡めていくのかを検討する。
  • Map1の家の影が真っ暗な理由をConstructing Believable Environmentで勉強したGlobal Illuminationと絡めて勉強する。

などをやろうと思います。

8.参考文献(Reference

  1. Gamers Nexus. (2019, February 28). Faking RTX Global Illumination vs. RTX | 100% Ray-Traced Game, Pt 1 [Video]. YouTube. https://www.youtube.com/watch?v=CuoER1DwYLY
  2. Bloom (shader effect). (2020, December 31). In Wikipedia. https://en.wikipedia.org/wiki/Bloom_(shader_effect)
  3. Epic Games. (n.d.-a). Bloom. Unreal Engine Documentation. Retrieved April 18, 2021, from https://docs.unrealengine.com/en-US/RenderingAndGraphics/PostProcessEffects/Bloom/index.html
  4. Epic Games. (n.d.-b). How do I open multiple Level Blueprints at the same time? - UE4 ANSWERHUB. UE4 ANSWERHUB. Retrieved April 18, 2021, from https://answers.unrealengine.com/questions/792583/how-do-i-open-multiple-level-blueprints-at-the-sam.html