UE4の勉強記録

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

8章13節 メニュー内の新しい項目の作成

<前文>

f:id:kazuhironagai77:20180225113310p:plain

で勉強しています。

今回は、「8章13節 メニュー内の新しい項目の作成」を勉強します。メニュー内に新しい項目を作成する方法を勉強します。

<本文>

***このブログは、このブログの読者が、教科書(Unreal Engine 4 Scripting with C++)を読んでいる前提で書かれています。この教科書を読まないで、このブログを読んでも理解不可能であると考えられます。ご了承ください。***

<目的>

今回は、「8章13節 メニュー内の新しい項目の作成」を勉強します。このレシピでは、メニュー内に新しい項目を追加する方法を学習します。

教科書の説明では、

f:id:kazuhironagai77:20180325091603p:plain

のように、ウィンドウメニュー内に、新しい項目、Cookbookが追加されます。

<方法>

1.まず、モジュールクラスに、以下の新しい関数を作ります。

f:id:kazuhironagai77:20180325091641p:plain

2.以下のコードを、StartupModule関数から探します。

3.次のコードを、2のコードと交換します。

f:id:kazuhironagai77:20180325091853p:plain

4.コンパイルします。そして実行します。
5.上記のイメージのように、ウィンドウメニューからCookbookが追加されているか確認します。

<結果>

f:id:kazuhironagai77:20180325091954p:plain

何の問題もなく出来ました。

<考察>

前節のレシピで行ったように、コードを一つ一つ読んでいきます。

f:id:kazuhironagai77:20180325092104p:plain

ToolbarExtenderのメンバー関数が、AddToolBarExtensionからAddMenuExtensionに変更されています。ここで、AddMenuExtension のAPI を調べるべきですが、その前に、教科書のHow it works…を読んでみましょう。

f:id:kazuhironagai77:20180325092130p:plain

1.あなたは、ToolbarExtenderが、FToolbarExtenderやFMenuExtenderではなくFExtender型であることに気を留めるべきだ。
2.特定のサブクラスではなく一般的なFExtenderクラスを使うことで、このフレームワークは、メニューやツールバーに使うコマンド関数一式のマッピングを作る事を許す。
3.この方法では、違う型のために違うTCommandsクラスを持つ事は必要ない。

とりあえず、ここで一端切ります。ここでは、このフレームワークにおいて、特定のサブクラスではなく一般的なFExtenderクラスを使うフレームワークのメリットが述べられています。最も大きなメリットは、一々、違うクラスのために違うTCommandsクラスを作成する必要がなくなると書かれています。この教科書の主張に対して私は判断するほどの知識を持っていませんので、そのまま受け入れます。

f:id:kazuhironagai77:20180325092257p:plain

4.その結果、要求される変化は以下の通りです。

  1. AddToolBarExtension とAddMenuExtensionの呼び出しの交換
  2. FToolberExtensionDelegateからFMenuExensionへのバインドした関数の呼び出し。
  3. ExtenderをToolbar Extensibility Manager でなくMenu Extensibility Managerに加える。

ここで、やっと、AddMenuExtensionメンバー関数についての説明があります。ただし、ここでは、前節のレシピである、新しいツールバーボタンを作るとの違いについてのみ述べられています。これを、読んで思ったのですが、この場合、こういうものだと覚えてしまうしかないのかもしれません。UE4エディターを拡張するときは、このフレームワークに基づいて行います。新しいツールバーボタンを作るときは、このフレームワークのここを変えます。メニュー内の新しい項目を作るときは、このフレームワームのそこをこう変えます。という感じで。

ここで、少し遊んでみようと思います。前節のレシピで、行った方法で、UIExtensionPointを表示させます。

f:id:kazuhironagai77:20180325092432p:plain

以下のコードによれば、

f:id:kazuhironagai77:20180325092454p:plain

LevelEditorのBeforeに表示されるとなっています。実際の表示もそうです。ここで、beforeをafterに変えてみます。

f:id:kazuhironagai77:20180325092523p:plain

f:id:kazuhironagai77:20180325092535p:plain

見事に、最後の位置に移動しましたが、アイコンイメージが表示されていません。実は、前回、オリジナルなアイコンを表示されるために、ファイル内の"LevelEditor.ViewOptions", "LevelEditor.ViewOptions.Small"のイメージをいろいろといじってしまい、すこし挙動がおかしい時はあるのです。そのせいなのかどうか、今は不明ですが、今回はこの問題はスキップします。

最後に、新しく加えたメンバー関数を見てみましょう。

f:id:kazuhironagai77:20180325092604p:plain

少しおかしいですね。IconBruthがAddMenuEntryメンバー関数のどのパラメータにもありません。これでは、アイコンが表示されないのも納得です。比較のために、新しいツールバーボタンを作る場合のコードを以下に示します。

f:id:kazuhironagai77:20180325092637p:plain

IconBrushは、AddToolBarButtonメンバー関数内のパラメータ―にしっかり、パスされています。このAddToolBarButtonメンバー関数内のパラメータ―をそのまま、AddMenuEntry関数に使用してみましょう。

f:id:kazuhironagai77:20180325092728p:plain

IconBrushを、IconBruthとタイポしていて、エラーが表示されたのですが、そこは直しました。そして、ビルド、実行すると、

f:id:kazuhironagai77:20180325092753p:plain

アイコンはしっかり表示されました。LevelEditorのBeforeをafterに変更してみます。

f:id:kazuhironagai77:20180325092829p:plain

これもしっかり表示されています。さっきは、アイコンが表示されないのは、UE4エディターのファイルをいじったためだと考えたのでUE4を再インストールしなければいけないかと思ったのですが、大丈夫みたいですね。

<まとめ>

今回は、メニュー内に新しい項目を追加する方法を学習しました。基本のフレームワークは前節の新しいツールバーボタンを作ると同じです。細部が違いますが、以下に違いをまとめました。

f:id:kazuhironagai77:20180325092900p:plain

今回は、更に、教科書のコードを改良して、アイコンが表示されないバグを修正しました。

<おまけ>

まとめた後、気が付いたのですが、How it works…の4番とまとめの表が同じ事を言おうとしていたことに今、気が付きました。