Files
ichni_Official/Assets/Scripts/Manager/InputManager.cs
SoulliesOfficial bae0bfbc20 perf
2025-07-21 05:42:20 -04:00

214 lines
7.1 KiB
C#

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Ichni.RhythmGame;
using Sirenix.OdinInspector;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.EnhancedTouch;
using Touch = UnityEngine.InputSystem.EnhancedTouch.Touch;
using TouchPhase = UnityEngine.InputSystem.TouchPhase;
namespace Ichni
{
public class InputManager : SerializedMonoBehaviour
{
public List<Tap> checkingTapList;
public List<Stay> checkingStayList;
public List<Hold> checkingHoldList;
public List<Flick> checkingFlickList;
public List<InputUnitTap> inputUnitTapList;
public List<InputUnitTouch> inputUnitTouchList;
public List<InputUnitSwipe> inputUnitSwipeList;
private void Start()
{
checkingTapList = new List<Tap>();
checkingStayList = new List<Stay>();
checkingHoldList = new List<Hold>();
checkingFlickList = new List<Flick>();
inputUnitTapList = new List<InputUnitTap>();
inputUnitTouchList = new List<InputUnitTouch>();
inputUnitSwipeList = new List<InputUnitSwipe>();
RhythmInputManager.OnTap += SetNewInputUnitTap;
RhythmInputManager.OnTouch += SetNewInputUnitTouch;
RhythmInputManager.OnSwipe += SetNewInputUnitSwipe;
}
public void Update()
{
if (!GameManager.instance.audioManager.isPlaying)
{
return;
}
foreach (InputUnitTap inputUnitTap in inputUnitTapList)
{
List<Tap> availableTaps = new List<Tap>();
foreach (Tap tap in checkingTapList)
{
if (tap.CheckJudgeAvailability(inputUnitTap))
{
availableTaps.Add(tap);
}
}
List<Hold> availableHolds = new List<Hold>();
foreach (Hold hold in checkingHoldList)
{
if (hold.CheckJudgeAvailability(inputUnitTap))
{
availableHolds.Add(hold);
}
}
bool haveHold = availableHolds.Count > 0;
bool haveTap = availableTaps.Count > 0;
Hold closestHold = availableHolds.Min();
Tap closestTap = availableTaps.Min();
if (haveHold && haveTap)
{
if (closestHold.exactJudgeTime < closestTap.exactJudgeTime)
{
closestHold.ExecuteStartJudge();
}
else
{
closestTap.ExecuteStartJudge();
}
}
else if (haveHold)
{
closestHold.ExecuteStartJudge();
}
else if (haveTap)
{
closestTap.ExecuteStartJudge();
}
}
foreach (InputUnitSwipe inputUnitSwipe in inputUnitSwipeList)
{
List<Flick> availableFlicks = new List<Flick>();
foreach (Flick flick in checkingFlickList)
{
if (flick.CheckJudgeAvailability(inputUnitSwipe))
{
availableFlicks.Add(flick);
}
}
if (availableFlicks.Count > 0)
{
availableFlicks.Sort();
Flick closestFlick = availableFlicks[0];
closestFlick.ExecuteStartJudge();
}
}
foreach (InputUnitTouch inputUnitTouch in inputUnitTouchList)
{
List<Stay> availableStays = new List<Stay>();
foreach (Stay stay in checkingStayList)
{
if (stay.CheckJudgeAvailability(inputUnitTouch))
{
availableStays.Add(stay);
}
}
List<Hold> availableHolds = new List<Hold>();
foreach (Hold hold in checkingHoldList)
{
if (hold.CheckJudgeAvailability(inputUnitTouch))
{
availableHolds.Add(hold);
}
}
foreach (Stay stay in availableStays)
{
stay.ExecuteStartJudge();
}
foreach (Hold hold in availableHolds)
{
hold.ExecuteProcessJudge();
}
}
inputUnitTapList.Clear();
inputUnitTouchList.Clear();
inputUnitSwipeList.Clear();
}
public void SetNewInputUnitTap(int fingerId, Vector2 inputPosition)
{
InputUnitTap inputUnitTap = new InputUnitTap(fingerId, inputPosition);
if(!inputUnitTapList.Exists(x => x.fingerId == fingerId))
{
inputUnitTapList.Add(inputUnitTap);
//Debug.Log("Tap: " + fingerId + " " + inputPosition);
}
}
public void SetNewInputUnitTouch(int fingerId, Vector2 inputPosition)
{
InputUnitTouch inputUnitTouch = new InputUnitTouch(fingerId, inputPosition);
if(!inputUnitTouchList.Exists(x => x.fingerId == fingerId))
{
inputUnitTouchList.Add(inputUnitTouch);
}
//Debug.Log("Touch: " + fingerId + " " + inputPosition);
}
public void SetNewInputUnitSwipe(int fingerId, Vector2 inputPosition, Vector2 delta)
{
InputUnitSwipe inputUnitSwipe = new InputUnitSwipe(fingerId, inputPosition, delta);
if(!inputUnitSwipeList.Exists(x => x.fingerId == fingerId))
{
inputUnitSwipeList.Add(inputUnitSwipe);
}
//Debug.Log("Swipe: " + fingerId + " " + inputPosition + " " + delta);
}
}
public class InputUnit
{
public int fingerId;
public Vector2 inputPosition;
}
public class InputUnitTap : InputUnit
{
public InputUnitTap(int fingerId, Vector2 inputPosition)
{
this.fingerId = fingerId;
this.inputPosition = inputPosition;
}
}
public class InputUnitTouch : InputUnit
{
public InputUnitTouch(int fingerId, Vector2 inputPosition)
{
this.fingerId = fingerId;
this.inputPosition = inputPosition;
}
}
public class InputUnitSwipe : InputUnit
{
public Vector2 swipeDirection;
public InputUnitSwipe(int fingerId, Vector2 inputPosition, Vector2 swipeDirection)
{
this.fingerId = fingerId;
this.inputPosition = inputPosition;
this.swipeDirection = swipeDirection.normalized;
}
}
}