From d468023ffce2d505943937fc24cb800bf32210c7 Mon Sep 17 00:00:00 2001 From: Michael Delva Date: Tue, 4 Mar 2025 12:16:59 +0100 Subject: [PATCH] Conditional serialization for savables --- .../GameFramework/SaveGame/GBFSaveGame.cpp | 33 +++++++++++++------ .../GameFramework/SaveGame/GBFSaveGame.h | 1 + 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/Source/GameBaseFramework/Private/GameFramework/SaveGame/GBFSaveGame.cpp b/Source/GameBaseFramework/Private/GameFramework/SaveGame/GBFSaveGame.cpp index f995eab4..0707cdaa 100644 --- a/Source/GameBaseFramework/Private/GameFramework/SaveGame/GBFSaveGame.cpp +++ b/Source/GameBaseFramework/Private/GameFramework/SaveGame/GBFSaveGame.cpp @@ -1,15 +1,23 @@ #include "GameFramework/SaveGame/GBFSaveGame.h" -#include "GameFramework/SaveGame/GBFSaveGameSubsystem.h" - #include #include #include namespace { - void LoadSavable( FGBFSavableData & savable_data ) + void TryLoadSavable( FGBFSavableData & savable_data ) { + if ( savable_data.Savable == nullptr ) + { + return; + } + + if ( !savable_data.Savable->CanBeSerialized() ) + { + return; + } + FMemoryReader memory_reader( savable_data.Data ); FObjectAndNameAsStringProxyArchive archive( memory_reader, false ); archive.ArIsSaveGame = true; @@ -27,6 +35,11 @@ void IGBFSaveGameSystemSavableInterface::OnSaveGameReset() { } +bool IGBFSaveGameSystemSavableInterface::CanBeSerialized() const +{ + return true; +} + void UGBFSaveGame::HandlePreSave() { Super::HandlePreSave(); @@ -38,6 +51,11 @@ void UGBFSaveGame::HandlePreSave() continue; } + if ( !savable_data.Savable->CanBeSerialized() ) + { + continue; + } + FMemoryWriter memory_writer( savable_data.Data ); FObjectAndNameAsStringProxyArchive archive( memory_writer, false ); archive.ArIsSaveGame = true; @@ -52,12 +70,7 @@ void UGBFSaveGame::HandlePostLoad() for ( auto & savable_data : SavablesData ) { - if ( savable_data.Savable == nullptr ) - { - continue; - } - - LoadSavable( savable_data ); + TryLoadSavable( savable_data ); } } @@ -85,7 +98,7 @@ void UGBFSaveGame::RegisterSavable( TScriptInterface< IGBFSaveGameSystemSavableI } ) ) { savable_ptr->Savable = savable; - LoadSavable( *savable_ptr ); + TryLoadSavable( *savable_ptr ); } else { diff --git a/Source/GameBaseFramework/Public/GameFramework/SaveGame/GBFSaveGame.h b/Source/GameBaseFramework/Public/GameFramework/SaveGame/GBFSaveGame.h index beffaa0e..3bac5ea5 100644 --- a/Source/GameBaseFramework/Public/GameFramework/SaveGame/GBFSaveGame.h +++ b/Source/GameBaseFramework/Public/GameFramework/SaveGame/GBFSaveGame.h @@ -16,6 +16,7 @@ class GAMEBASEFRAMEWORK_API IGBFSaveGameSystemSavableInterface GENERATED_IINTERFACE_BODY() virtual void OnSaveGameReset(); + virtual bool CanBeSerialized() const; }; USTRUCT()