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 checkingTapList; public List checkingStayList; public List checkingHoldList; public List checkingFlickList; public List inputUnitTapList; public List inputUnitTouchList; public List inputUnitSwipeList; private void Start() { checkingTapList = new List(); checkingStayList = new List(); checkingHoldList = new List(); checkingFlickList = new List(); inputUnitTapList = new List(); inputUnitTouchList = new List(); inputUnitSwipeList = new List(); RhythmInputManager.OnTap += SetNewInputUnitTap; RhythmInputManager.OnTouch += SetNewInputUnitTouch; RhythmInputManager.OnSwipe += SetNewInputUnitSwipe; } public void Update() { if (!GameManager.instance.audioManager.isPlaying) { return; } foreach (InputUnitTap inputUnitTap in inputUnitTapList) { List availableTaps = new List(); foreach (Tap tap in checkingTapList) { if (tap.CheckJudgeAvailability(inputUnitTap)) { availableTaps.Add(tap); } } List availableHolds = new List(); 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 availableFlicks = new List(); 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 availableStays = new List(); foreach (Stay stay in checkingStayList) { if (stay.CheckJudgeAvailability(inputUnitTouch)) { availableStays.Add(stay); } } List availableHolds = new List(); 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; } } }