using System; using Code.Infrastructure.Configs; using Cysharp.Threading.Tasks; using UnityEngine.AddressableAssets; using UnityEngine.InputSystem; using UnityEngine.ResourceManagement.AsyncOperations; namespace Code.Infrastructure.Input { public interface IInputService { void EnableMap(ActionMappings actionMap); void DisableMap(ActionMappings actionMap); void BindActionPerformed(int mapId, int actionId, Action action); void BindActionCancelled(int mapId, int actionId, Action action); void UnbindActionPerformed(int mapId, int actionId, Action action); void UnbindActionCancelled(int mapId, int actionId, Action action); } public interface IInputServiceInitializer { UniTask LoadConfigs(); } public class InputService : IInputService, IInputServiceInitializer { private InputActionAsset _inputActionAsset; private AsyncOperationHandle _configHandle; private readonly AssetReference _configReference; public InputService(IConfigLocator configLocator) { _configReference = configLocator.TryGetConfigAssetReference(); } public async UniTask LoadConfigs() { _configHandle = Addressables.LoadAssetAsync(_configReference); await _configHandle.ToUniTask(); _inputActionAsset = _configHandle.Result.inputActionAsset; } 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; } }