// Copyright Epic Games, Inc. All Rights Reserved. #include "Factory/QuestAssetFactory.h" #include "ProjectFish/DataAsset/QuestAsset.h" #include "AssetRegistry/AssetRegistryModule.h" #include "AssetRegistry/AssetData.h" UQuestAssetFactory::UQuestAssetFactory() { SupportedClass = UQuestAsset::StaticClass(); bCreateNew = true; bEditAfterNew = true; } UObject* UQuestAssetFactory::FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn) { UQuestAsset* NewQuestAsset = NewObject(InParent, Class, Name, Flags | RF_Transactional); // 自动生成唯一的 QuestID if (NewQuestAsset) { NewQuestAsset->QuestID = GenerateUniqueQuestID(); } return NewQuestAsset; } int32 UQuestAssetFactory::GenerateUniqueQuestID() const { int32 MaxQuestID = 0; // 获取资产注册表模块 FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked("AssetRegistry"); IAssetRegistry& AssetRegistry = AssetRegistryModule.Get(); // 查找所有 QuestAsset 资产 TArray AssetDataList; AssetRegistry.GetAssetsByClass(UQuestAsset::StaticClass()->GetClassPathName(), AssetDataList, true); // 遍历所有已存在的任务资产,找到最大的 QuestID for (const FAssetData& AssetData : AssetDataList) { if (UQuestAsset* QuestAsset = Cast(AssetData.GetAsset())) { if (QuestAsset->QuestID > MaxQuestID) { MaxQuestID = QuestAsset->QuestID; } } } // 返回最大ID + 1,如果没有现有任务则从1开始 return MaxQuestID + 1; } bool UQuestAssetFactory::ShouldShowInNewMenu() const { return true; }