150 lines
4.2 KiB
C#
150 lines
4.2 KiB
C#
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
|
||
} |