150 lines
4.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<InSignal, bool> 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<InSignal, bool> 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<InSignal> 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
}