63 lines
2.7 KiB
C#
63 lines
2.7 KiB
C#
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<InputAction.CallbackContext> action);
|
|
void BindActionCancelled(int mapId, int actionId, Action<InputAction.CallbackContext> action);
|
|
void UnbindActionPerformed(int mapId, int actionId, Action<InputAction.CallbackContext> action);
|
|
void UnbindActionCancelled(int mapId, int actionId, Action<InputAction.CallbackContext> action);
|
|
}
|
|
|
|
public interface IInputServiceInitializer
|
|
{
|
|
UniTask LoadConfigs();
|
|
}
|
|
|
|
public class InputService : IInputService, IInputServiceInitializer
|
|
{
|
|
private InputActionAsset _inputActionAsset;
|
|
|
|
private AsyncOperationHandle<InputServiceConfig> _configHandle;
|
|
private readonly AssetReference _configReference;
|
|
|
|
public InputService(IConfigLocator configLocator)
|
|
{
|
|
_configReference = configLocator.TryGetConfigAssetReference<InputServiceConfig>();
|
|
}
|
|
|
|
public async UniTask LoadConfigs()
|
|
{
|
|
_configHandle = Addressables.LoadAssetAsync<InputServiceConfig>(_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<InputAction.CallbackContext> action) => _inputActionAsset
|
|
.actionMaps[mapId].actions[actionId].performed += action;
|
|
|
|
public void BindActionCancelled(int mapId, int actionId, Action<InputAction.CallbackContext> action) => _inputActionAsset
|
|
.actionMaps[mapId].actions[actionId].canceled += action;
|
|
|
|
public void UnbindActionPerformed(int mapId, int actionId, Action<InputAction.CallbackContext> action) =>
|
|
_inputActionAsset
|
|
.actionMaps[mapId].actions[actionId].performed -= action;
|
|
|
|
public void UnbindActionCancelled(int mapId, int actionId, Action<InputAction.CallbackContext> action) =>
|
|
_inputActionAsset
|
|
.actionMaps[mapId].actions[actionId].canceled -= action;
|
|
}
|
|
} |