From df3e1bdfa56845e5a702e64c3b4a6e83dcb7e504 Mon Sep 17 00:00:00 2001 From: _Redstone_c_ <2824517378@qq.com> Date: Sat, 12 Dec 2020 20:30:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=BD=BD=E5=85=A5=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Source/AutoSave/Private/AutoSaveSubsystem.cpp | 22 ++++++++++++++----- .../Blueprint/AutoSaveBlueprintLibrary.cpp | 4 ++-- Source/AutoSave/Public/AutoSaveSubsystem.h | 8 ++++++- .../Blueprint/AutoSaveBlueprintLibrary.h | 2 +- 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/Source/AutoSave/Private/AutoSaveSubsystem.cpp b/Source/AutoSave/Private/AutoSaveSubsystem.cpp index 3cff9c8..1e55fab 100644 --- a/Source/AutoSave/Private/AutoSaveSubsystem.cpp +++ b/Source/AutoSave/Private/AutoSaveSubsystem.cpp @@ -28,7 +28,7 @@ void UAutoSaveSubsystem::GetSaveStructInfosWithoutData(TArray& } } -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: diff --git a/Source/AutoSave/Private/Blueprint/AutoSaveBlueprintLibrary.cpp b/Source/AutoSave/Private/Blueprint/AutoSaveBlueprintLibrary.cpp index 11e43f1..1069546 100644 --- a/Source/AutoSave/Private/Blueprint/AutoSaveBlueprintLibrary.cpp +++ b/Source/AutoSave/Private/Blueprint/AutoSaveBlueprintLibrary.cpp @@ -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) diff --git a/Source/AutoSave/Public/AutoSaveSubsystem.h b/Source/AutoSave/Public/AutoSaveSubsystem.h index df14414..b5e2de9 100644 --- a/Source/AutoSave/Public/AutoSaveSubsystem.h +++ b/Source/AutoSave/Public/AutoSaveSubsystem.h @@ -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 Data; // FSaveStruct* Data; + UPROPERTY() + FSaveStructLoadDelegates OnLoaded; + }; UCLASS(Config = Engine, DefaultConfig) @@ -65,7 +71,7 @@ public: UFUNCTION(BlueprintCallable, Category = "AutoSave") void GetSaveStructInfosWithoutData(TArray& 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); diff --git a/Source/AutoSave/Public/Blueprint/AutoSaveBlueprintLibrary.h b/Source/AutoSave/Public/Blueprint/AutoSaveBlueprintLibrary.h index db45c62..4c2bed8 100644 --- a/Source/AutoSave/Public/Blueprint/AutoSaveBlueprintLibrary.h +++ b/Source/AutoSave/Public/Blueprint/AutoSaveBlueprintLibrary.h @@ -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);