Files
bansonic_beta_main/Assets/scripts/gamePlay_gameplay/TrackTouchRegion.cs
T

62 lines
2.2 KiB
C#

using UnityEngine;
using UnityEngine.EventSystems;
/// <summary>
/// Touch/click region that drives one gameplay track (0-4) through InputManager,
/// exactly as if the bound keyboard key were pressed/released. Attach to a UI
/// element (Image with Raycast Target on) laid over a lane; set trackIndex in the
/// inspector. Uses EventSystem pointer callbacks so it supports multi-touch (each
/// finger routes its own down/up to the region it started on) and works on Android
/// touch as well as desktop mouse.
///
/// Judgment/scoring is unchanged: this only injects the same press/release the
/// keyboard path produces. On a track already held by keyboard, PressTrack/
/// ReleaseTrack are idempotent so there is no double-trigger.
/// </summary>
[RequireComponent(typeof(RectTransform))]
public class TrackTouchRegion : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
[Tooltip("Track this region controls: 0=red 1=green 2=yellow 3=purple 4=blue")]
[Range(0, 4)]
public int trackIndex = 0;
// The pointerId that pressed this region, so we only release on the matching
// pointer's up event (relevant for multi-touch where several fingers are down).
private int activePointerId = int.MinValue;
private bool pressed = false;
public void OnPointerDown(PointerEventData eventData)
{
if (pressed) return; // already driven by another finger; ignore extras
var im = InputManager.Instance;
if (im == null) return;
activePointerId = eventData.pointerId;
pressed = true;
im.PressTrack(trackIndex);
}
public void OnPointerUp(PointerEventData eventData)
{
if (!pressed || eventData.pointerId != activePointerId) return;
var im = InputManager.Instance;
pressed = false;
activePointerId = int.MinValue;
if (im != null) im.ReleaseTrack(trackIndex);
}
private void OnDisable()
{
// If the region is hidden/destroyed mid-hold, make sure the track is released
// so a note is not left stuck in the held state.
if (pressed)
{
pressed = false;
activePointerId = int.MinValue;
var im = InputManager.Instance;
if (im != null) im.ReleaseTrack(trackIndex);
}
}
}