122 lines
5.0 KiB
C#
122 lines
5.0 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using UnityEngine;
|
||
|
||
namespace AxiInputSP.UGUI
|
||
{
|
||
public class AxiIptJoystick : IDisposable
|
||
{
|
||
enum AxiIptJoystickState
|
||
{
|
||
None,
|
||
KeyUp,
|
||
KeyDown,
|
||
KeyHold
|
||
}
|
||
static long LastCheckFrame = -1;
|
||
static Func<Vector2Int> RawJoy;
|
||
AxiInputUGUIHandle[] handles = new AxiInputUGUIHandle[4];
|
||
static Dictionary<AxiInputUGuiBtnType, AxiIptJoystickState> mAxis2State = new Dictionary<AxiInputUGuiBtnType, AxiIptJoystickState>();
|
||
|
||
public AxiIptJoystick(Func<Vector2Int> getRawJoy)
|
||
{
|
||
RawJoy = getRawJoy;
|
||
handles[0] = new AxiInputUGUIHandle(AxiInputUGuiBtnType.UP);
|
||
handles[0].GetKeyHandle = (() => { return GetKey(AxiInputUGuiBtnType.UP); });
|
||
handles[0].GetKeyUpHandle = (() => { return GetKeyUp(AxiInputUGuiBtnType.UP); });
|
||
handles[0].GetKeyDownHandle = (() => { return GetKeyDown(AxiInputUGuiBtnType.UP); });
|
||
mAxis2State[AxiInputUGuiBtnType.UP] = AxiIptJoystickState.None;
|
||
|
||
handles[1] = new AxiInputUGUIHandle(AxiInputUGuiBtnType.DOWN);
|
||
handles[1].GetKeyHandle = (() => { return GetKey(AxiInputUGuiBtnType.DOWN); });
|
||
handles[1].GetKeyUpHandle = (() => { return GetKeyUp(AxiInputUGuiBtnType.DOWN); });
|
||
handles[1].GetKeyDownHandle = (() => { return GetKeyDown(AxiInputUGuiBtnType.DOWN); });
|
||
mAxis2State[AxiInputUGuiBtnType.DOWN] = AxiIptJoystickState.None;
|
||
|
||
handles[2] = new AxiInputUGUIHandle(AxiInputUGuiBtnType.LEFT);
|
||
handles[2].GetKeyHandle = (() => { return GetKey(AxiInputUGuiBtnType.LEFT); });
|
||
handles[2].GetKeyUpHandle = (() => { return GetKeyUp(AxiInputUGuiBtnType.LEFT); });
|
||
handles[2].GetKeyDownHandle = (() => { return GetKeyDown(AxiInputUGuiBtnType.LEFT); });
|
||
mAxis2State[AxiInputUGuiBtnType.LEFT] = AxiIptJoystickState.None;
|
||
|
||
handles[3] = new AxiInputUGUIHandle(AxiInputUGuiBtnType.RIGHT);
|
||
handles[3].GetKeyHandle = (() => { return GetKey(AxiInputUGuiBtnType.RIGHT); });
|
||
handles[3].GetKeyUpHandle = (() => { return GetKeyUp(AxiInputUGuiBtnType.RIGHT); });
|
||
handles[3].GetKeyDownHandle = (() => { return GetKeyDown(AxiInputUGuiBtnType.RIGHT); });
|
||
mAxis2State[AxiInputUGuiBtnType.RIGHT] = AxiIptJoystickState.None;
|
||
}
|
||
|
||
|
||
public void Dispose()
|
||
{
|
||
for (int i = 0; i < handles.Length; i++)
|
||
{
|
||
handles[i].Dispose();
|
||
handles[i] = null;
|
||
}
|
||
mAxis2State.Clear();
|
||
}
|
||
|
||
public static void UpdateState()
|
||
{
|
||
if (LastCheckFrame == Time.frameCount)
|
||
return;
|
||
LastCheckFrame = Time.frameCount;
|
||
RecheckSingleState(AxiInputUGuiBtnType.RIGHT);
|
||
RecheckSingleState(AxiInputUGuiBtnType.LEFT);
|
||
RecheckSingleState(AxiInputUGuiBtnType.UP);
|
||
RecheckSingleState(AxiInputUGuiBtnType.DOWN);
|
||
}
|
||
|
||
static void RecheckSingleState(AxiInputUGuiBtnType axisType)
|
||
{
|
||
bool bKey = false;
|
||
|
||
Vector2Int inputV2 = RawJoy.Invoke();
|
||
|
||
switch (axisType)
|
||
{
|
||
case AxiInputUGuiBtnType.RIGHT: bKey = inputV2.x > 0; break;
|
||
case AxiInputUGuiBtnType.LEFT: bKey = inputV2.x < 0; break;
|
||
case AxiInputUGuiBtnType.UP: bKey = inputV2.y > 0; break;
|
||
case AxiInputUGuiBtnType.DOWN: bKey = inputV2.y < 0; break;
|
||
}
|
||
//按下
|
||
if (bKey)
|
||
{
|
||
//如果之前帧是KeyUp或None,则为KeyDown|KeyHold
|
||
if (mAxis2State[axisType] <= AxiIptJoystickState.KeyUp)
|
||
mAxis2State[axisType] = AxiIptJoystickState.KeyDown;
|
||
//如果之前帧是KeyDown,则为KeyHold
|
||
else if (mAxis2State[axisType] == AxiIptJoystickState.KeyDown)
|
||
mAxis2State[axisType] = AxiIptJoystickState.KeyHold;
|
||
}
|
||
//未按下
|
||
else
|
||
{
|
||
//如果之前帧是KeyDown|KeyHold,则为KeyUp|None
|
||
if (mAxis2State[axisType] >= AxiIptJoystickState.KeyDown)
|
||
mAxis2State[axisType] = AxiIptJoystickState.KeyUp;
|
||
//如果之前帧是KeyUp,则为None
|
||
else if (mAxis2State[axisType] == AxiIptJoystickState.KeyUp)
|
||
mAxis2State[axisType] = AxiIptJoystickState.None;
|
||
}
|
||
}
|
||
bool GetKey(AxiInputUGuiBtnType key)
|
||
{
|
||
UpdateState();
|
||
return mAxis2State[key] >= AxiIptJoystickState.KeyDown;
|
||
}
|
||
bool GetKeyUp(AxiInputUGuiBtnType key)
|
||
{
|
||
UpdateState();
|
||
return mAxis2State[key] == AxiIptJoystickState.KeyUp;
|
||
}
|
||
bool GetKeyDown(AxiInputUGuiBtnType key)
|
||
{
|
||
UpdateState();
|
||
return mAxis2State[key] == AxiIptJoystickState.KeyDown;
|
||
}
|
||
}
|
||
}
|