添加载入完成回调

This commit is contained in:
_Redstone_c_ 2020-12-12 20:30:43 +08:00
parent 5c338c968b
commit df3e1bdfa5
4 changed files with 27 additions and 9 deletions

View File

@ -28,7 +28,7 @@ void UAutoSaveSubsystem::GetSaveStructInfosWithoutData(TArray<FSaveStructInfo>&
}
}
FSaveStruct * UAutoSaveSubsystem::AddSaveStructRef(const FString& Filename, UScriptStruct * ScriptStruct)
FSaveStruct * UAutoSaveSubsystem::AddSaveStructRef(const FString& Filename, UScriptStruct * ScriptStruct, FSaveStructLoadDelegate OnLoaded)
{
if (StructInfos.Contains(Filename))
{
@ -43,6 +43,15 @@ FSaveStruct * UAutoSaveSubsystem::AddSaveStructRef(const FString& Filename, UScr
// Increase the reference count of SaveStruct by one, and then decrease it accordingly in UAutoSaveSubsystem::RemoveSaveStructRef
StructInfo->RefConut++;
if (StructInfo->State == ESaveStructState::Preload || StructInfo->State == ESaveStructState::Loading)
{
StructInfo->OnLoaded.Add(OnLoaded);
}
else
{
OnLoaded.ExecuteIfBound(Filename);
}
return (FSaveStruct*)StructInfo->Data.GetData();
}
@ -60,12 +69,13 @@ FSaveStruct * UAutoSaveSubsystem::AddSaveStructRef(const FString& Filename, UScr
{
NewStructInfo->Filename = Filename;
NewStructInfo->Struct = ScriptStruct;
NewStructInfo->Data.SetNumUninitialized(ScriptStruct->GetStructureSize());
ScriptStruct->InitializeStruct(NewStructInfo->Data.GetData());
NewStructInfo->State = ESaveStructState::Preload;
NewStructInfo->RefConut = 1;
NewStructInfo->LastRefConut = 0;
NewStructInfo->LastSaveTime = FDateTime::Now();
NewStructInfo->Data.SetNumUninitialized(ScriptStruct->GetStructureSize());
ScriptStruct->InitializeStruct(NewStructInfo->Data.GetData());
NewStructInfo->OnLoaded.Add(OnLoaded);
}
else
{
@ -75,12 +85,13 @@ FSaveStruct * UAutoSaveSubsystem::AddSaveStructRef(const FString& Filename, UScr
NewStructInfo->Filename = Filename;
NewStructInfo->Struct = ScriptStruct;
NewStructInfo->Data.SetNumUninitialized(ScriptStruct->GetStructureSize());
ScriptStruct->InitializeStruct(NewStructInfo->Data.GetData());
NewStructInfo->State = ESaveStructState::Idle;
NewStructInfo->RefConut = 1;
NewStructInfo->LastRefConut = 0;
NewStructInfo->LastSaveTime = FDateTime::Now();
NewStructInfo->Data.SetNumUninitialized(ScriptStruct->GetStructureSize());
ScriptStruct->InitializeStruct(NewStructInfo->Data.GetData());
NewStructInfo->OnLoaded.Add(OnLoaded);
}
ScriptStructHooker.Add(Filename, ScriptStruct);
@ -140,6 +151,7 @@ UAutoSaveSubsystem::FStructLoadOrSaveTask::~FStructLoadOrSaveTask()
case ESaveStructState::Loading:
StructInfoPtr->State = ESaveStructState::Idle;
StructInfoPtr->Data = DataCopy;
StructInfoPtr->OnLoaded.Broadcast(StructInfoPtr->Filename);
break;
case ESaveStructState::Saving:

View File

@ -2,7 +2,7 @@
#include "Kismet/GameplayStatics.h"
bool UAutoSaveBlueprintLibrary::AddSaveStructRef(UObject * WorldContextObject, const FString & Filename, UScriptStruct * ScriptStruct)
bool UAutoSaveBlueprintLibrary::AddSaveStructRef(UObject * WorldContextObject, const FString & Filename, UScriptStruct * ScriptStruct, FSaveStructLoadDelegate OnLoaded)
{
UGameInstance* GameInstance = UGameplayStatics::GetGameInstance(WorldContextObject);
@ -12,7 +12,7 @@ bool UAutoSaveBlueprintLibrary::AddSaveStructRef(UObject * WorldContextObject, c
if (!AutoSaveSubsystem) return false;
return AutoSaveSubsystem->AddSaveStructRef(Filename, ScriptStruct) != nullptr;
return AutoSaveSubsystem->AddSaveStructRef(Filename, ScriptStruct, OnLoaded) != nullptr;
}
void UAutoSaveBlueprintLibrary::RemoveSaveStructRef(UObject * WorldContextObject, const FString & Filename)

View File

@ -7,6 +7,9 @@
USTRUCT(BlueprintType)
struct AUTOSAVE_API FSaveStruct { GENERATED_BODY() };
DECLARE_DYNAMIC_DELEGATE_OneParam(FSaveStructLoadDelegate, const FString&, Filename);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSaveStructLoadDelegates, const FString&, Filename);
UENUM(BlueprintType, Category = "AutoSave")
enum class ESaveStructState : uint8
{
@ -43,6 +46,9 @@ struct AUTOSAVE_API FSaveStructInfo
TArray<uint8> Data;
// FSaveStruct* Data;
UPROPERTY()
FSaveStructLoadDelegates OnLoaded;
};
UCLASS(Config = Engine, DefaultConfig)
@ -65,7 +71,7 @@ public:
UFUNCTION(BlueprintCallable, Category = "AutoSave")
void GetSaveStructInfosWithoutData(TArray<FSaveStructInfo>& OutSaveStructInfos) const;
FSaveStruct* AddSaveStructRef(const FString& Filename, UScriptStruct* ScriptStruct = nullptr);
FSaveStruct* AddSaveStructRef(const FString& Filename, UScriptStruct* ScriptStruct = nullptr, FSaveStructLoadDelegate OnLoaded = FSaveStructLoadDelegate());
void RemoveSaveStructRef(const FString& Filename);

View File

@ -14,7 +14,7 @@ class AUTOSAVE_API UAutoSaveBlueprintLibrary : public UBlueprintFunctionLibrary
public:
UFUNCTION(BlueprintCallable, Category = "AutoSave", meta = (WorldContext = "WorldContextObject"))
static bool AddSaveStructRef(UObject* WorldContextObject, const FString& Filename, UScriptStruct* ScriptStruct);
static bool AddSaveStructRef(UObject* WorldContextObject, const FString& Filename, UScriptStruct* ScriptStruct, FSaveStructLoadDelegate OnLoaded);
UFUNCTION(BlueprintCallable, Category = "AutoSave", meta = (WorldContext = "WorldContextObject"))
static void RemoveSaveStructRef(UObject* WorldContextObject, const FString& Filename);