Files
ichni_Official/Assets/Scripts/Manager/InputManager.cs
SoulliesOfficial 150ef744e8 更新
2025-07-08 14:28:40 -04:00

227 lines
8.2 KiB
C#

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<Tap> checkingTapList;
public List<Stay> checkingStayList;
public List<Hold> checkingHoldList;
public List<Flick> checkingFlickList;
public List<InputUnitTap> inputUnitTapList;
public List<InputUnitSlide> inputUnitSlideList;
public List<InputUnitRelease> 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.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<InputUnitTap> enablingInputUnitTapList = inputUnitTapList.FindAll(x => x.isEnabling);
List<InputUnitSlide> enablingInputUnitSlideList = inputUnitSlideList.FindAll(x => x.isEnabling);
List<InputUnitRelease> enablingInputUnitReleaseList = inputUnitReleaseList.FindAll(x => x.isEnabling);
foreach (InputUnitTap inputUnitTap in enablingInputUnitTapList)
{
List<Tap> availableTaps = new List<Tap>();
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<Flick> availableFlicks = new List<Flick>();
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<Stay> availableStays = new List<Stay>();
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.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;
}
}
}