添加载入完成回调
This commit is contained in:
parent
5c338c968b
commit
df3e1bdfa5
|
@ -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:
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue