UE4の勉強記録

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

新しいツールバーボタンを作る

<前文>

f:id:kazuhironagai77:20180204120934p:plain

で勉強しています。

今回は、新しいツールバーボタンを作る話です。正直、このレシピを楽しみにしていました。「UE4でゲームを作っています。」と言うのと、「カスタマイズしたUE4でゲームを作っています。」と言うのでは響きが全然、違います。後者はプロっぽいです。なので、すごく楽しみです。

 

<本文>

<目的>

今回のレシピは、ツールバーに新しいボタンを追加する方法を学習します。

教科書の説明では、下記のイメージのように、

f:id:kazuhironagai77:20180204121031p:plain

ツールバーの中に新しいボタン、My Buttonを作ります。

<方法>

基本的に教科書に書かれている通りです。教科書に書かれてない不明な個所(クラス名など)は、Packet Publish社から提供されているサンプルコードを参考にしています。

  1. 前回、「新たにエディターモジュールを作る。」で作成したコードをそのまま使います。

f:id:kazuhironagai77:20180204121101p:plain

  1. CookbookCommandsクラスを作ります。

f:id:kazuhironagai77:20180204121136p:plain

f:id:kazuhironagai77:20180204121157p:plain

生のC++のクラスなので、VSから作りました。もちろん、Sourceファイル内のEditorファイルに保存します。コードは教科書に書いてある通りです。

  1. UE4CookbookEditorクラスに以下のコードを足します。

f:id:kazuhironagai77:20180204121318p:plain

基本的に教科書のコードをそのまま写しました。Packet Publish社から提供されているサンプルコードでは、更にpublicの指定があったのでそれも足しました。

  1. UE4CookbookEditorクラスのヘッダーファイルにhをインクルードします。

f:id:kazuhironagai77:20180204121347p:plain

Packet Publish社から提供されているサンプルコードでは、更に上記のクラスがインクルードされていたので、それを足しています。

  1. UE4CookbookEditorクラスのソースファイルのメンバーファンクションであるStartupModule()と、ShutdownModule()に以下のコードを足します。

f:id:kazuhironagai77:20180204121414p:plain

教科書のコードをそのまま写しました。

  1. UE4CookbookEditorクラスのソースファイルに以下のヘッダーファイルをインクルードします。

f:id:kazuhironagai77:20180204121441p:plain

Packet Publish社から提供されているサンプルコードでは、更に上記のクラスがインクルードされていたので、それを足しています。

  1. コンパイルします。
  2. デバックします。
  3. My Buttonツールバーに出来ているか確認します。

<結果>

コンパイルしたら、エラーが返ってきました。

f:id:kazuhironagai77:20180204121502p:plain

<考察>

まず、エラーが出る箇所を全てコメントアウトしました。

f:id:kazuhironagai77:20180204121522p:plain

f:id:kazuhironagai77:20180204121540p:plain

f:id:kazuhironagai77:20180204121551p:plain

ビルドをしてみます。

f:id:kazuhironagai77:20180204121605p:plain

出来ました。

次に、最初の一行である、

f:id:kazuhironagai77:20180204121622p:plain

Register function のコメントアウトを解除します。そして、同じようにビルドをします。

f:id:kazuhironagai77:20180204121639p:plain

エラーが返ってきました。まずこのエラーから直していこうと思います。

全てのエラーはリンクのエラーなのでコンパイルは出来たが、リンキングに失敗したのだと考えられます。ここで、Register functionについて少し調べて見ます。

f:id:kazuhironagai77:20180204121701p:plain

f:id:kazuhironagai77:20180204121712p:plain

Register function は、FCookbookCommandsクラスの親クラスのTCommandsクラスのメンバーファンクションです。TCommandsクラスとのリンキングに問題があるのでしょうか?

f:id:kazuhironagai77:20180204121728p:plain

ヘッダーファイルは、Commands.hとなっています。

f:id:kazuhironagai77:20180204121742p:plain

もちろん、Commands.hはインクルードしています。

ここで、あれ?と思ったのですが、リファレンスの処に、モジュール、Slateと書かれています。前回読んだ資料の中に、使用するモジュール名を全て指定する場所があったような気がします。

完全に同じではないですが、How to set the Build.cs file for use slate? に近い質問と回答が載っていました。エディターファイル内のEditor.Build.csクラスに使用するモジュール名を全て指定する必要があるようです。

Packet Publish社から提供されているサンプルコードを見ると、

f:id:kazuhironagai77:20180204121804p:plain

となっているので、もうそのまま使ってしまいます。

f:id:kazuhironagai77:20180204121817p:plain

ここで、もう一度、ビルドしてみます。

CookbookCommand.cpp ファイルで、CookbookCommand.hを最初にインクルードせよ。とエラーメッセージが表示されたので、

f:id:kazuhironagai77:20180204121838p:plain

しました。もう一度、ビルドをすると、

f:id:kazuhironagai77:20180204121858p:plain

ビルド出来ました。

なんか、全てこれで解決しそうな気がしてきたので、全てのコメントアウトを解除してみると、

f:id:kazuhironagai77:20180204121913p:plain

f:id:kazuhironagai77:20180204121938p:plain

UE4CookbookEditor.h クラスの上記の部分にエラーが、まだ出ているので、IMainFrameModuleクラスをAPIで調べて見ると、

f:id:kazuhironagai77:20180204121955p:plain

ヘッダーファイルが、IMainFrameModule.hに代わっているので、以下のように変更すると

f:id:kazuhironagai77:20180204122016p:plain

エラーが全部消えて、ビルドを行うと

f:id:kazuhironagai77:20180204122031p:plain

成功しました。さらに、デバックを実行すると、

成功しました。

f:id:kazuhironagai77:20180204122047p:plain

成功しましたが、個々のコードが何をしているのが不明のままです。来週は一つ一つのコードを見ていきたいと思います。

<まとめ>

  1. 教科書通り(+分からない箇所をPacket Publish社から提供されているサンプルコード)に再現したサンプルはビルドすると、エラーが起きる。
  2. UE4CookbookEditorフォルダー内のBuild.csクラスに、新たに使用するモジュールを足す必要がある。
  3. MainFrame.hはIMainFrameModule.hに交換する(deprecated class?)。
  4. 以上の事を行うと、正しくビルトかつ実行出来る。

<おまけ>

最初にこのレシピを勉強した時、スクリーンショットを全く撮ってなくて、ブログを書くためにもう一度、最初からプロジェクトを作成してやり直したら、前回の、新たにエディターモジュールを作る、と同じ状態にしたのに、コンパイルせず、2、3時間取られました。

f:id:kazuhironagai77:20180204122108p:plain

原因は、PublicDependencyModulenames.Add(“project Name”)を、前回のプロジェクト名にしたままでコピーして使っていたからでした。