Editor toling to easier create data assets

This commit is contained in:
2026-10-05 10:59:45 +02:00
parent b3f4eefe06
commit f2acd7eb4c
8 changed files with 1043 additions and 0 deletions

View File

@@ -0,0 +1,231 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "EleriDataAssetFactories.h"
#include "EleriAssetCategory.h"
#include "Engine/DataAsset.h"
#include "ProjectEleri/Ai/NpcScheduleAsset.h"
#include "ProjectEleri/Animation/AnimationDataAsset.h"
#include "ProjectEleri/Data/BazarSettingsDataAsset.h"
#include "ProjectEleri/Data/FaceExpressionDataAsset.h"
#include "ProjectEleri/Data/Minigames/PotionSortDataAsset.h"
#include "ProjectEleri/Data/NpcDataAsset.h"
#include "ProjectEleri/Data/WeatherPresetDataAsset.h"
#include "ProjectEleri/DialogueSystem/QuestDatabase.h"
#include "ProjectEleri/DialogueSystem/SpeechDataAsset.h"
#include "ProjectEleri/GameEventSystem/GameEventDataAsset.h"
#include "ProjectEleri/Items/DataAssets/ItemDataAsset.h"
#include "ProjectEleri/Items/ItemContainer.h"
#include "ProjectEleri/QuestSystem/QuestDataAsset.h"
#define LOCTEXT_NAMESPACE "EleriDataAssetFactories"
/*-----------------------------------------------------------------------------
Shared behaviour
-----------------------------------------------------------------------------*/
UEleriDataAssetFactory::UEleriDataAssetFactory(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
// What these make is always a data asset, and the class is the only thing that separates one from
// the next, so that is all a subclass has to set. bCreateNew is what admits a factory to the Add
// menu, and bEditAfterNew is what opens the asset once it exists, which for a data asset means the
// details panel a fresh one has to be filled in through.
bCreateNew = true;
bEditAfterNew = true;
bEditorImport = false;
}
bool UEleriDataAssetFactory::ConfigureProperties()
{
// Nothing to ask about. Each factory makes the one class it is named after, so the class picker the
// engine would otherwise open here would be a dialog with a single entry in it.
return true;
}
uint32 UEleriDataAssetFactory::GetMenuCategories() const
{
return EleriAssetCategory::GetLegacyCategoryBit();
}
UObject* UEleriDataAssetFactory::FactoryCreateNew(UClass* InClass, UObject* InParent, FName InName, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn)
{
// SupportedClass rather than InClass: the Content Browser runs whichever factory it was asked to,
// and going through this factory's own member keeps the two from ever disagreeing.
UClass* ClassToCreate = SupportedClass.Get();
if (!ensureMsgf(ClassToCreate, TEXT("%s has no supported class, so there is nothing to create"), *GetName()))
{
return nullptr;
}
return NewObject<UDataAsset>(InParent, ClassToCreate, InName, Flags | RF_Transactional);
}
/*-----------------------------------------------------------------------------
Items
-----------------------------------------------------------------------------*/
UEleriItemDataAssetFactory::UEleriItemDataAssetFactory(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
SupportedClass = UItemDataAsset::StaticClass();
}
FText UEleriItemDataAssetFactory::GetDisplayName() const
{
return LOCTEXT("ItemFactoryName", "Item");
}
UEleriItemContainerFactory::UEleriItemContainerFactory(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
SupportedClass = UItemContainer::StaticClass();
}
FText UEleriItemContainerFactory::GetDisplayName() const
{
return LOCTEXT("ItemContainerFactoryName", "Item Container");
}
/*-----------------------------------------------------------------------------
Quests and dialogue
-----------------------------------------------------------------------------*/
UEleriQuestDataAssetFactory::UEleriQuestDataAssetFactory(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
SupportedClass = UQuestDataAsset::StaticClass();
}
FText UEleriQuestDataAssetFactory::GetDisplayName() const
{
return LOCTEXT("QuestFactoryName", "Quest");
}
UEleriQuestDatabaseFactory::UEleriQuestDatabaseFactory(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
SupportedClass = UQuestDatabase::StaticClass();
}
FText UEleriQuestDatabaseFactory::GetDisplayName() const
{
return LOCTEXT("QuestDatabaseFactoryName", "Quest Database");
}
UEleriSpeechDataAssetFactory::UEleriSpeechDataAssetFactory(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
SupportedClass = USpeechDataAsset::StaticClass();
}
FText UEleriSpeechDataAssetFactory::GetDisplayName() const
{
return LOCTEXT("SpeechFactoryName", "Speech");
}
/*-----------------------------------------------------------------------------
World events and weather
-----------------------------------------------------------------------------*/
UEleriGameEventDataAssetFactory::UEleriGameEventDataAssetFactory(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
SupportedClass = UGameEventDataAsset::StaticClass();
}
FText UEleriGameEventDataAssetFactory::GetDisplayName() const
{
return LOCTEXT("GameEventFactoryName", "Game Event");
}
UEleriWeatherPresetDataAssetFactory::UEleriWeatherPresetDataAssetFactory(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
SupportedClass = UWeatherPresetDataAsset::StaticClass();
}
FText UEleriWeatherPresetDataAssetFactory::GetDisplayName() const
{
return LOCTEXT("WeatherPresetFactoryName", "Weather Preset");
}
/*-----------------------------------------------------------------------------
Characters
-----------------------------------------------------------------------------*/
UEleriFaceExpressionDataAssetFactory::UEleriFaceExpressionDataAssetFactory(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
SupportedClass = UFaceExpressionDataAsset::StaticClass();
}
FText UEleriFaceExpressionDataAssetFactory::GetDisplayName() const
{
return LOCTEXT("FaceExpressionFactoryName", "Face Expression");
}
UEleriNpcDataAssetFactory::UEleriNpcDataAssetFactory(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
SupportedClass = UNpcDataAsset::StaticClass();
}
FText UEleriNpcDataAssetFactory::GetDisplayName() const
{
return LOCTEXT("NpcFactoryName", "NPC");
}
UEleriNpcScheduleAssetFactory::UEleriNpcScheduleAssetFactory(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
SupportedClass = UNpcScheduleAsset::StaticClass();
}
FText UEleriNpcScheduleAssetFactory::GetDisplayName() const
{
return LOCTEXT("NpcScheduleFactoryName", "NPC Schedule");
}
/*-----------------------------------------------------------------------------
Settings, animation and minigames
-----------------------------------------------------------------------------*/
UEleriBazarSettingsDataAssetFactory::UEleriBazarSettingsDataAssetFactory(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
SupportedClass = UBazarSettingsDataAsset::StaticClass();
}
FText UEleriBazarSettingsDataAssetFactory::GetDisplayName() const
{
return LOCTEXT("BazarSettingsFactoryName", "Bazar Settings");
}
UEleriAnimationDataAssetFactory::UEleriAnimationDataAssetFactory(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
SupportedClass = UAnimationDataAsset::StaticClass();
}
FText UEleriAnimationDataAssetFactory::GetDisplayName() const
{
return LOCTEXT("AnimationFactoryName", "Animation");
}
UEleriPotionSortDataAssetFactory::UEleriPotionSortDataAssetFactory(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
// The concrete minigame rather than the base class the definition sits on: the base exists to be
// inherited from, so offering to make a bare one would only ever produce an asset with nothing in it.
SupportedClass = UPotionSortDataAsset::StaticClass();
}
FText UEleriPotionSortDataAssetFactory::GetDisplayName() const
{
return LOCTEXT("PotionSortFactoryName", "Potion Sort Minigame");
}
#undef LOCTEXT_NAMESPACE