UE4の勉強記録

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

12章6節 Landscape API –パーリンノイズ(Perlin Noise)を使用したランドスケープ(landscape)の生成 part3

<前文>

f:id:kazuhironagai77:20181118214012p:plain

前回、やり残した部分をやっていきます。今回も、考察のみです。

<本文>

前々回、以下の部分の考察をしますと言って終了しました。

  1. 再現出来る「Landscape API –パーリンノイズ(Perlin Noise)を使用したランドスケープ(landscape)の生成」の方法について
  2. 「本当に教科書に載っているレシピでは出来ないのか?」の検証
  3. 今回のレシピ作成で得た知見は正しいのかの検証。以下の事についての検証が必要です。

(ア)  「エディターの世界(editor world)とゲームの世界(game world)」の違い
(イ)   「パーリンノイズ(Perlin noise)」を作成するためのコードPerlinNoise1234は本当に間違っているのか?」
(ウ)   UFUNCTION()は必要?

前回は、その中で3の(イ)と(ウ)のみを終わらしました。今回は、3の(ア) 「エディターの世界(editor world)とゲームの世界(game world)」の違いから考察していきます。

<考察>

前々回、「エディターの世界(editor world)とゲームの世界(game world)」がある事が判明して、しかもRecreateLandscapeInfo()関数を使用するためには、以下に示すように、

f:id:kazuhironagai77:20181118214226p:plain

GameWorld以外の世界でないと使用出来ない事も分かりました。このworldについて調査します。

まず、EWorldType::TypeのAPIを見つけました。

f:id:kazuhironagai77:20181118214243p:plain

Worldのタイプは、EditorとGameだけではないようですね。

f:id:kazuhironagai77:20181118214307p:plain

None                       タイプされていない世界(world)、ほとんどのケースでは、サブレベル内のストリームされた痕跡の世界(Vestigial world)です。

Game:                        ゲームの世界(game world)

Editor:                         エディター内の編集された世界

PIE:                               エディターの世界(editor world)でのプレイ

EditorPreview:                   エディターツールのためのプレビュー世界(preview world)

GamePreview:                   ゲームのためのプレビュー世界(preview world)

GameRPC:                   ゲームのための最小のRPC世界

Inactive:                      ロードされたエディター世界であるが現在レベルエディター内で編集されていない。

ウーン。PIEとGameは違う世界なのですね。RPCとは何なんでしょうか?痕跡の世界(Vestigial world)も何の事が分かりません。

取りあえず、以下に示したコードを追加して調べて見ます。

f:id:kazuhironagai77:20181118214449p:plain

まずプレイ中です。

Selected viewport->PIE

New editor window->PIE

Simulate->PIE

まあ、これらは想像通りですね。

Stand aloneはOutputLogに表示されないのですね。Saved ファイル内のlogsファイルのChapter12part4_2.logを見るとGameに成っていました。

因みに、UE4エディター上でPlayしない状態では、Editorでした。

ウーン。これは大体想像通りですね。

色々調べたのですが、Googleで何も引っかからないと先に進めない事に気が付きました。ウーン。この辺が限界ですかね。

では、今まで調べた事を基に「本当に教科書に載っているレシピでは出来ないのか?」の検証をします。

まず、何故ここにそんなにここにこだわるのかについてなのですが、以下の文章がちょっと気になっているんです。

f:id:kazuhironagai77:20181118214553p:plain

ここで、ブートされた(booting)ブループリントと言っていますがそれが何を指すのか良く分かっていません。もしかしたらブートされた(booting)ブループリントはエディターモードから操作出来るのかもと思っています。

もう一つ気になる事があります。それはcheck()です。これってUE4C++のassertですよね。Assertはたしかdebugでは有効ですが、releaseモードになったら無効だったはずです。もしかしたら教科書はreleaseモードでビルトしていてここで、exceptionは投げられないのではないのかと思いました。

f:id:kazuhironagai77:20181118214610p:plain

あまり一つの事に凝るのはいい事ではないかもしれませんが、この二つについては少し調べて見たいと思います。

ブートされた(booting)とは電源を入れた瞬間に起動する処理を指していると考えるとエディター上でも動くブループリントがあるかもと思っています。エディターモードでUMGを表示しているUE4エディターのスクリーンショットが一つでも見つかれば可能性があると考えgoogleしました。

一個も見つかりませんでした。

ウーン無理みたいです。

もう一つの可能性も調べて見ますか。

UE4のAssertionsによるとCheckはDO_CHECK=1以外の時にはdebugでもそれ以外でも関係なく止めるとあります。

f:id:kazuhironagai77:20181118214759p:plain

下に示したマクロはアサート(assert)trueじゃない時、全ての実行を停止します。

もしdebugで実行していたら、このアサートはどのようにそのポイントにたどり着いたのかを検査出来るようにブレイクポイント(break point)を引き起こします。

Check(expression)

これも無理でした。

「本当に教科書に載っているレシピでは出来ないのか?」の回答ですが、「出来ない。」が正しいようです。

前回、述べたように、「再現出来る「Landscape API –パーリンノイズ(Perlin Noise)を使用したランドスケープ(landscape)の生成」の方法について」は考察する必要はないと考えられますのでこれで終わりです。

 

では、3週間に渡ったLandscape API –パーリンノイズ(Perlin Noise)を使用したランドスケープ(landscape)の生成の考察をまとめます。

質問1.   再現出来る「Landscape API –パーリンノイズ(Perlin Noise)を使用したランドスケープ(landscape)の生成」の方法について

解答: これはする必要がないのでスキップしました。

質問2.   「本当に教科書に載っているレシピでは出来ないのか?」の検証

解答: 出来ない。gameモードでもPIEモードでもRecreateLandscapeInfo()関数を使用する事は出来ない。gameモードでもPIEモード以外でUMGを使用する方法は見つからなかった。よって出来ないと考えられる。

質問3.   今回のレシピ作成で得た知見は正しいのかの検証。以下の事についての検証が必要です。

質問(ア)   「エディターの世界(editor world)とゲームの世界(game world)」の違い

解答:EWorldType::TypeのAPIによればworldのタイプは8種類あり、PIE、game、editorは確認出来た。それ以外は良く分からなかった。

質問(イ)   「パーリンノイズ(Perlin noise)」を作成するためのコードPerlinNoise1234は本当に間違っているのか?」

 解答:間違ってはいなかった。しかし正しい使い方を理解するのためには、パーリンノイズ(Perlin noise)そのものをかなり理解する必要があり、間違えて使用しても仕方ないかなと思いました。

質問(ウ)   UFUNCTION()は必要?

解答:FUNCTION()はガーベジコレクション(garbage collection)とは何の関係もないので、UE4の変数のメモリーを開放するためには全く必要ではない。

<まとめ>

このレシピでは、パーリンノイズ(Perlin Noise)を使用したランドスケープ(landscape)の生成を勉強しました。

以下のやり方で実行しました。

0.パーリンノイズ(Perlin noise)を教科書の付属のサンプルコードか教科書に書かれているサイトからダウンロードしてプロジェクトに追加します。

1.Project.Build.csファイル内で、LandscapeとLandscapeEditorのAPIをリンクします。

2.アクタークラスを作成して、

f:id:kazuhironagai77:20181118215017p:plain

をそのヘッダークラスに追加します。これで、エディターモードからGen()関数を呼び出す事が出来ます。

3.ULandscapeInfo::RecreateLandscapeInfoをGen()関数の実装部に追加します。これでLandscapeとLandscapeEditorの使用が可能になります。

4.教科書でゲームモード(gamemode)クラス内に書かれている関数を全て作成したアクタークラスに書きます。

<おまけ>

ゲームのためのデザインパターンを勉強していますが、「ゲームプログラマのためのコーディング技術」と言う本がある事を最近知りました。まだ最初の章しか読んでいませんが大変勉強になります。大変濃い内容ですが、読みやすいし要点が綺麗にまとまっています。

まだGame Programming Patternsも読んでいる途中ですがゲームのためのデザインパターンの勉強も出来るだけやって行きたいと思います。