using System; using Code.Infrastructure.Configs; using Code.Infrastructure.EventBus; using Code.Infrastructure.Generators; using Cysharp.Threading.Tasks; using UnityEngine.AddressableAssets; using UnityEngine.InputSystem; using UnityEngine.ResourceManagement.AsyncOperations; namespace Code.Infrastructure.Input { [Config("Configs/InputService")] public class InputService : IInputService { [ToConfig] public InputActionAsset inputActionAsset; private EventBus.EventBus _eventBus; public InputService(IConfigLocator configLocator, EventBus.EventBus eventBus) { _eventBus = eventBus; LoadConfigs(configLocator.TryGetConfigAssetReference()).Forget(); } private AsyncOperationHandle _configHandle; private async UniTaskVoid LoadConfigs(AssetReference configReference) { _configHandle = Addressables.LoadAssetAsync(configReference); await _configHandle.ToUniTask(); inputActionAsset = _configHandle.Result.inputActionAsset; // inputActionAsset.actionMaps[(int)ActionMappings.Debug].Enable(); // inputActionAsset.actionMaps[(int)ActionMappings.Gameplay].Enable(); _eventBus.RaiseEvent(h => h.InputServiceInitialized()); } public void EnableMap(ActionMappings actionMap) => inputActionAsset.actionMaps[(int)actionMap].Enable(); public void DisableMap(ActionMappings actionMap) => inputActionAsset.actionMaps[(int)actionMap].Disable(); public void BindActionPerformed(int mapId, int actionId, Action action) => inputActionAsset .actionMaps[mapId].actions[actionId].performed += action; public void BindActionCancelled(int mapId, int actionId, Action action) => inputActionAsset .actionMaps[mapId].actions[actionId].canceled += action; public void UnbindActionPerformed(int mapId, int actionId, Action action) => inputActionAsset .actionMaps[mapId].actions[actionId].performed -= action; public void UnbindActionCancelled(int mapId, int actionId, Action action) => inputActionAsset .actionMaps[mapId].actions[actionId].canceled -= action; } public interface IInputServiceInitializedHandle : IGlobalSubscriber { void InputServiceInitialized(); } }