From 94cacc8abcc34a1a9eb30efbccc0c1d08cf61253 Mon Sep 17 00:00:00 2001 From: Wojciech Figat Date: Tue, 6 Sep 2022 13:33:17 +0200 Subject: [PATCH] Add game settings assets loading (not only objects) --- Source/Engine/Core/Config/GameSettings.cs | 175 ++++++++++++++++++---- 1 file changed, 144 insertions(+), 31 deletions(-) diff --git a/Source/Engine/Core/Config/GameSettings.cs b/Source/Engine/Core/Config/GameSettings.cs index b2727c694..eeb1d76b6 100644 --- a/Source/Engine/Core/Config/GameSettings.cs +++ b/Source/Engine/Core/Config/GameSettings.cs @@ -199,38 +199,46 @@ namespace FlaxEditor.Content.Settings get { return StringUtils.CombinePaths(Globals.ProjectContentFolder, "GameSettings.json"); } } + /// + /// Loads the game settings asset. + /// + /// The loaded game settings asset. + public static JsonAsset LoadAsset() + { + return FlaxEngine.Content.Load(GameSettingsAssetPath); + } + /// /// Loads the game settings asset. /// /// The loaded game settings. public static GameSettings Load() { - var asset = FlaxEngine.Content.LoadAsync(GameSettingsAssetPath); - if (asset && !asset.WaitForLoaded()) - { - if (asset.Instance is GameSettings result) - return result; - } + var asset = LoadAsset(); + if (asset && asset.Instance is GameSettings result) + return result; return new GameSettings(); } - private static T LoadAsset(JsonAsset asset) where T : new() + private static T Load(JsonAsset asset) where T : new() { if (asset && !asset.WaitForLoaded()) { if (asset.Instance is T result) return result; } + return new T(); } - private static SettingsBase LoadAsset(JsonAsset asset, string typename) + private static SettingsBase Load(JsonAsset asset, string typename) { if (asset && !asset.WaitForLoaded() && asset.DataTypeName == typename) { if (asset.Instance is SettingsBase result) return result; } + return null; } @@ -249,71 +257,70 @@ namespace FlaxEditor.Content.Settings { var gameSettings = Load(); var type = typeof(T); - if (type == typeof(GameSettings)) return gameSettings as T; if (type == typeof(TimeSettings)) - return LoadAsset(gameSettings.Time) as T; + return Load(gameSettings.Time) as T; if (type == typeof(LayersAndTagsSettings)) - return LoadAsset(gameSettings.LayersAndTags) as T; + return Load(gameSettings.LayersAndTags) as T; if (type == typeof(PhysicsSettings)) - return LoadAsset(gameSettings.Physics) as T; + return Load(gameSettings.Physics) as T; if (type == typeof(GraphicsSettings)) - return LoadAsset(gameSettings.Graphics) as T; + return Load(gameSettings.Graphics) as T; if (type == typeof(NetworkSettings)) - return LoadAsset(gameSettings.Network) as T; + return Load(gameSettings.Network) as T; if (type == typeof(NavigationSettings)) - return LoadAsset(gameSettings.Navigation) as T; + return Load(gameSettings.Navigation) as T; if (type == typeof(LocalizationSettings)) - return LoadAsset(gameSettings.Localization) as T; + return Load(gameSettings.Localization) as T; if (type == typeof(BuildSettings)) - return LoadAsset(gameSettings.GameCooking) as T; + return Load(gameSettings.GameCooking) as T; if (type == typeof(StreamingSettings)) - return LoadAsset(gameSettings.Streaming) as T; + return Load(gameSettings.Streaming) as T; if (type == typeof(InputSettings)) - return LoadAsset(gameSettings.Input) as T; + return Load(gameSettings.Input) as T; if (type == typeof(AudioSettings)) - return LoadAsset(gameSettings.Audio) as T; + return Load(gameSettings.Audio) as T; #if FLAX_EDITOR || PLATFORM_WINDOWS if (type == typeof(WindowsPlatformSettings)) - return LoadAsset(gameSettings.WindowsPlatform) as T; + return Load(gameSettings.WindowsPlatform) as T; #endif -#if FLAX_EDITOR || PLATFORM_UWP +#if FLAX_EDITOR || PLATFORM_UWP if (type == typeof(UWPPlatformSettings)) - return LoadAsset(gameSettings.UWPPlatform) as T; + return Load(gameSettings.UWPPlatform) as T; #endif #if FLAX_EDITOR || PLATFORM_LINUX if (type == typeof(LinuxPlatformSettings)) - return LoadAsset(gameSettings.LinuxPlatform) as T; + return Load(gameSettings.LinuxPlatform) as T; #endif #if FLAX_EDITOR || PLATFORM_PS4 if (type.FullName == PS4PlatformSettingsTypename) - return LoadAsset(gameSettings.PS4Platform, PS4PlatformSettingsTypename) as T; + return Load(gameSettings.PS4Platform, PS4PlatformSettingsTypename) as T; #endif #if FLAX_EDITOR || PLATFORM_XBOX_ONE if (type.FullName == XboxOnePlatformSettingsTypename) - return LoadAsset(gameSettings.XboxOnePlatform, XboxOnePlatformSettingsTypename) as T; + return Load(gameSettings.XboxOnePlatform, XboxOnePlatformSettingsTypename) as T; #endif #if FLAX_EDITOR || PLATFORM_XBOX_SCARLETT if (type.FullName == XboxScarlettPlatformSettingsTypename) - return LoadAsset(gameSettings.XboxScarlettPlatform, XboxScarlettPlatformSettingsTypename) as T; + return Load(gameSettings.XboxScarlettPlatform, XboxScarlettPlatformSettingsTypename) as T; #endif #if FLAX_EDITOR || PLATFORM_ANDROID if (type == typeof(AndroidPlatformSettings)) - return LoadAsset(gameSettings.AndroidPlatform) as T; + return Load(gameSettings.AndroidPlatform) as T; #endif #if FLAX_EDITOR || PLATFORM_SWITCH if (type.FullName == SwitchPlatformSettingsTypename) - return LoadAsset(gameSettings.SwitchPlatform, SwitchPlatformSettingsTypename) as T; + return Load(gameSettings.SwitchPlatform, SwitchPlatformSettingsTypename) as T; #endif #if FLAX_EDITOR || PLATFORM_PS5 if (type.FullName == PS5PlatformSettingsTypename) - return LoadAsset(gameSettings.PS5Platform, PS5PlatformSettingsTypename) as T; + return Load(gameSettings.PS5Platform, PS5PlatformSettingsTypename) as T; #endif #if FLAX_EDITOR || PLATFORM_MAC if (type == typeof(MacPlatformSettings)) - return LoadAsset(gameSettings.MacPlatform) as T; + return Load(gameSettings.MacPlatform) as T; #endif if (gameSettings.CustomSettings != null) @@ -332,6 +339,112 @@ namespace FlaxEditor.Content.Settings return null; } + /// + /// Loads the settings asset of the given type. + /// + /// + /// Supports loading game settings, any sub settings container (e.g. ) and custom settings (see ). + /// + /// The game settings type (e.g. ). + /// Loaded settings asset or null if fails. + public static JsonAsset LoadAsset(Type type) + { + var gameSettingsAsset = LoadAsset(); + if (type == typeof(GameSettings)) + return gameSettingsAsset; + var gameSettings = (GameSettings)gameSettingsAsset.Instance; + + if (type == typeof(TimeSettings)) + return gameSettings.Time; + if (type == typeof(LayersAndTagsSettings)) + return gameSettings.LayersAndTags; + if (type == typeof(PhysicsSettings)) + return gameSettings.Physics; + if (type == typeof(GraphicsSettings)) + return gameSettings.Graphics; + if (type == typeof(NetworkSettings)) + return gameSettings.Network; + if (type == typeof(NavigationSettings)) + return gameSettings.Navigation; + if (type == typeof(LocalizationSettings)) + return gameSettings.Localization; + if (type == typeof(BuildSettings)) + return gameSettings.GameCooking; + if (type == typeof(StreamingSettings)) + return gameSettings.Streaming; + if (type == typeof(InputSettings)) + return gameSettings.Input; + if (type == typeof(AudioSettings)) + return gameSettings.Audio; +#if FLAX_EDITOR || PLATFORM_WINDOWS + if (type == typeof(WindowsPlatformSettings)) + return gameSettings.WindowsPlatform; +#endif +#if FLAX_EDITOR || PLATFORM_UWP + if (type == typeof(UWPPlatformSettings)) + return gameSettings.UWPPlatform; +#endif +#if FLAX_EDITOR || PLATFORM_LINUX + if (type == typeof(LinuxPlatformSettings)) + return gameSettings.LinuxPlatform; +#endif +#if FLAX_EDITOR || PLATFORM_PS4 + if (type.FullName == PS4PlatformSettingsTypename) + return gameSettings.PS4Platform; +#endif +#if FLAX_EDITOR || PLATFORM_XBOX_ONE + if (type.FullName == XboxOnePlatformSettingsTypename) + return gameSettings.XboxOnePlatform; +#endif +#if FLAX_EDITOR || PLATFORM_XBOX_SCARLETT + if (type.FullName == XboxScarlettPlatformSettingsTypename) + return gameSettings.XboxScarlettPlatform; +#endif +#if FLAX_EDITOR || PLATFORM_ANDROID + if (type == typeof(AndroidPlatformSettings)) + return gameSettings.AndroidPlatform; +#endif +#if FLAX_EDITOR || PLATFORM_SWITCH + if (type.FullName == SwitchPlatformSettingsTypename) + return gameSettings.SwitchPlatform; +#endif +#if FLAX_EDITOR || PLATFORM_PS5 + if (type.FullName == PS5PlatformSettingsTypename) + return gameSettings.PS5Platform; +#endif +#if FLAX_EDITOR || PLATFORM_MAC + if (type == typeof(MacPlatformSettings)) + return gameSettings.MacPlatform; +#endif + + if (gameSettings.CustomSettings != null) + { + foreach (var e in gameSettings.CustomSettings) + { + if (e.Value && !e.Value.WaitForLoaded() && e.Value.DataTypeName == type.FullName) + return e.Value; + } + } + + return null; + } + + /// + /// Loads the settings asset of the given type. + /// + /// + /// Supports loading game settings, any sub settings container (e.g. ) and custom settings (see ). + /// + /// + /// var timeAsset = GameSettings.Load&ltTimeSettings>(); + /// + /// The game settings type (e.g. ). + /// Loaded settings asset or null if fails. + public static JsonAsset LoadAsset() where T : SettingsBase + { + return LoadAsset(typeof(T)); + } + #if FLAX_EDITOR private static bool SaveAsset(GameSettings gameSettings, ref JsonAsset asset, T obj) where T : SettingsBase {