2025-06-03 02:42:28 -04:00
|
|
|
using System.Collections;
|
|
|
|
|
using System.Collections.Generic;
|
2025-07-21 05:42:20 -04:00
|
|
|
using System.Linq;
|
2025-06-03 02:42:28 -04:00
|
|
|
using Ichni.RhythmGame;
|
|
|
|
|
using Sirenix.OdinInspector;
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
|
|
namespace Ichni
|
|
|
|
|
{
|
2025-08-11 14:04:06 -04:00
|
|
|
public partial class NoteJudgeManager : SerializedMonoBehaviour
|
2025-06-03 02:42:28 -04:00
|
|
|
{
|
|
|
|
|
public List<Tap> checkingTapList;
|
|
|
|
|
public List<Stay> checkingStayList;
|
|
|
|
|
public List<Hold> checkingHoldList;
|
|
|
|
|
public List<Flick> checkingFlickList;
|
|
|
|
|
|
|
|
|
|
public List<InputUnitTap> inputUnitTapList;
|
2025-07-21 05:42:20 -04:00
|
|
|
public List<InputUnitTouch> inputUnitTouchList;
|
|
|
|
|
public List<InputUnitSwipe> inputUnitSwipeList;
|
2026-03-14 03:13:10 -04:00
|
|
|
|
|
|
|
|
private List<Tap> _availableTapsBuffer = new List<Tap>(30);
|
|
|
|
|
private List<Hold> _availableHoldsBuffer = new List<Hold>(10);
|
|
|
|
|
private List<Flick> _availableFlicksBuffer = new List<Flick>(10);
|
|
|
|
|
private List<Stay> _availableStaysBuffer = new List<Stay>(30);
|
|
|
|
|
|
|
|
|
|
private List<Tap> _minTapsBuffer = new List<Tap>(5);
|
|
|
|
|
private List<Hold> _minHoldsBuffer = new List<Hold>(5);
|
|
|
|
|
private List<Flick> _minFlicksBuffer = new List<Flick>(5);
|
|
|
|
|
|
|
|
|
|
private InputUnitSwipe _cachedAssumedSwipe = new InputUnitSwipe(0, Vector2.zero, true, true, Vector2.zero);
|
2025-06-03 02:42:28 -04:00
|
|
|
|
|
|
|
|
private void Start()
|
|
|
|
|
{
|
2025-07-21 05:42:20 -04:00
|
|
|
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>();
|
2025-06-03 02:42:28 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Update()
|
|
|
|
|
{
|
2026-03-14 03:13:10 -04:00
|
|
|
if (!GameManager.Instance.songPlayer.isPlaying)
|
2025-06-03 02:42:28 -04:00
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-14 03:13:10 -04:00
|
|
|
float songTime = CoreServices.TimeProvider.SongTime;
|
2025-09-06 21:58:48 -04:00
|
|
|
|
2026-03-14 03:13:10 -04:00
|
|
|
foreach (var swipe in inputUnitSwipeList)
|
|
|
|
|
{
|
|
|
|
|
_availableFlicksBuffer.Clear();
|
|
|
|
|
|
|
|
|
|
foreach (Flick flick in checkingFlickList)
|
|
|
|
|
{
|
|
|
|
|
if (flick.CheckJudgeAvailability(swipe))
|
|
|
|
|
{
|
|
|
|
|
_availableFlicksBuffer.Add(flick);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (_availableFlicksBuffer.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
if (swipe.isFirst) // 原 tapSwipeList 逻辑
|
|
|
|
|
{
|
|
|
|
|
GetAllMinNotes(_availableFlicksBuffer, _minFlicksBuffer); // 提醒:内部也需防 new List
|
|
|
|
|
if (_minFlicksBuffer.Count == 1) _minFlicksBuffer[0].ExecuteStartJudge(songTime);
|
|
|
|
|
else if (_minFlicksBuffer.Count > 1) GetNearestNote(_minFlicksBuffer, swipe.inputPosition).ExecuteTapJudge(songTime);
|
|
|
|
|
}
|
|
|
|
|
else // 原 holdSwipeList 逻辑
|
|
|
|
|
{
|
|
|
|
|
_availableFlicksBuffer.Sort();
|
|
|
|
|
_availableFlicksBuffer[0].ExecuteStartJudge(songTime);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*foreach (InputUnitSwipe tapSwipe in tapSwipeList)
|
2026-01-21 00:31:23 -05:00
|
|
|
{
|
|
|
|
|
List<Flick> availableFlicks = new List<Flick>();
|
|
|
|
|
|
|
|
|
|
foreach (Flick flick in checkingFlickList)
|
|
|
|
|
{
|
|
|
|
|
if (flick.CheckJudgeAvailability(tapSwipe))
|
|
|
|
|
{
|
|
|
|
|
availableFlicks.Add(flick);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
List<Flick> minFlicks = GetAllMinNotes(availableFlicks);
|
|
|
|
|
|
|
|
|
|
if (minFlicks.Count == 1)
|
|
|
|
|
{
|
|
|
|
|
minFlicks[0].ExecuteStartJudge();
|
|
|
|
|
}
|
|
|
|
|
else if (minFlicks.Count > 1)
|
|
|
|
|
{
|
|
|
|
|
GetNearestNote(minFlicks, tapSwipe.inputPosition).ExecuteTapJudge();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
foreach (InputUnitSwipe inputUnitSwipe in holdSwipeList)
|
|
|
|
|
{
|
|
|
|
|
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();
|
|
|
|
|
}
|
2026-03-14 03:13:10 -04:00
|
|
|
}*/
|
2026-01-21 00:31:23 -05:00
|
|
|
|
2025-07-21 05:42:20 -04:00
|
|
|
foreach (InputUnitTap inputUnitTap in inputUnitTapList)
|
2025-06-03 02:42:28 -04:00
|
|
|
{
|
2026-03-14 03:13:10 -04:00
|
|
|
_availableTapsBuffer.Clear();
|
|
|
|
|
_availableHoldsBuffer.Clear();
|
|
|
|
|
|
2025-06-03 02:42:28 -04:00
|
|
|
foreach (Tap tap in checkingTapList)
|
|
|
|
|
{
|
2026-03-14 03:13:10 -04:00
|
|
|
if (tap.CheckJudgeAvailability(inputUnitTap)) _availableTapsBuffer.Add(tap);
|
2025-06-03 02:42:28 -04:00
|
|
|
}
|
2025-07-21 05:42:20 -04:00
|
|
|
foreach (Hold hold in checkingHoldList)
|
|
|
|
|
{
|
2026-03-14 03:13:10 -04:00
|
|
|
if (hold.CheckJudgeAvailability(inputUnitTap)) _availableHoldsBuffer.Add(hold);
|
2025-07-21 05:42:20 -04:00
|
|
|
}
|
2026-01-21 00:31:23 -05:00
|
|
|
|
2026-03-14 03:13:10 -04:00
|
|
|
bool haveTap = _availableTapsBuffer.Count > 0;
|
|
|
|
|
bool haveHold = _availableHoldsBuffer.Count > 0;
|
2026-01-21 00:31:23 -05:00
|
|
|
|
|
|
|
|
Flick closestFlick = null;
|
|
|
|
|
InputUnitSwipe assumedSwipe = new InputUnitSwipe(inputUnitTap.fingerId, inputUnitTap.inputPosition, true, true, Vector2.zero);
|
|
|
|
|
foreach (Flick flick in checkingFlickList)
|
|
|
|
|
{
|
|
|
|
|
if (flick.CheckJudgeAvailability(assumedSwipe))
|
|
|
|
|
{
|
|
|
|
|
if (closestFlick == null || flick.exactJudgeTime < closestFlick.exactJudgeTime)
|
|
|
|
|
{
|
|
|
|
|
closestFlick = flick;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-21 05:42:20 -04:00
|
|
|
if (haveHold && haveTap)
|
|
|
|
|
{
|
2026-03-14 03:13:10 -04:00
|
|
|
GetAllMinNotes(_availableHoldsBuffer, _minHoldsBuffer);
|
|
|
|
|
GetAllMinNotes(_availableTapsBuffer, _minTapsBuffer);
|
|
|
|
|
Hold closestHold = _minHoldsBuffer[0];
|
|
|
|
|
Tap closestTap = _minTapsBuffer[0];
|
2026-01-21 00:31:23 -05:00
|
|
|
bool holdBlockedByFlick = false;
|
|
|
|
|
bool tapBlockedByFlick = false;
|
|
|
|
|
|
|
|
|
|
if (closestFlick != null)
|
|
|
|
|
{
|
|
|
|
|
if (closestFlick.exactJudgeTime < closestHold.exactJudgeTime)
|
|
|
|
|
{
|
|
|
|
|
holdBlockedByFlick = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (closestFlick.exactJudgeTime < closestTap.exactJudgeTime)
|
|
|
|
|
{
|
|
|
|
|
tapBlockedByFlick = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!holdBlockedByFlick && closestHold.exactJudgeTime < closestTap.exactJudgeTime)
|
2025-07-21 05:42:20 -04:00
|
|
|
{
|
2026-03-14 03:13:10 -04:00
|
|
|
if (_minHoldsBuffer.Count == 1)
|
2025-08-11 14:04:06 -04:00
|
|
|
{
|
2026-03-14 03:13:10 -04:00
|
|
|
_minHoldsBuffer[0].ExecuteStartJudge(songTime);
|
2025-08-11 14:04:06 -04:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2026-03-14 03:13:10 -04:00
|
|
|
GetNearestNote(_minHoldsBuffer, inputUnitTap.inputPosition).ExecuteStartJudge(songTime);
|
2025-08-11 14:04:06 -04:00
|
|
|
}
|
2025-07-21 05:42:20 -04:00
|
|
|
}
|
2026-01-21 00:31:23 -05:00
|
|
|
else if (!tapBlockedByFlick)
|
2025-07-21 05:42:20 -04:00
|
|
|
{
|
2026-03-14 03:13:10 -04:00
|
|
|
if (_minTapsBuffer.Count == 1)
|
2025-08-11 14:04:06 -04:00
|
|
|
{
|
2026-03-14 03:13:10 -04:00
|
|
|
_minTapsBuffer[0].ExecuteStartJudge(songTime);
|
2025-08-11 14:04:06 -04:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2026-03-14 03:13:10 -04:00
|
|
|
GetNearestNote(_minTapsBuffer, inputUnitTap.inputPosition).ExecuteStartJudge(songTime);
|
2025-08-11 14:04:06 -04:00
|
|
|
}
|
2025-07-21 05:42:20 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (haveHold)
|
|
|
|
|
{
|
2026-03-14 03:13:10 -04:00
|
|
|
GetAllMinNotes(_availableHoldsBuffer, _minHoldsBuffer);
|
|
|
|
|
bool holdBlockedByFlick = closestFlick != null && closestFlick.exactJudgeTime < _minHoldsBuffer[0].exactJudgeTime;
|
2026-01-21 00:31:23 -05:00
|
|
|
if (!holdBlockedByFlick)
|
2025-08-11 14:04:06 -04:00
|
|
|
{
|
2026-03-14 03:13:10 -04:00
|
|
|
if (_minHoldsBuffer.Count == 1)
|
2026-01-21 00:31:23 -05:00
|
|
|
{
|
2026-03-14 03:13:10 -04:00
|
|
|
_minHoldsBuffer[0].ExecuteStartJudge(songTime);
|
2026-01-21 00:31:23 -05:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2026-03-14 03:13:10 -04:00
|
|
|
GetNearestNote(_minHoldsBuffer, inputUnitTap.inputPosition).ExecuteStartJudge(songTime);
|
2026-01-21 00:31:23 -05:00
|
|
|
}
|
2025-08-11 14:04:06 -04:00
|
|
|
}
|
2025-07-21 05:42:20 -04:00
|
|
|
}
|
|
|
|
|
else if (haveTap)
|
2025-06-03 02:42:28 -04:00
|
|
|
{
|
2026-03-14 03:13:10 -04:00
|
|
|
GetAllMinNotes(_availableTapsBuffer, _minTapsBuffer);
|
|
|
|
|
bool tapBlockedByFlick = closestFlick != null && closestFlick.exactJudgeTime < _minTapsBuffer[0].exactJudgeTime;
|
2026-01-21 00:31:23 -05:00
|
|
|
if (!tapBlockedByFlick)
|
2025-08-11 14:04:06 -04:00
|
|
|
{
|
2026-03-14 03:13:10 -04:00
|
|
|
if (_minTapsBuffer.Count == 1)
|
2026-01-21 00:31:23 -05:00
|
|
|
{
|
2026-03-14 03:13:10 -04:00
|
|
|
_minTapsBuffer[0].ExecuteStartJudge(songTime);
|
2026-01-21 00:31:23 -05:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2026-03-14 03:13:10 -04:00
|
|
|
GetNearestNote(_minTapsBuffer, inputUnitTap.inputPosition).ExecuteStartJudge(songTime);
|
2026-01-21 00:31:23 -05:00
|
|
|
}
|
2025-06-03 02:42:28 -04:00
|
|
|
}
|
|
|
|
|
}
|
2025-07-21 05:42:20 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
foreach (InputUnitTouch inputUnitTouch in inputUnitTouchList)
|
|
|
|
|
{
|
2026-03-14 03:13:10 -04:00
|
|
|
_availableStaysBuffer.Clear();
|
2025-06-03 02:42:28 -04:00
|
|
|
foreach (Stay stay in checkingStayList)
|
|
|
|
|
{
|
2025-07-21 05:42:20 -04:00
|
|
|
if (stay.CheckJudgeAvailability(inputUnitTouch))
|
2025-06-03 02:42:28 -04:00
|
|
|
{
|
2026-03-14 03:13:10 -04:00
|
|
|
_availableStaysBuffer.Add(stay);
|
2025-06-03 02:42:28 -04:00
|
|
|
}
|
|
|
|
|
}
|
2025-07-21 05:42:20 -04:00
|
|
|
|
2026-03-14 03:13:10 -04:00
|
|
|
_availableHoldsBuffer.Clear();
|
2025-07-21 05:42:20 -04:00
|
|
|
foreach (Hold hold in checkingHoldList)
|
|
|
|
|
{
|
|
|
|
|
if (hold.CheckJudgeAvailability(inputUnitTouch))
|
|
|
|
|
{
|
2026-03-14 03:13:10 -04:00
|
|
|
_availableHoldsBuffer.Add(hold);
|
2025-07-21 05:42:20 -04:00
|
|
|
}
|
|
|
|
|
}
|
2025-06-03 02:42:28 -04:00
|
|
|
|
2026-03-14 03:13:10 -04:00
|
|
|
foreach (Stay stay in _availableStaysBuffer)
|
2025-06-03 02:42:28 -04:00
|
|
|
{
|
2026-03-14 03:13:10 -04:00
|
|
|
stay.ExecuteStartJudge(songTime);
|
2025-06-03 02:42:28 -04:00
|
|
|
}
|
2025-07-21 05:42:20 -04:00
|
|
|
|
2026-03-14 03:13:10 -04:00
|
|
|
foreach (Hold hold in _availableHoldsBuffer)
|
2025-07-21 05:42:20 -04:00
|
|
|
{
|
|
|
|
|
hold.ExecuteProcessJudge();
|
|
|
|
|
}
|
2025-06-03 02:42:28 -04:00
|
|
|
}
|
|
|
|
|
|
2025-07-21 05:42:20 -04:00
|
|
|
inputUnitTapList.Clear();
|
|
|
|
|
inputUnitTouchList.Clear();
|
|
|
|
|
inputUnitSwipeList.Clear();
|
2025-06-03 02:42:28 -04:00
|
|
|
}
|
|
|
|
|
|
2025-07-21 05:42:20 -04:00
|
|
|
public void SetNewInputUnitTap(int fingerId, Vector2 inputPosition)
|
2025-06-03 02:42:28 -04:00
|
|
|
{
|
2025-07-21 05:42:20 -04:00
|
|
|
InputUnitTap inputUnitTap = new InputUnitTap(fingerId, inputPosition);
|
|
|
|
|
if(!inputUnitTapList.Exists(x => x.fingerId == fingerId))
|
2025-06-03 02:42:28 -04:00
|
|
|
{
|
2025-07-21 05:42:20 -04:00
|
|
|
inputUnitTapList.Add(inputUnitTap);
|
2025-06-03 02:42:28 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-21 05:42:20 -04:00
|
|
|
public void SetNewInputUnitTouch(int fingerId, Vector2 inputPosition)
|
2025-06-03 02:42:28 -04:00
|
|
|
{
|
2025-07-21 05:42:20 -04:00
|
|
|
InputUnitTouch inputUnitTouch = new InputUnitTouch(fingerId, inputPosition);
|
|
|
|
|
if(!inputUnitTouchList.Exists(x => x.fingerId == fingerId))
|
|
|
|
|
{
|
|
|
|
|
inputUnitTouchList.Add(inputUnitTouch);
|
|
|
|
|
}
|
2025-06-03 02:42:28 -04:00
|
|
|
}
|
|
|
|
|
|
2025-09-05 10:14:45 -04:00
|
|
|
public void SetNewInputUnitSwipe(int fingerId, Vector2 inputPosition, bool isGeneric, bool isFirst, Vector2 delta)
|
2025-06-03 02:42:28 -04:00
|
|
|
{
|
2025-09-05 10:14:45 -04:00
|
|
|
InputUnitSwipe inputUnitSwipe = new InputUnitSwipe(fingerId, inputPosition, isGeneric, isFirst, delta);
|
2025-07-21 05:42:20 -04:00
|
|
|
if(!inputUnitSwipeList.Exists(x => x.fingerId == fingerId))
|
|
|
|
|
{
|
|
|
|
|
inputUnitSwipeList.Add(inputUnitSwipe);
|
|
|
|
|
}
|
2025-08-11 14:04:06 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public partial class NoteJudgeManager
|
|
|
|
|
{
|
2026-03-14 03:13:10 -04:00
|
|
|
private void GetAllMinNotes<T>(List<T> availableFlicks, List<T> destination) where T : NoteBase
|
2025-08-11 14:04:06 -04:00
|
|
|
{
|
2026-03-14 03:13:10 -04:00
|
|
|
destination.Clear();
|
2025-08-11 14:04:06 -04:00
|
|
|
float minTime = float.MaxValue;
|
2026-03-14 03:13:10 -04:00
|
|
|
foreach (T note in availableFlicks)
|
2025-08-11 14:04:06 -04:00
|
|
|
{
|
2026-03-14 03:13:10 -04:00
|
|
|
if (note.exactJudgeTime < minTime)
|
2025-08-11 14:04:06 -04:00
|
|
|
{
|
2026-03-14 03:13:10 -04:00
|
|
|
minTime = note.exactJudgeTime;
|
|
|
|
|
destination.Clear();
|
|
|
|
|
destination.Add(note);
|
2025-08-11 14:04:06 -04:00
|
|
|
}
|
2026-03-14 03:13:10 -04:00
|
|
|
else if (Mathf.Approximately(note.exactJudgeTime, minTime))
|
2025-08-11 14:04:06 -04:00
|
|
|
{
|
2026-03-14 03:13:10 -04:00
|
|
|
destination.Add(note);
|
2025-08-11 14:04:06 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-14 03:13:10 -04:00
|
|
|
|
2025-09-06 21:58:48 -04:00
|
|
|
private T GetNearestNote<T>(List<T> notes, Vector2 inputPosition) where T : NoteBase
|
2025-08-11 14:04:06 -04:00
|
|
|
{
|
|
|
|
|
float minDistance = float.MaxValue;
|
2025-09-06 21:58:48 -04:00
|
|
|
T closestNote = null;
|
|
|
|
|
foreach (T note in notes)
|
2025-08-11 14:04:06 -04:00
|
|
|
{
|
|
|
|
|
float distance = Vector2.Distance(inputPosition, note.noteScreenPosition);
|
|
|
|
|
if (distance < minDistance)
|
|
|
|
|
{
|
|
|
|
|
minDistance = distance;
|
|
|
|
|
closestNote = note;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return closestNote;
|
2025-06-03 02:42:28 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-21 05:42:20 -04:00
|
|
|
public class InputUnitTouch : InputUnit
|
2025-06-03 02:42:28 -04:00
|
|
|
{
|
2025-07-21 05:42:20 -04:00
|
|
|
public InputUnitTouch(int fingerId, Vector2 inputPosition)
|
2025-06-03 02:42:28 -04:00
|
|
|
{
|
|
|
|
|
this.fingerId = fingerId;
|
|
|
|
|
this.inputPosition = inputPosition;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-21 05:42:20 -04:00
|
|
|
public class InputUnitSwipe : InputUnit
|
2025-06-03 02:42:28 -04:00
|
|
|
{
|
2025-07-21 05:42:20 -04:00
|
|
|
public Vector2 swipeDirection;
|
2025-07-26 04:20:25 -04:00
|
|
|
public bool isGeneric;
|
2025-09-05 10:14:45 -04:00
|
|
|
public bool isFirst;
|
|
|
|
|
public InputUnitSwipe(int fingerId, Vector2 inputPosition, bool isGeneric, bool isFirst, Vector2 swipeDirection)
|
2025-06-03 02:42:28 -04:00
|
|
|
{
|
|
|
|
|
this.fingerId = fingerId;
|
|
|
|
|
this.inputPosition = inputPosition;
|
2025-07-26 04:20:25 -04:00
|
|
|
this.isGeneric = isGeneric;
|
2025-09-05 10:14:45 -04:00
|
|
|
this.isFirst = isFirst;
|
2025-07-21 05:42:20 -04:00
|
|
|
this.swipeDirection = swipeDirection.normalized;
|
2025-06-03 02:42:28 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|