UE4の勉強記録

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

12章「UE4のAPIを使う」と12章1節「コア/ログのAPI:カスタム化したログのカテゴリーを定義する」

<前文>

f:id:kazuhironagai77:20180902113251p:plain

で勉強しています。10章はUnrealC++についての内容でなく単なるブループリントの使い方でした。一応内容を知るためには全部やる必要があると思い頑張って勉強しましたが、途中でギブアップとなりました。やはりUnrealC++の勉強をしているのにブループリントを変わりに教えられたら人間はいつか切れます。ので11章もまるまるスキップします。大学で3D関連の研究をしていた私は、11章のマテリアルとシェーダーが実は最も楽しみにしていた分野だったのですが騙されました。11章もブループリントしか使用していませんでした。この本以外にUnrealC++についての教科書がない現状ではこの本で勉強する以外はないですが、正直もうこの本を他人にお勧めする気はなくなりました。

<本文>

<目的>

今回は、12章が何を勉強するのかについての解説を行います。パラパラと見た感じでは12章はUnrealC++について結構深い所まで教えていそうです。

<本文のまとめ>

教科書の12章を読むと、最初にAPIとbuild.csファイルの解説がありその後に序文が続いています。ティップには、

f:id:kazuhironagai77:20180923201015p:plain

UE4のプロジェクトをUE4APIの名前と全く同じ名前にしてはいけない。

と当たり前すぎる事を書いています。もうこの辺りから不安になります。更にbuild.csファイルの説明で使用する総てのAPIのリストをここに記入しないといけないと、今更そんな事を述べています。それは8章の最初に説明しないといけないのではなかったの?build.csファイルの使い方を知らないで8章のレシピを再現するのがどんなに大変だったのか思い出します。更にbuild.csファイルの記入の仕方については全く解説していないのでそこにも頭に来ます。さらにプログラマーとしては、何故ここだけC#を使用しているのかについての解説がちょっとでも欲しい所でもありますが全くその事についての説明はありません。

と不安になったり頭にきたりと大分健康に悪い始まりとなっていますが、その後でこの章でどんな内容を勉強するか紹介されていました。

f:id:kazuhironagai77:20180923201130p:plain

簡単に訳すと以下のようになりました。

  1. コア/ログのAPI
    • カスタム化したログのカテゴリーを定義する。
    • FMessageLog、メッセージのログにメッセージを書き込む。
  2. コア/mathのAPI
    • FRotatorを使用した回転
    • FQuatを使用した回転
    • 一個のオブジェクト面と他の面を持つためのFRotationMatrixを使った回転
  3. ランドスケープAPI
  4. 葉のAPI
    • レベルに正しい手続きで木を付加する。
  5. GamePlayAbilities API
    • ゲームコントロールを使用してアクターのゲームプレイのアビリティをトリガーする。
  6. GamePlayAbilities API
    • AttributeSetを使用したStatsの実行
    • GamePlayEffectを使用したbuffsの実行
  7. GameTags API
    • アクターにGamePlayTagsを付ける。
    • GamePlayTasksを使用してある事が起きるようにする。
  8. HTTP API

12章は勉強のしがいがあるように思えます。その後に簡単な序文がついていました。序文には特に重要な内容はなかったのでスキップします。

 

12章1節「コア/ログのAPI:カスタム化したログのカテゴリーを定義する」

<前文>

f:id:kazuhironagai77:20180902113251p:plain

では、早速、12章1節「コア/ログのAPI:カスタム化したログのカテゴリーを定義する」を勉強してみましょう。

<本文>

<目的>

「コア/ログのAPI:カスタム化したログのカテゴリーを定義する」を勉強します。

教科書によると、UE4のログはいくつかのカテゴリーに沿って生成されるそうです。例えば、アクターに関係したログはLogActor、アニメーションに関係したログはLogAnimationと言うようにです。

以下に示した例は、教科書に記載されていたそのものですが

f:id:kazuhironagai77:20180923201455p:plain

LogContentBrowser、LogLoad、LogStreaming、そしてLogExternalProfilerがありました。

一方で、我々が一般に目にするログは(教科書によれば)LogTempだそうです。

f:id:kazuhironagai77:20180923201528p:plain

これは確かにそうです。そして、このログをカスタム化する方法を今回学びます。

<方法>

Step.0

プロジェクト名をChapter12Part1とします。

Step.1

f:id:kazuhironagai77:20180923201704p:plain

f:id:kazuhironagai77:20180923201716p:plain

私のプロジェクト名はChapter12Part1なのでメインのヘッダーファイルはChapter12Part1.hなはずです。Chapter12Part1.hを開いてみると、以下のようになっていました。

f:id:kazuhironagai77:20180923201747p:plain

多分ここに書き込めばいいんでしょうが、Engine.hはありませんね。UE4のバージョンが違うからでしょう。ここに更にEngine.hを追加しなければならないかどうかは分かりません。念のためにPacket Publish社の提供するサンプルコードを確認してみます。

f:id:kazuhironagai77:20180923201913p:plain

Chapter12.hを開いてみます。

f:id:kazuhironagai77:20180923202004p:plain

やっぱり#include “Engine.h”がありました。がそれ以上がありません。

f:id:kazuhironagai77:20180923202023p:plain

取りあえず追加してみましたがエラーが出ています。エラーの原因はソースファイルに定義がないからみたいです。2.で定義をするようなのでこのまま行きます。

f:id:kazuhironagai77:20180923202101p:plain

DECLARE_LOG_CATEGORY_EXTERNの3つのアギュメントについての解説のようです。

Step.2

f:id:kazuhironagai77:20180923202145p:plain

f:id:kazuhironagai77:20180923202155p:plain

以下のように追加しました。

f:id:kazuhironagai77:20180923202215p:plain

特にエラーは出ませんでしたが、ヘッダーファイルはまだエラーを表示しています。

f:id:kazuhironagai77:20180923202235p:plain

取りあえずビルトしてみました。

f:id:kazuhironagai77:20180923202250p:plain

大丈夫なのでこのまま次に行きます。

<結果>

Step.3

f:id:kazuhironagai77:20180923202342p:plain

f:id:kazuhironagai77:20180923202356p:plain

取りあえず、アクタークラスからMyActorクラスを作成して、そこにUE_LOGを配置してみます。

f:id:kazuhironagai77:20180923202424p:plain

f:id:kazuhironagai77:20180923202433p:plain

エラーになってしまいました。

色々調べましたがエラーの原因が分かりません。ただヒントみたいなものは見つけました。このサイトに以下の説明がありました。

f:id:kazuhironagai77:20180923202512p:plain

「ベースのヘッダーファイルを追加しないと使えないよ。」と書いてあります。ベースのヘッダーファイルが何を指すのかが不明ですがそれが分かれば解決しそうです。

この中国語のサイトに答えが載っていました。DECLARE_LOG_CATEGORY_EXTERNを宣言したクラスを、UE_LOGを使用するクラスでインクルードする必要があるとあります。(中国語は全く読めませんので図と漢字から推測しているだけです。)

f:id:kazuhironagai77:20180923202538p:plain

してみました。

f:id:kazuhironagai77:20180923202616p:plain

見事に動きました。

<考察>

ヘッダーファイルをインクルードしなければそのファイルは読み込まれないのは常識ですが、作成したアクタークラスがプロジェクトクラスを最初からインクルードしていないとは思いませんでした。更にそれを指摘してくれたサイトが中国語のみだったのも驚きです。私は中国語は全く読めませんが、これからのプログラマーは英語に加えて中国語の勉強が必須になるかもしれません。日本語のサイトもDECLARE_LOG_CATEGORY_EXTERNを宣言してカスタム化したログのカテゴリーを定義する方法を説明したサイトはいくつかありましたが、ヘッダーをインクルードしないと動かない事までは書いていませんでした。

<まとめ>

今回は、カスタム化したログのカテゴリーの定義の仕方を習いました。そのやり方は、

 1.DECLARE_LOG_CATEGORY_EXTERN(Log+プロジェクト名, Log, All);をプロジェクト名.hに追加。

 2.DEFINE_LOG_CATEGORY(Log+プロジェクト名);をプロジェクト名.cppに追加。

以上です。VS上ではエラーが表示されますがそのままビルド出来ます。

次に使用方法ですが、一般的なログの使用と同じように、

UE_LOG(Log+プロジェクト名, Display, TEXT("A display message, log is working."));

とログを発信したい個所に追加します。

ただし、カスタム化したログ名を使用する場合は、その使用するクラスのヘッダーファイルに、プロジェクト名.hをインクルードする必要があります。(重要!)

<おまけ>

久しぶりに勉強した気がします。10章は何だったのでしょうか?何か覚めない悪夢を見ていたみたいです。