using UnityEngine;
///
/// 탐지된 발판을 화면에 선으로 그린다.
///
/// 상태머신을 얹기 전에 좌표가 맞는지 눈으로 확인하기 위한 것이다. 물리부터
/// 붙이면 "캐릭터가 이상한 데 선다"가 좌표 문제인지 물리 문제인지 구분되지 않는다.
/// 검증이 끝나면 꺼두면 된다.
///
[RequireComponent(typeof(DesktopPlatformScanner))]
public class PlatformDebugOverlay : MonoBehaviour
{
[SerializeField] bool show = false;
[SerializeField] float lineThickness = 3f;
[SerializeField] Color windowColor = new Color(0.2f, 0.9f, 1f, 0.85f);
[SerializeField] Color floorColor = new Color(1f, 0.8f, 0.2f, 0.85f);
[Tooltip("각 발판에 창 제목을 함께 표시")]
[SerializeField] bool showTitles = false;
DesktopPlatformScanner scanner;
Texture2D pixel;
GUIStyle labelStyle;
void Awake()
{
scanner = GetComponent();
pixel = new Texture2D(1, 1);
pixel.SetPixel(0, 0, Color.white);
pixel.Apply();
}
void OnDestroy()
{
if (pixel != null) Destroy(pixel);
}
void OnGUI()
{
if (!show || scanner == null) return;
labelStyle ??= new GUIStyle(GUI.skin.label) { fontSize = 11 };
var platforms = scanner.Platforms;
for (int i = 0; i < platforms.Count; i++)
{
var p = platforms[i];
// OnGUI 는 좌상단 원점이라 Y 를 뒤집는다.
float guiY = Screen.height - p.Y;
GUI.color = p.IsFloor ? floorColor : windowColor;
GUI.DrawTexture(new Rect(p.XMin, guiY - lineThickness * 0.5f, p.Width, lineThickness), pixel);
// 구간 양끝을 세로 눈금으로 표시해 어디서 끊겼는지 보이게 한다.
GUI.DrawTexture(new Rect(p.XMin, guiY - 8f, 2f, 16f), pixel);
GUI.DrawTexture(new Rect(p.XMax - 2f, guiY - 8f, 2f, 16f), pixel);
if (showTitles)
{
GUI.color = Color.black;
GUI.Label(new Rect(p.XMin + 5f, guiY + 2f, 400f, 18f), p.Title, labelStyle);
GUI.color = p.IsFloor ? floorColor : windowColor;
GUI.Label(new Rect(p.XMin + 4f, guiY + 1f, 400f, 18f), p.Title, labelStyle);
}
}
GUI.color = Color.white;
GUI.Label(new Rect(14f, 190f, 500f, 20f), $"발판 {platforms.Count}개", labelStyle);
}
}