From 62b484fa4994601969f7e50ec69fcbd417fa739f Mon Sep 17 00:00:00 2001 From: Brajanowski Date: Wed, 18 Jun 2025 17:24:34 +0200 Subject: [PATCH] moved input controls to addressables --- Runtime/Engine/Code/Main/RR.cs | 44 +++++++++++++++---- .../Code/Services/Input/InputService.cs | 24 ++++++++-- .../core_assets/services/service_input.asset | 7 ++- 3 files changed, 61 insertions(+), 14 deletions(-) diff --git a/Runtime/Engine/Code/Main/RR.cs b/Runtime/Engine/Code/Main/RR.cs index 4f78800..7696a17 100755 --- a/Runtime/Engine/Code/Main/RR.cs +++ b/Runtime/Engine/Code/Main/RR.cs @@ -99,22 +99,48 @@ namespace RebootKit.Engine.Main { } // Assets API - static readonly List s_gameModesAssets = new List(); - static readonly List s_worldConfigsAssets = new List(); + static readonly List s_GameModesAssets = new List(); + static readonly List s_WorldConfigsAssets = new List(); - public static IReadOnlyList GameModesAssets => s_gameModesAssets; - public static IReadOnlyList WorldConfigsAssets => s_worldConfigsAssets; + public static IReadOnlyList GameModesAssets => s_GameModesAssets; + public static IReadOnlyList WorldConfigsAssets => s_WorldConfigsAssets; public static async UniTask InitializeAssetsAsync(CancellationToken cancellationToken) { - s_gameModesAssets.Clear(); - s_worldConfigsAssets.Clear(); + s_GameModesAssets.Clear(); + s_WorldConfigsAssets.Clear(); s_Logger.Info("Loading game assets"); - await Addressables.LoadAssetsAsync("game_mode", asset => { s_gameModesAssets.Add(asset); }).ToUniTask(cancellationToken: cancellationToken); - s_Logger.Info($"Loaded {s_gameModesAssets.Count} game modes"); + await Addressables.LoadAssetsAsync("game_mode", asset => { s_GameModesAssets.Add(asset); }).ToUniTask(cancellationToken: cancellationToken); + s_Logger.Info($"Loaded {s_GameModesAssets.Count} game modes"); - await Addressables.LoadAssetsAsync("world", asset => { s_worldConfigsAssets.Add(asset); }).ToUniTask(cancellationToken: cancellationToken); + await Addressables.LoadAssetsAsync("world", asset => { s_WorldConfigsAssets.Add(asset); }).ToUniTask(cancellationToken: cancellationToken); + } + + public static GameModeAsset GetGameMode(string name) { + if (string.IsNullOrEmpty(name)) { + throw new ArgumentException("Game mode name cannot be null or empty", nameof(name)); + } + + GameModeAsset gameMode = s_GameModesAssets.Find(asset => asset.name.Equals(name, StringComparison.Ordinal)); + if (!gameMode) { + throw new KeyNotFoundException($"Game mode '{name}' not found"); + } + + return gameMode; + } + + public static WorldConfigAsset GetWorldConfigAsset(string name) { + if (string.IsNullOrEmpty(name)) { + throw new ArgumentException("World config name cannot be null or empty", nameof(name)); + } + + WorldConfigAsset worldConfig = s_WorldConfigsAssets.Find(asset => asset.Config.name.Equals(name, StringComparison.Ordinal)); + if (!worldConfig) { + throw new KeyNotFoundException($"World config '{name}' not found"); + } + + return worldConfig; } // Game API diff --git a/Runtime/Engine/Code/Services/Input/InputService.cs b/Runtime/Engine/Code/Services/Input/InputService.cs index 4246423..37cd5a4 100755 --- a/Runtime/Engine/Code/Services/Input/InputService.cs +++ b/Runtime/Engine/Code/Services/Input/InputService.cs @@ -1,29 +1,45 @@ using System; using RebootKit.Engine.Foundation; using UnityEngine; +using UnityEngine.AddressableAssets; using UnityEngine.InputSystem; +using UnityEngine.ResourceManagement.AsyncOperations; namespace RebootKit.Engine.Services.Input { public class InputService : IService { readonly Config m_Config; + AsyncOperationHandle m_Handle; + InputActionAsset m_InputActionAsset; + public InputService(Config config) { m_Config = config; + + m_Handle = Addressables.LoadAssetAsync(m_Config.inputAssetReference); + m_InputActionAsset = m_Handle.WaitForCompletion(); } public void Dispose() { + m_InputActionAsset = null; + + Addressables.Release(m_Handle); + m_Handle = default; } public void EnableControls() { - m_Config.inputAsset.Enable(); + m_InputActionAsset.Enable(); } public void DisableControls() { - m_Config.inputAsset.Disable(); + m_InputActionAsset.Disable(); + } + + public bool AreControlsEnabled() { + return m_InputActionAsset.enabled; } public InputAction FindInputAction(string path) { - return m_Config.inputAsset.FindAction(path); + return m_InputActionAsset.FindAction(path); } public void LockCursor() { @@ -38,7 +54,7 @@ namespace RebootKit.Engine.Services.Input { [Serializable] public class Config { - public InputActionAsset inputAsset; + public AssetReferenceT inputAssetReference; } } } \ No newline at end of file diff --git a/Runtime/Engine/core_assets/services/service_input.asset b/Runtime/Engine/core_assets/services/service_input.asset index c87e5ec..0f2ee14 100755 --- a/Runtime/Engine/core_assets/services/service_input.asset +++ b/Runtime/Engine/core_assets/services/service_input.asset @@ -13,4 +13,9 @@ MonoBehaviour: m_Name: service_input m_EditorClassIdentifier: m_Config: - inputAsset: {fileID: -944628639613478452, guid: f991e9abd9a53ee4b94b329a5ce96cb2, type: 3} + inputAssetReference: + m_AssetGUID: f991e9abd9a53ee4b94b329a5ce96cb2 + m_SubObjectName: + m_SubObjectGUID: + m_SubObjectType: + m_EditorAssetChanged: 0