Files
ichni_Official/Assets/Scripts/Game/GameElements/Notes/JudgeSubmodules/TouchAreaJudgeUnit.cs

66 lines
2.4 KiB
C#
Raw Normal View History

2025-06-03 02:42:28 -04:00
using System.Collections;
using Ichni.RhythmGame.Beatmap;
using UnityEngine;
namespace Ichni.RhythmGame
{
public class TouchAreaJudgeUnit : NoteJudgeUnit
{
2026-03-14 03:13:10 -04:00
#region [] Properties
public float ellipseXMultiplier = 1.25f;
public float ellipseYMultiplier = 1.0f;
2025-06-03 02:42:28 -04:00
public float areaRadius;
2025-07-26 04:20:25 -04:00
2026-03-14 03:13:10 -04:00
private static float CurrentScreenRatio => Screen.height / 1080f; // 以1080p为基准的屏幕缩放比例
#endregion
2025-07-26 04:20:25 -04:00
2026-03-14 03:13:10 -04:00
#region [] Initialization
2025-06-03 02:42:28 -04:00
public TouchAreaJudgeUnit(NoteBase note, float areaRadius) : base(note)
{
this.areaRadius = areaRadius;
}
2026-03-14 03:13:10 -04:00
#endregion
#region [] Judge Overrides
protected override GameObject GetHintImagePrefab()
{
return GameManager.Instance.basePrefabs.areaHint;
}
2025-06-03 02:42:28 -04:00
public override void UpdateJudge()
{
2025-08-22 14:54:40 -04:00
if ((note is not Hold && note.isFirstJudged)||(note is Hold && note.isFinalJudged)) return;
2025-06-03 02:42:28 -04:00
Vector2 noteScreenPosition = note.noteScreenPosition;
2026-03-14 03:13:10 -04:00
RectTransform canvasRect = GameManager.Instance.judgeHintCanvas.GetComponent<RectTransform>();
2025-06-03 02:42:28 -04:00
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasRect, noteScreenPosition, null, out Vector2 uiPosition))
{
judgeHintImage.anchoredPosition = uiPosition;
2026-03-14 03:13:10 -04:00
judgeHintImage.sizeDelta = new Vector2(areaRadius * 2 * ellipseXMultiplier, areaRadius * 2 * ellipseYMultiplier) * CurrentScreenRatio;
2025-06-03 02:42:28 -04:00
}
}
public override bool CheckJudgeAvailability(InputUnit inputUnit)
{
Vector2 inputScreenPosition = inputUnit.inputPosition;
2025-08-11 14:04:06 -04:00
Vector2 noteScreenPosition = note.GetScreenPosition();
2026-03-14 03:13:10 -04:00
float scaledBaseRadius = areaRadius * CurrentScreenRatio;
float dx = Mathf.Abs(inputScreenPosition.x - noteScreenPosition.x) / ellipseXMultiplier;
float dy = Mathf.Abs(inputScreenPosition.y - noteScreenPosition.y) / ellipseYMultiplier;
2025-07-26 04:20:25 -04:00
2026-03-14 03:13:10 -04:00
if ((dx * dx) + (dy * dy) <= (scaledBaseRadius * scaledBaseRadius))
2025-06-03 02:42:28 -04:00
{
2025-07-21 05:42:20 -04:00
if (inputUnit is InputUnitSwipe swipe && note is Flick flick)
{
2025-07-26 04:20:25 -04:00
return flick.CheckSwipeDirection(swipe);
2025-07-21 05:42:20 -04:00
}
2025-06-03 02:42:28 -04:00
return true;
}
2026-03-14 03:13:10 -04:00
2025-06-03 02:42:28 -04:00
return false;
}
2026-03-14 03:13:10 -04:00
#endregion
2025-06-03 02:42:28 -04:00
}
2026-03-14 03:13:10 -04:00
2025-06-03 02:42:28 -04:00
}