[UE4] 独自のアセットを実装する方法(1) アセットクラスの実装

01.16

[UE4] 独自のアセットを実装する方法(1) アセットクラスの実装 はコメントを受け付けていません。

cb

今回からの連続記事で、C++で独自のアセットを実装する方法をご紹介したいと思います。

自分のゲーム専用形式のデータを作りたい場合や、外部ツールで作成したデータを取り込みたい場合に、参考にしてみて下さい。

 

今回の記事のサンプルは、UE4.6.1環境で制作しています。

バージョンが違うと細部が異なる場合がありますので、ご注意下さい。

 

1.準備

まずは、プロジェクトの準備を行います。

今回は、”Blog_MyAsset”という名前でC++プロジェクトを作成します。

 

2.アセットクラスを実装する

アセットのクラスは、UObjectを継承して作成します。

下記のとおり、cppとhファイルを追加します。

MyAsset.h 
#pragma once
#include "MyAsset.generated.h"
 
UCLASS()
class UMyAsset : public UObject
{
    GENERATED_UCLASS_BODY()
 
public:
    UPROPERTY(EditAnywhere)
    int32 ValueA;
 
    UPROPERTY(EditAnywhere)
    int32 ValueB;
 
    UPROPERTY(EditAnywhere)
    int32 ValueC;
};
MyAsset.cpp
#include "Blog_MyAsset.h"
#include "MyAsset.h"
 
UMyAsset::UMyAsset(const FObjectInitializer& ObjectInitializer)
    : Super(ObjectInitializer)
{}
 

 見ての通り、アセットクラスそのものには、特別な実装は必要ありません。

ValueA, ValueB, ValueC は、サンプルとして動作確認するためのメンバです。UPROPERTYとして登録できる型であれば、なんでもOKです。

 

3.Factoryクラスを実装する

次に、アセットとして作成出来るように、Factoryクラスを作成します。

まずは、ContentBrowser上で新規作成を行えるようにしたいと思います。

下記のとおり、cppとhファイルを追加します。

MyAssetFactory.h
#pragma once
#include "Factories/Factory.h"
#include "MyAssetFactory.generated.h"
 
UCLASS()
class UMyAssetFactory : public UFactory
{
    GENERATED_UCLASS_BODY()
 
    virtual bool DoesSupportClass(UClass* Class) override;
    virtual UClass* ResolveSupportedClass() override;
    virtual UObject* FactoryCreateNew(
        UClass* InClass,
        UObject* InParent,
        FName InName,
        EObjectFlags Flags,
        UObject* Context,
        FFeedbackContext* Warn
        ) override;
};

 

MyAssetFactory.cpp
#include "Blog_MyAsset.h"
#include "MyAssetFactory.h"
#include "MyAsset.h"
 
UMyAssetFactory::UMyAssetFactory(const FObjectInitializer& ObjectInitializer)
    : Super(ObjectInitializer)
{
    SupportedClass = UMyAsset::StaticClass();
    bCreateNew = true;
}
bool UMyAssetFactory::DoesSupportClass(UClass* Class)
{
    return (Class == UMyAsset::StaticClass());
}
UClass* UMyAssetFactory::ResolveSupportedClass()
{
    return UMyAsset::StaticClass();
}
UObject* UMyAssetFactory::FactoryCreateNew(
    UClass* InClass,
    UObject* InParent,
    FName InName,
    EObjectFlags Flags,
    UObject* Context,
    FFeedbackContext* Warn
    )
{
    UMyAsset* NewMyAsset = 
        CastChecked<UMyAsset>(StaticConstructObject(InClass, InParent, InName, Flags));
    return NewMyAsset;
}

また、UFactoryクラスはUnrealEdモジュールに含まれるので、.Build.cs の PublicDependencyModuleNames に、”UnrealEd”を追加します。

Blog_MyAsset.Build.cs
// ↓に"UnrealEd"を追加
PublicDependencyModuleNames.AddRange(new string[] {
    "Core", "CoreUObject", "Engine", "InputCore", "UnrealEd"
    });

 

 

UFactoryクラスを継承したUMyAssetFactoryクラスで、いくつかの関数をオーバーライドして、先ほど実装したUMyAssetクラスの型情報を登録します。

コンストラクタで bCreateNew = true としておくことで、新規作成が可能になります。インポート専用にしたい場合などは、これをfalseに設定します。

 

今回は、簡単のために同一モジュール内に実装してしまいましたが、本来アセットクラスはランタイム,Factoryクラスはエディタ上のみで使用するクラスです。

しっかりと作る場合は、Factoryクラスはエディタ用の別モジュールに実装する方が好ましいです。

モジュールの分割についてはコチラの記事を参照して下さい。

 

4.エディタ上で確認する 

これで、一度結果を確認してみたいと思います。

プロジェクトをビルドしてエディタを起動し、ContentBrowserからアセットを作成してみます。

このように、先ほど実装したアセットが、ContentBrowerから作成可能になっています。

 

作成したアセットをダブルクリックすると、↓のようなデフォルトのエディタが起動します。

UPROPERTYとして定義した ValueA, ValueB, ValueC の3つのメンバがそれぞれ編集可能です。

アセットをSaveすれば、プロパティの値も保存されます。

 

今回はここまでです。

次回は、このアセットを外部ファイルからインポートする手順をご紹介したいと思います。

 

[UE4] 独自のアセットを実装する方法(1) アセットクラスの実装
[UE4] 独自のアセットを実装する方法(2) インポートの実装
[UE4] 独自のアセットを実装する方法(3) 再インポートの実装
[UE4] 独自のアセットを実装する方法(4) アセットにアクションを追加する
[UE4] 独自のアセットを実装する方法(5) アセットエディタを実装する
[UE4] 独自のアセットを実装する方法(6) 独自のシリアライズを実装する
  • このエントリーをはてなブックマークに追加

関連記事

コメントは利用できません。

カテゴリー

ページ上部へ戻る