using System; 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 int GetAxis(Axis axis, JoystickSide side, InteractMode interactMode = InteractMode.Discrete) { if (axis == Axis.Horizontal) return GetHorizontalAxis(side, interactMode); else if (axis == Axis.Vertical) return GetVerticalAxis(side, interactMode); else return 0; } private static int GetHorizontalAxis(JoystickSide side, InteractMode interactMode) { Func func = interactMode == InteractMode.Discrete ? GetButtonDown : GetButton; int dir = 0; if (side == JoystickSide.Both) { if (func(InSignal.left1) || func(InSignal.left2)) dir -= 1; if (func(InSignal.right1) || func(InSignal.right2)) dir += 1; return dir; } else { InSignal left = side switch { JoystickSide.Left => InSignal.left1, JoystickSide.Right => InSignal.left2, }; InSignal right = side switch { JoystickSide.Left => InSignal.right1, JoystickSide.Right => InSignal.right2, }; if (func(left)) dir -= 1; if (func(right)) dir += 1; return dir; } } private static int GetVerticalAxis(JoystickSide side, InteractMode interactMode) { Func func = interactMode == InteractMode.Discrete ? GetButtonDown : GetButton; int dir = 0; if (side == JoystickSide.Both) { if (func(InSignal.down1) || func(InSignal.down2)) dir -= 1; if (func(InSignal.up1) || func(InSignal.up2)) dir += 1; return dir; } else { InSignal downSignal = side switch { JoystickSide.Left => InSignal.down1, JoystickSide.Right => InSignal.down2, }; InSignal upSignal = side switch { JoystickSide.Left => InSignal.up1, JoystickSide.Right => InSignal.up2, }; if (func(downSignal)) dir -= 1; if (func(upSignal)) dir += 1; return dir; } } 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 GetButtonUp(InSignal button) => source.GetButtonUp(button); public static bool GetButton(int pinindex) => source.GetButton(pinindex); public static bool GetButtonDown(int pinindex) => source.GetButtonDown(pinindex); public static bool GetButtonUp(int pinindex) => source.GetButtonUp(pinindex); public static bool GetButtonAnyPlayer(PlayerAction button) => source.GetButtonAnyPlayer(button); public static bool GetButtonDownAnyPlayer(PlayerAction button) => source.GetButtonDownAnyPlayer(button); public static bool GetButtonUpAnyPlayer(PlayerAction button) => source.GetButtonUpAnyPlayer(button); public static bool GetButtonCurrentPlayer(PlayerAction button) => source.GetButtonCurrentPlayer(button); public static bool GetButtonDownCurrentPlayer(PlayerAction button) => source.GetButtonDownCurrentPlayer(button); public static bool GetButtonUpCurrentPlayer(PlayerAction button) => source.GetButtonUpCurrentPlayer(button); public static bool AnyButton() => source.AnyButton(); } public enum Axis { Horizontal, Vertical } public enum JoystickSide { Left, Right, Both } public enum InteractMode { Discrete, Continious }