using UnityEngine;
using UnityEngine.UI;
using WL.Player;
namespace WL.UI
{
///
/// 가상패드(플로팅 조이스틱) 표시.
///
/// **PD #706 ②** — `PlayerTouchSettings.floatingPadEverywhere = true`(기본)이면
/// 화면 어디를 눌러도 **누른 그 지점**에 패드가 나타나고, 손을 떼면 **즉시 사라진다**.
/// 토글을 끄면 구 동작(좌하단 고정 영역 + 대기 힌트 상시 표시)으로 돌아간다.
///
/// 입력 판정은 이미 있는 `TouchInputProvider`(패드 영역·데드존·정규화)가 전담하고,
/// 이 컴포넌트는 **그 상태를 그림으로 보여주기만** 한다(로직 이중화 금지).
///
/// 힘민지 참조: `Assets/Script/UI/JoyStick/UIJoystick.cs` 는 참조 0건의 사장 코드라
/// 코드는 가져오지 않고 **규약만** 따랐다 —
/// · 핸들 이동 반경 클램프 `Vector2.ClampMagnitude(v, radius)` (UIJoystick.cs:225)
/// · 데드존 이내는 0 처리 (UIJoystick.cs:220~222)
/// · 뗄 때 중심 복귀
/// 스프라이트는 힘민지 `Assets/ThirdParty/Joystick Pack/Sprites` 에서 복사해 재활용한다.
///
public class VirtualPadView : MonoBehaviour
{
[Header("참조")]
[Tooltip("비우면 씬에서 활성 PlayerController 를 찾는다")]
[SerializeField] private PlayerController player;
[SerializeField] private RectTransform background;
[SerializeField] private RectTransform handle;
[Tooltip("비우면 부모 Canvas 를 자동으로 찾는다")]
[SerializeField] private Canvas canvas;
[Header("표시 옵션 (임시값 · 직렬화 노출)")]
[Tooltip("누르지 않은 동안에도 패드 영역 중앙에 흐리게 표시한다")]
[SerializeField] private bool showIdleHint = true;
[Tooltip("대기 상태 투명도 · 임시 0.25")]
[Range(0f, 1f)][SerializeField] private float idleAlpha = 0.25f;
[Tooltip("누른 상태 투명도 · 임시 0.85")]
[Range(0f, 1f)][SerializeField] private float activeAlpha = 0.85f;
[Tooltip("투명도 전환 속도(초당) · 임시 8")]
[SerializeField] private float alphaLerpSpeed = 8f;
[Tooltip("배경 지름 = 패드 반경 × 이 배수 · 임시 2.0")]
[SerializeField] private float backgroundDiameterScale = 2.0f;
[Tooltip("핸들 지름 = 패드 반경 × 이 배수 · 임시 0.9")]
[SerializeField] private float handleDiameterScale = 0.9f;
private RectTransform _canvasRect;
private RectTransform _selfRect; // 좌표 변환 기준 — SafeArea 안에 놓여도 어긋나지 않게 자기 rect 를 쓴다
private CanvasGroup _group;
private float _alpha;
private bool _sizedOnce;
private void Awake()
{
if (canvas == null) canvas = GetComponentInParent