Files
EnglewoodLAB/Assets/Scripts/UVC/Util/CursorManager.cs

165 lines
4.5 KiB
C#

using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UVC.Core;
namespace UVC.Util
{
/// <summary>
/// 커서의 모양을 관리하는 싱글톤 클래스입니다.
/// </summary>
public class CursorManager : SingletonScene<CursorManager>
{
/// <summary>
/// 커서 유형별 텍스처와 핫스팟 정보를 담는 구조체입니다.
/// </summary>
[System.Serializable]
public struct CursorData
{
public CursorType type;
public Texture2D texture;
public Vector2 hotspot;
}
[Header("Cursor Settings")]
[Tooltip("각 커서 유형에 맞는 텍스처와 핫스팟을 설정합니다.")]
[SerializeField]
private List<CursorData> _cursorDataList = new List<CursorData>();
private Dictionary<CursorType, CursorData> _cursorDataDict;
/// <summary>
/// 초기화 시점에 리스트를 딕셔너리로 변환하여 빠른 조회를 가능하게 합니다.
/// </summary>
protected override void Init()
{
base.Init();
_cursorDataDict = _cursorDataList.ToDictionary(data => data.type);
}
/// <summary>
/// 지정된 유형으로 커서를 변경합니다.
/// </summary>
/// <param name="type">변경할 커서의 유형</param>
public void SetCursor(CursorType type)
{
if (type == CursorType.Default)
{
// 기본 커서로 설정
Cursor.SetCursor(null, Vector2.zero, CursorMode.Auto);
return;
}
if (_cursorDataDict.TryGetValue(type, out CursorData data))
{
if (data.texture != null)
{
Cursor.SetCursor(data.texture, data.hotspot, CursorMode.Auto);
}
else
{
Debug.LogWarning($"CursorManager: '{type}'에 대한 텍스처가 설정되지 않았습니다.");
}
}
else
{
Debug.LogWarning($"CursorManager: '{type}'에 대한 커서 데이터가 없습니다.");
}
}
/// <summary>
/// 커서를 시스템 기본값으로 되돌립니다.
/// </summary>
public void SetDefaultCursor()
{
SetCursor(CursorType.Default);
}
}
/// <summary>
/// CursorManager에서 사용할 커서 유형을 정의합니다.
/// </summary>
public enum CursorType
{
/// <summary>
/// 시스템 기본 커서
/// </summary>
Default,
/// <summary>
/// 수직 Column 조절 커서
/// </summary>
ResizeCol,
/// <summary>
/// 수평 Row 조절 커서
/// </summary>
ResizeRow,
/// <summary>
/// 수평 크기 조절 커서
/// </summary>
ResizeH,
/// <summary>
/// 수직 크기 조절 커서
/// </summary>
ResizeV,
/// <summary>
/// 좌상우하 대각선 크기 조절 커서
/// </summary>
ResizeTLBR,
/// <summary>
/// 우상좌하 대각선 크기 조절 커서
/// </summary>
ResizeTRBL,
/// <summary>
/// 이동 커서
/// </summary>
Move,
/// <summary>
/// 회전 bottom left 커서
/// </summary>
RotateBL,
/// <summary>
/// 회전 bottom right 커서
/// </summary>
RotateBR,
/// <summary>
/// 회전 top left 커서
/// </summary>
RotateTL,
/// <summary>
/// 회전 top right 커서
/// </summary>
RotateTR,
/// <summary>
/// 스케일 조절 커서
/// </summary>
Scale,
/// <summary>
/// 대기 상태 커서
/// </summary>
Wait,
/// <summary>
/// 검지 펼친 손 상태 커서
/// </summary>
HandPoint,
/// <summary>
/// 꽉쥔 손 상태 커서
/// </summary>
HandGrab,
/// <summary>
/// 손 모양 커서
/// </summary>
Hand,
/// <summary>
/// Zoom in 커서
/// </summary>
ZoomIn,
/// <summary>
/// Zoom out 커서
/// </summary>
ZoomOut,
Node,
Link,
Arc
}
}