using System.Collections.Generic; using UnityEngine; public class In : MonoBehaviour { [Header("Выбор источника управления")] static InputSource source; public void Initialize() { #if UNITY_EDITOR source = new KeyboardInput(); #else source = new COMinput(); #endif var success = source.Initialize(); if (!success) Debug.LogWarning("Не удалось проинициалзировать источник управления."); } /// Возвращает горизонтальную и вертикальную оси выбранного джойстика. public static Vector2Int GetAxis(JoystickSide side, InteractMode interactMode = InteractMode.Discrete) { if (side == JoystickSide.Both) { int horizontal = ToAxis( IsActive(InSignal.left1, interactMode) || IsActive(InSignal.left2, interactMode), IsActive(InSignal.right1, interactMode) || IsActive(InSignal.right2, interactMode)); int vertical = ToAxis( IsActive(InSignal.down1, interactMode) || IsActive(InSignal.down2, interactMode), IsActive(InSignal.up1, interactMode) || IsActive(InSignal.up2, interactMode)); return new Vector2Int(horizontal, vertical); } bool isLeft = side == JoystickSide.Left; InSignal left = isLeft ? InSignal.left1 : InSignal.left2; InSignal right = isLeft ? InSignal.right1 : InSignal.right2; InSignal down = isLeft ? InSignal.down1 : InSignal.down2; InSignal up = isLeft ? InSignal.up1 : InSignal.up2; return new Vector2Int( ToAxis(IsActive(left, interactMode), IsActive(right, interactMode)), ToAxis(IsActive(down, interactMode), IsActive(up, interactMode))); } /// Возвращает состояние кнопки Action выбранного джойстика. public static bool GetAction(JoystickSide side, InteractMode interactMode = InteractMode.Discrete) { if (side == JoystickSide.Both) return IsActive(InSignal.action1, interactMode) || IsActive(InSignal.action2, interactMode); InSignal action = side == JoystickSide.Left ? InSignal.action1 : InSignal.action2; return IsActive(action, interactMode); } /// Возвращает текущее состояние сервисной кнопки без обработки Up/Down. public static bool GetService() => GetButton(InSignal.service); public static bool GetButton(InSignal button) => source.GetButton(button); public static bool GetButtonDown(InSignal button) => source.GetButtonDown(button); public static bool GetButtonDown(IEnumerable signals) { foreach (var signal in signals) if (GetButtonDown(signal)) return true; return false; } public static bool AnyButton() => source.AnyButton(); private static bool IsActive(InSignal signal, InteractMode interactMode) => interactMode == InteractMode.Discrete ? GetButtonDown(signal) : GetButton(signal); private static int ToAxis(bool negative, bool positive) => (positive ? 1 : 0) - (negative ? 1 : 0); } public enum Axis { Horizontal, Vertical } public enum JoystickSide { Left, Right, Both } public enum InteractMode { Discrete, Continious }