101 lines
3.4 KiB
C#
101 lines
3.4 KiB
C#
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("Не удалось проинициалзировать источник управления.");
|
||
}
|
||
|
||
/// <summary>Возвращает горизонтальную и вертикальную оси выбранного джойстика.</summary>
|
||
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)));
|
||
}
|
||
|
||
/// <summary>Возвращает состояние кнопки Action выбранного джойстика.</summary>
|
||
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);
|
||
}
|
||
|
||
/// <summary>Возвращает текущее состояние сервисной кнопки без обработки Up/Down.</summary>
|
||
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<InSignal> 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
|
||
} |