66 lines
2.4 KiB
C#
66 lines
2.4 KiB
C#
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<RectTransform>();
|
|
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
|
|
|
|
}
|
|
|
|
} |