関連ブログ
- [UE4][UE5]開発環境の容量を少しでも減らす 2024.08.14UE
- [UE5] PushModel型のReplicationを使い、ネットワーク最適化を図る 2024.05.29UE
- [UE5]マテリアルでメッシュをスケールする方法 2024.01.17UE
CATEGORY
2015.01.27UE4UE/ C++
※ 2019/10/31追記:この記事は古くなっており、最新のバージョンでは動作しない可能性があります。
前回の記事で、アセットの再インポートに対応出来ました。
その際に作成したAssetTypeActionsクラスを使用することで、再インポート以外にも独自のアクションを追加することが出来ます。
オフィシャルの機能では、例えば、Materialの「Create Material Instance」や、Paper2Dプラグインで実装されているTextureの「Create Sprite」「Configure For Retro Sprites」などがあります。
今回は、このようなアセットに対するアクションの実装方法をご紹介します。
今回は、MyAssetを右クリックしたメニューに「Zero Reset」という項目を追加し、その項目が選択されると、ValueA,ValueB,ValueCが全てゼロで上書きされる、というアクションを作ってみます。
まずはソースコードです。
1 2 3 4 |
// ↓に"Slate"を追加 PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "UnrealEd", "AssetTools", "Slate" }); |
1 2 3 4 5 6 7 8 |
class FAssetTypeActions_MyAsset : public FAssetTypeActions_Base { public: //~中略~ virtual bool HasActions(const TArray<UObject*>& InObjects) const override { return true; } virtual void GetActions(const TArray<UObject*>& InObjects, FMenuBuilder& MenuBuilder) override; void ExecuteZeroReset(TArray<TWeakObjectPtr> Objects); }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
void FAssetTypeActions_MyAsset::GetActions( const TArray& lt; UObject*& gt; & InObjects, FMenuBuilder& amp; MenuBuilder) { auto MyAssetImports = GetTypedWeakObjectPtrs(InObjects); MenuBuilder.AddMenuEntry( LOCTEXT("MyAsset_ZeroReset", "Zero Reset"), LOCTEXT("MyAsset_ZeroResetTooltip", "zero reset this MyAsset"), FSlateIcon(), FUIAction( FExecuteAction::CreateSP( this, & FAssetTypeActions_MyAsset::ExecuteZeroReset, MyAssetImports), FCanExecuteAction() ) ); } void FAssetTypeActions_MyAsset::ExecuteZeroReset(TArray& lt; TWeakObjectPtr& gt; Objects) { for (auto ObjIt = Objects.CreateIterator(); ObjIt; ++ObjIt) { auto Object = (*ObjIt).Get(); if (Object) { Object - > ValueA = Object - > ValueB = Object - > ValueC = 0; Object - > MarkPackageDirty(); } } } |
まず、今回はエディタのGUIへの要素追加がありますので、参照モジュールに”Slate”を追加します。
続いて、前回実装した FAssetTypeActions_MyAssetクラスに、関数を3つ追加します。
HasActions()とGetActions()はFAssetTypeActions_Baseからのオーバーライドで、独自のアクションを追加登録するために記述します。
ExecuteZeroReset()は、メニュー項目が選択された時に呼び出される関数で、ココでアセットの編集を実行します。
GetActions()で、メニュー項目の登録を行います。
引数で受け取ったMenuBuilderに対して、要素を追加します。
注目すべきは MenuBuilder.AddMenuEntry() の第4引数で、ココでExecuteZeroReset()関数が呼び出されるようなDelegateを作成し、メニュー項目に登録しています。
ExecuteZeroReset()では、実際のリセットを行います。
アセットが複数選択されていた場合に対応するため、オブジェクトへの参照はTArrayで渡されます。
値を書き換えた後、MakePackageDirty()で、編集済み状態にしています。これを呼び出しておくことで、ContentBrowser上で「*」マークが付き、セーブが必要な状態であるとシステムに知らせることが出来ます。
実装は以上です。実際にビルドして実行してみましょう。
このように、アセットの右クリックメニューの先頭に「Zero Reset」という項目が追加されました。
実行すると、中身のメンバがゼロになり、アセットが編集済み状態になるのが確認出来ると思います。
今回はサンプルということで、非常に簡単なアクションを追加しました。
このように、選択されたアセットを編集するような機能も実装出来ますし、「Create Material Instance」のように選択されたアセットを基に別のアセットを作るようなアクションも実装可能です。
Paper2Dプラグインのように、既存のアセットに対してプラグイン独自のアクションを追加することも可能です。
開発効率向上のためのエディタ拡張の一環として、選択肢に加えて頂ければと思います。
次回はさらなるエディタ拡張です。
アセットをダブルクリックした際に開かれるアセットエディタウィンドウを、自前で実装するための方法をご紹介したいと思います。
[UE4] 独自のアセットを実装する方法(1) アセットクラスの実装
[UE4] 独自のアセットを実装する方法(2) インポートの実装
[UE4] 独自のアセットを実装する方法(3) 再インポートの実装
[UE4] 独自のアセットを実装する方法(4) アセットにアクションを追加する
[UE4] 独自のアセットを実装する方法(5) アセットエディタを実装する
[UE4] 独自のアセットを実装する方法(6) 独自のシリアライズを実装する