using System.Collections; using Ichni.RhythmGame.Beatmap; using UnityEngine; namespace Ichni.RhythmGame { public class TouchAreaJudgeUnit : NoteJudgeUnit { public float areaRadius; protected override GameObject GetHintImagePrefab() => GameManager.instance.basePrefabs.areaHint; private float CurrentScreenRatio() => Screen.width / 1920f; public TouchAreaJudgeUnit(NoteBase note, float areaRadius) : base(note) { this.areaRadius = areaRadius; } public override void UpdateJudge() { if(note.isFirstJudged) 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, areaRadius * 2) * CurrentScreenRatio(); } } public override NoteJudgeUnit_BM ConvertToBM() { return new TouchAreaJudgeUnit_BM(areaRadius); } public override bool CheckJudgeAvailability(InputUnit inputUnit) { Vector2 inputScreenPosition = inputUnit.inputPosition; Vector2 noteScreenPosition = note.noteScreenPosition; float distance = Vector2.Distance(inputScreenPosition, noteScreenPosition); Debug.Log("Input Position: " + inputScreenPosition + ", Note Position: " + noteScreenPosition + ", Distance: " + distance); if (distance <= areaRadius * CurrentScreenRatio() * 0.5f) { return true; } return false; } } namespace Beatmap { public class TouchAreaJudgeUnit_BM : NoteJudgeUnit_BM { public float areaRadius; public TouchAreaJudgeUnit_BM() { } public TouchAreaJudgeUnit_BM(float areaRadius) { this.areaRadius = areaRadius; } public override NoteJudgeUnit ConvertToGameType(NoteBase attachedNote) { return new TouchAreaJudgeUnit(attachedNote, areaRadius); } } } }