<前文>
で勉強しています。
今回は、新しいツールバーボタンを作る話です。正直、このレシピを楽しみにしていました。「UE4でゲームを作っています。」と言うのと、「カスタマイズしたUE4でゲームを作っています。」と言うのでは響きが全然、違います。後者はプロっぽいです。なので、すごく楽しみです。
<本文>
<目的>
今回のレシピは、ツールバーに新しいボタンを追加する方法を学習します。
教科書の説明では、下記のイメージのように、
ツールバーの中に新しいボタン、My Buttonを作ります。
<方法>
基本的に教科書に書かれている通りです。教科書に書かれてない不明な個所(クラス名など)は、Packet Publish社から提供されているサンプルコードを参考にしています。
- 前回、「新たにエディターモジュールを作る。」で作成したコードをそのまま使います。
- CookbookCommandsクラスを作ります。
生のC++のクラスなので、VSから作りました。もちろん、Sourceファイル内のEditorファイルに保存します。コードは教科書に書いてある通りです。
- UE4CookbookEditorクラスに以下のコードを足します。
基本的に教科書のコードをそのまま写しました。Packet Publish社から提供されているサンプルコードでは、更にpublicの指定があったのでそれも足しました。
- UE4CookbookEditorクラスのヘッダーファイルにhをインクルードします。
Packet Publish社から提供されているサンプルコードでは、更に上記のクラスがインクルードされていたので、それを足しています。
- UE4CookbookEditorクラスのソースファイルのメンバーファンクションであるStartupModule()と、ShutdownModule()に以下のコードを足します。
教科書のコードをそのまま写しました。
- UE4CookbookEditorクラスのソースファイルに以下のヘッダーファイルをインクルードします。
Packet Publish社から提供されているサンプルコードでは、更に上記のクラスがインクルードされていたので、それを足しています。
<結果>
コンパイルしたら、エラーが返ってきました。
<考察>
まず、エラーが出る箇所を全てコメントアウトしました。
ビルドをしてみます。
出来ました。
次に、最初の一行である、
Register function のコメントアウトを解除します。そして、同じようにビルドをします。
エラーが返ってきました。まずこのエラーから直していこうと思います。
全てのエラーはリンクのエラーなのでコンパイルは出来たが、リンキングに失敗したのだと考えられます。ここで、Register functionについて少し調べて見ます。
Register function は、FCookbookCommandsクラスの親クラスのTCommandsクラスのメンバーファンクションです。TCommandsクラスとのリンキングに問題があるのでしょうか?
ヘッダーファイルは、Commands.hとなっています。
もちろん、Commands.hはインクルードしています。
ここで、あれ?と思ったのですが、リファレンスの処に、モジュール、Slateと書かれています。前回読んだ資料の中に、使用するモジュール名を全て指定する場所があったような気がします。
完全に同じではないですが、How to set the Build.cs file for use slate? に近い質問と回答が載っていました。エディターファイル内のEditor.Build.csクラスに使用するモジュール名を全て指定する必要があるようです。
Packet Publish社から提供されているサンプルコードを見ると、
となっているので、もうそのまま使ってしまいます。
ここで、もう一度、ビルドしてみます。
CookbookCommand.cpp ファイルで、CookbookCommand.hを最初にインクルードせよ。とエラーメッセージが表示されたので、
しました。もう一度、ビルドをすると、
ビルド出来ました。
なんか、全てこれで解決しそうな気がしてきたので、全てのコメントアウトを解除してみると、
UE4CookbookEditor.h クラスの上記の部分にエラーが、まだ出ているので、IMainFrameModuleクラスをAPIで調べて見ると、
ヘッダーファイルが、IMainFrameModule.hに代わっているので、以下のように変更すると
エラーが全部消えて、ビルドを行うと
成功しました。さらに、デバックを実行すると、
成功しました。
成功しましたが、個々のコードが何をしているのが不明のままです。来週は一つ一つのコードを見ていきたいと思います。
<まとめ>
- 教科書通り(+分からない箇所をPacket Publish社から提供されているサンプルコード)に再現したサンプルはビルドすると、エラーが起きる。
- UE4CookbookEditorフォルダー内のBuild.csクラスに、新たに使用するモジュールを足す必要がある。
- MainFrame.hはIMainFrameModule.hに交換する(deprecated class?)。
- 以上の事を行うと、正しくビルトかつ実行出来る。
<おまけ>
最初にこのレシピを勉強した時、スクリーンショットを全く撮ってなくて、ブログを書くためにもう一度、最初からプロジェクトを作成してやり直したら、前回の、新たにエディターモジュールを作る、と同じ状態にしたのに、コンパイルせず、2、3時間取られました。
原因は、PublicDependencyModulenames.Add(“project Name”)を、前回のプロジェクト名にしたままでコピーして使っていたからでした。