using System.Collections; using Ichni.RhythmGame.Beatmap; using UnityEngine; namespace Ichni.RhythmGame { public class TouchAreaJudgeUnit : NoteJudgeUnit { #region [暴露属性字段] Properties public float ellipseXMultiplier = 1.25f; public float ellipseYMultiplier = 1.0f; public float areaRadius; private static float CurrentScreenRatio => Screen.height / 1080f; // 以1080p为基准的屏幕缩放比例 #endregion #region [初始化] Initialization public TouchAreaJudgeUnit(NoteBase note, float areaRadius) : base(note) { this.areaRadius = areaRadius; } #endregion #region [判定逻辑覆盖] Judge Overrides protected override GameObject GetHintImagePrefab() { return GameManager.Instance.basePrefabs.areaHint; } public override void UpdateJudge() { if ((note is not Hold && note.isFirstJudged)||(note is Hold && note.isFinalJudged)) return; Vector2 noteScreenPosition = note.noteScreenPosition; RectTransform canvasRect = GameManager.Instance.judgeHintCanvas.GetComponent(); if (RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasRect, noteScreenPosition, null, out Vector2 uiPosition)) { judgeHintImage.anchoredPosition = uiPosition; judgeHintImage.sizeDelta = new Vector2(areaRadius * 2 * ellipseXMultiplier, areaRadius * 2 * ellipseYMultiplier) * CurrentScreenRatio; } } public override bool CheckJudgeAvailability(InputUnit inputUnit) { Vector2 inputScreenPosition = inputUnit.inputPosition; Vector2 noteScreenPosition = note.GetScreenPosition(); float scaledBaseRadius = areaRadius * CurrentScreenRatio; float dx = Mathf.Abs(inputScreenPosition.x - noteScreenPosition.x) / ellipseXMultiplier; float dy = Mathf.Abs(inputScreenPosition.y - noteScreenPosition.y) / ellipseYMultiplier; if ((dx * dx) + (dy * dy) <= (scaledBaseRadius * scaledBaseRadius)) { if (inputUnit is InputUnitSwipe swipe && note is Flick flick) { return flick.CheckSwipeDirection(swipe); } return true; } return false; } #endregion } }