From fd679f0af59eb73244c39cb69107faf93b9358b9 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Wed, 4 Oct 2023 23:11:38 +0200 Subject: [PATCH] Add automatic game settings apply when saving json file in Editor #1440 --- Source/Engine/Content/JsonAsset.cpp | 12 ++++++++++-- Source/Engine/Content/JsonAsset.h | 1 + 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Source/Engine/Content/JsonAsset.cpp b/Source/Engine/Content/JsonAsset.cpp index 1fbc2abed..b48ef02e5 100644 --- a/Source/Engine/Content/JsonAsset.cpp +++ b/Source/Engine/Content/JsonAsset.cpp @@ -12,6 +12,7 @@ #include "FlaxEngine.Gen.h" #include "Cache/AssetsCache.h" #include "Engine/Core/Log.h" +#include "Engine/Core/Config/Settings.h" #include "Engine/Serialization/JsonTools.h" #include "Engine/Serialization/JsonWriters.h" #include "Engine/Content/Factories/JsonAssetFactory.h" @@ -126,8 +127,7 @@ void FindIds(ISerializable::DeserializeStream& node, Array& output) } else if (node.IsString()) { - const auto length = node.GetStringLength(); - if (length == 32) + if (node.GetStringLength() == 32) { // Try parse as Guid in format `N` (32 hex chars) Guid id; @@ -362,6 +362,7 @@ void JsonAsset::unload(bool isReloading) #endif Scripting::ScriptsUnload.Unbind(this); DeleteInstance(); + _isAfterReload |= isReloading; JsonAssetBase::unload(isReloading); } @@ -408,6 +409,13 @@ bool JsonAsset::CreateInstance() } } + // Special case for Settings assets to flush them after edited and saved in Editor + if (typeHandle && typeHandle.IsSubclassOf(SettingsBase::TypeInitializer) && _isAfterReload) + { + _isAfterReload = false; + ((SettingsBase*)Instance)->Apply(); + } + return false; } diff --git a/Source/Engine/Content/JsonAsset.h b/Source/Engine/Content/JsonAsset.h index c53649d33..0b6e3ca86 100644 --- a/Source/Engine/Content/JsonAsset.h +++ b/Source/Engine/Content/JsonAsset.h @@ -118,6 +118,7 @@ API_CLASS(NoSpawn) class FLAXENGINE_API JsonAsset : public JsonAssetBase DECLARE_ASSET_HEADER(JsonAsset); private: ScriptingType::Dtor _dtor; + bool _isAfterReload = false; public: ///