※ 2019/10/31追記:この記事は古くなっており、最新のバージョンでは動作しない可能性があります。
また前回からの続きです。
今回は、自分で実装したアセットをダブルクリックした際に、独自のエディタウィンドウを開く方法をご紹介します。
1.既存の動作を確認する
まずは、そのままMyAssetをダブルクリックしてみます。

こんな感じのウィンドウが開くと思います。
特に自前で何も実装していない場合は、デフォルトでこのウィンドウが開くようになっています。
このウィンドウは FSimpleAssetEditor というクラスで実装されており、エンジンコードを探すと中身を見つけることが出来ます。
2.アセットエディタクラスを実装する
まずは、自前のアセットエディタクラスを実装する必要があります。
これは、IToolkitHostを継承している必要があります。
通常、FAssetToolkit を継承して作ると楽が出来ます。FSimpleAssetEditor も FAssetToolkit を継承して作られています。
今回は、さらに楽をして FSimpleAssetEditor を継承してアセットエディタを作ってしまおうと思います。
下記のcppとhを追加します。
|
#include "CoreMinimal.h" #include "UnrealEd.h" #include "SimpleAssetEditor.h" /** * */ class BLOG_MYASSET_API FMyAssetEditor : public FSimpleAssetEditor { public: static TSharedRef CreateEditor( const EToolkitMode::Type Mode, const TSharedPtr< IToolkitHost >& InitToolkitHost, UObject* ObjectToEdit, FGetDetailsViewObjects GetDetailsViewObjects = FGetDetailsViewObjects() ); }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
#include "MyAssetEditor.h" #include "Blog_MyAsset.h" TSharedRef FMyAssetEditor::CreateEditor( const EToolkitMode::Type Mode, const TSharedPtr< IToolkitHost >& InitToolkitHost, UObject* ObjectToEdit, FGetDetailsViewObjects GetDetailsViewObjects ) { TSharedRef NewEditor(new FMyAssetEditor()); TArray<UObject*> ObjectsToEdit; ObjectsToEdit.Add(ObjectToEdit); NewEditor->InitEditor(Mode, InitToolkitHost, ObjectsToEdit, GetDetailsViewObjects); return NewEditor; } |
FSimpleAssetEditorと何も違いはありませんが、一応、自前のアセットエディタクラスが用意出来ました。
3.アセットエディタをAssetTypeActionsに登録する
次はこのアセットエディタを、UMyAssetクラスと紐付ける必要があります。
前回までに実装した、AssetTypeActions の OpenAssetEditor() という関数をオーバーライドすることで、対応したアセットのエディタを指定することが出来ます。
|
class BLOG_MYASSET_API FAssetTypeActions_MyAsset : public FAssetTypeActions_Base { //~中略~ virtual void OpenAssetEditor( const TArray<UObject*>& InObjects, TSharedPtr EditWithinLevelEditor = TSharedPtr() ) override; }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
#include "AssetTypeActions_MyAsset.h" #include "Blog_MyAsset.h" #include "MyAsset.h" #include "MyAssetEditor.h" //追加 //~中略~ void FAssetTypeActions_MyAsset::OpenAssetEditor( const TArray<UObject*>&InObjects, TSharedPtr EditWithinLevelEditor ) { for (int i = 0; i < InObjects.Num(); ++i) { FMyAssetEditor::CreateEditor( EToolkitMode::Standalone, EditWithinLevelEditor, InObjects[i]); } } |
これで、ContentBrowser上でMyAssetをダブルクリックした際に、FMyAssetEditorが開くようになりました。
このままでは、デフォルトの状態と全く違いはありませんが・・・
今回、アセットエディタの中身の実装までご紹介したかったのですが、話の本筋から逸れてしまうのと、Slateのコードは非常に長くなってしまうため、アセットエディタの話はここまでとさせて頂きます。
独自のアセットエディタの実装については、FSimpleAssetEditorがとても良いサンプルになりますので、まずはこのコードを解析してみることをオススメします。
Slate UI については、また別の機会にお話し出来ればと思います。
この記事を書いている時点ではまだ少ないですが、ヒストリアブログのSlate関連の記事はこちらから検索出来ます。
次回は、アセット実装の最終回、独自のシリアライズを実装して、UPROPERTY化出来ないメンバのセーブ/ロードに対応する方法をご紹介したいと思います。
[UE4] 独自のアセットを実装する方法(1) アセットクラスの実装
[UE4] 独自のアセットを実装する方法(2) インポートの実装
[UE4] 独自のアセットを実装する方法(3) 再インポートの実装
[UE4] 独自のアセットを実装する方法(4) アセットにアクションを追加する
[UE4] 独自のアセットを実装する方法(5) アセットエディタを実装する
[UE4] 独自のアセットを実装する方法(6) 独自のシリアライズを実装する