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
}