using System.Collections; using System.Collections.Generic; 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 inputUnitSlideList; public List inputUnitReleaseList; private void Start() { for (int i = -2; i <= 12; i++) { inputUnitTapList.Add(new InputUnitTap(i, Vector2.zero)); inputUnitSlideList.Add(new InputUnitSlide(i, Vector2.zero, Vector2.zero)); inputUnitReleaseList.Add(new InputUnitRelease(i, Vector2.zero)); } } public void Update() { if (!GameManager.instance.audioManager.songPlayer.isPlaying) { return; } if (Application.platform == RuntimePlatform.WindowsPlayer || Application.platform == RuntimePlatform.OSXPlayer || Application.platform == RuntimePlatform.WindowsEditor || Application.platform == RuntimePlatform.OSXEditor) { if (Mouse.current.leftButton.wasPressedThisFrame) { SetNewInputUnitTap(-1, Mouse.current.position.ReadValue()); } if (Mouse.current.leftButton.isPressed) { SetNewInputUnitSlide(-1, Mouse.current.position.ReadValue(), Mouse.current.delta.ReadValue()); } if (Mouse.current.rightButton.wasPressedThisFrame) { SetNewInputUnitTap(-2, Mouse.current.position.ReadValue()); } if (Mouse.current.rightButton.isPressed) { SetNewInputUnitSlide(-2, Mouse.current.position.ReadValue(), Mouse.current.delta.ReadValue()); } } foreach (var touch in Touch.activeTouches) { switch (touch.phase) { case TouchPhase.Began: SetNewInputUnitTap(touch.finger.index, touch.screenPosition); SetNewInputUnitSlide(touch.finger.index, touch.screenPosition, Vector2.zero); break; case TouchPhase.Stationary: SetNewInputUnitSlide(touch.finger.index, touch.screenPosition, Vector2.zero); break; case TouchPhase.Moved: SetNewInputUnitSlide(touch.finger.index, touch.screenPosition, touch.delta); break; case TouchPhase.Ended: SetNewInputUnitRelease(touch.finger.index, touch.screenPosition); break; } } List enablingInputUnitTapList = inputUnitTapList.FindAll(x => x.isEnabling); List enablingInputUnitSlideList = inputUnitSlideList.FindAll(x => x.isEnabling); List enablingInputUnitReleaseList = inputUnitReleaseList.FindAll(x => x.isEnabling); foreach (InputUnitTap inputUnitTap in enablingInputUnitTapList) { List availableTaps = new List(); foreach (Tap tap in checkingTapList) { if (tap.CheckJudgeAvailability(inputUnitTap)) { availableTaps.Add(tap); } } if (availableTaps.Count > 0) { availableTaps.Sort(); Tap closestTap = availableTaps[0]; Debug.Log(closestTap.exactJudgeTime); closestTap.ExecuteStartJudge(); } } foreach (InputUnitSlide inputUnitSlide in enablingInputUnitSlideList) { /*List availableFlicks = new List(); foreach (Flick flick in checkingFlickList) { if (flick.CheckJudgeAvailability(inputUnitSlide)) { availableFlicks.Add(flick); } } if (availableFlicks.Count > 0) { availableFlicks.Sort(); Flick closestFlick = availableFlicks[0]; closestFlick.SetFirstJudge(inputUnitSlide.inputDeltaPosition); }*/ List availableStays = new List(); foreach (Stay stay in checkingStayList) { if (stay.CheckJudgeAvailability(inputUnitSlide)) { availableStays.Add(stay); } } foreach (Stay stay in availableStays) { stay.ExecuteStartJudge(); } } } private void LateUpdate() { if (!GameManager.instance.audioManager.songPlayer.isPlaying) { return; } for (int i = 0; i < inputUnitTapList.Count; i++) { inputUnitTapList[i].isEnabling = false; inputUnitSlideList[i].isEnabling = false; inputUnitSlideList[i].inputDeltaPosition = Vector2.zero; inputUnitSlideList[i].isEnabling = false; } } public void SetNewInputUnitTap(int fingerId, Vector2 inputPosition) { InputUnitTap inputUnitTap = inputUnitTapList.Find(x => x.fingerId == fingerId); inputUnitTap.isEnabling = true; inputUnitTap.inputPosition = inputPosition; //Debug.Log("Tap: " + fingerId + " " + inputPosition); } public void SetNewInputUnitSlide(int fingerId, Vector2 inputPosition, Vector2 inputDeltaPosition) { InputUnitSlide inputUnitSlide = inputUnitSlideList.Find(x => x.fingerId == fingerId); inputUnitSlide.isEnabling = true; inputUnitSlide.inputPosition = inputPosition; inputUnitSlide.inputDeltaPosition = inputDeltaPosition; //Debug.Log("Slide: " + fingerId + " " + inputPosition + " " + inputDeltaPosition); } public void SetNewInputUnitRelease(int fingerId, Vector2 inputPosition) { InputUnitRelease inputUnitRelease = inputUnitReleaseList.Find(x => x.fingerId == fingerId); inputUnitRelease.isEnabling = true; inputUnitRelease.inputPosition = inputPosition; //Debug.Log("Release: " + fingerId + " " + inputPosition); } } public class InputUnit { public int fingerId; public bool isEnabling; public Vector2 inputPosition; public InputManager inputManager => GameManager.instance.inputManager; } public class InputUnitTap : InputUnit { public InputUnitTap(int fingerId, Vector2 inputPosition) { this.fingerId = fingerId; this.inputPosition = inputPosition; } } public class InputUnitSlide : InputUnit { public Vector2 inputDeltaPosition; public InputUnitSlide(int fingerId, Vector2 inputPosition, Vector2 inputDeltaPosition) { this.fingerId = fingerId; this.inputPosition = inputPosition; this.inputDeltaPosition = inputDeltaPosition; } } public class InputUnitRelease : InputUnit { public InputUnitRelease(int fingerId, Vector2 inputPosition) { this.fingerId = fingerId; this.inputPosition = inputPosition; } } }