Files
WhaleAdventure_VR/Assets/My project/RoomSelect/Scripts/RoomButtonUI.cs
skrwns304@gmail.com b1e85a5b89 2026-06-19 UI, UI로직
2026-06-19 14:27:40 +09:00

178 lines
4.8 KiB
C#

using TMPro;
using UnityEngine;
using UnityEngine.UI;
[RequireComponent(typeof(Button))]
public class RoomButtonUI : MonoBehaviour
{
[Header("Data")]
[SerializeField] private RoomData roomData;
[Header("References")]
[SerializeField] private Button button;
[SerializeField] private Image backgroundImage;
[SerializeField] private Image roomIconImage;
[SerializeField] private TMP_Text roomNameText;
[SerializeField] private GameObject lockIcon;
[SerializeField] private GameObject clearIcon;
[Header("Sprites")]
[SerializeField] private Sprite normalSprite;
[SerializeField] private Sprite selectedSprite;
[SerializeField] private Sprite lockedSprite;
[SerializeField] private Sprite clearedSprite;
[Header("Colors When Sprite Is Missing")]
[SerializeField] private Color normalColor = new Color(0.05f, 0.55f, 0.65f, 0.85f);
[SerializeField] private Color selectedColor = new Color(0.75f, 1f, 1f, 0.95f);
[SerializeField] private Color lockedColor = new Color(0.15f, 0.18f, 0.22f, 0.75f);
[SerializeField] private Color clearedColor = new Color(0.2f, 0.8f, 0.65f, 0.9f);
private RoomSelectManager manager;
private RoomState currentState = RoomState.Unlocked;
private bool isSelected;
public RoomData RoomData => roomData;
public RoomState CurrentState => currentState;
private void Reset()
{
button = GetComponent<Button>();
backgroundImage = GetComponent<Image>();
}
private void Awake()
{
if (button == null)
{
button = GetComponent<Button>();
}
if (backgroundImage == null)
{
backgroundImage = GetComponent<Image>();
}
if (button != null)
{
button.onClick.AddListener(HandleClick);
}
}
private void OnDestroy()
{
if (button != null)
{
button.onClick.RemoveListener(HandleClick);
}
}
public void Setup(RoomData newRoomData, RoomSelectManager newManager)
{
roomData = newRoomData;
manager = newManager;
Refresh(currentState, isSelected);
}
public void SetManager(RoomSelectManager newManager)
{
manager = newManager;
}
public void Refresh(RoomState state, bool selected)
{
currentState = state;
isSelected = selected;
if (roomNameText != null)
{
roomNameText.text = roomData != null ? roomData.RoomName : "방 없음";
roomNameText.color = selected ? Color.black : Color.white;
}
if (roomIconImage != null)
{
bool hasIcon = roomData != null && roomData.RoomIcon != null;
roomIconImage.gameObject.SetActive(hasIcon);
if (hasIcon)
{
roomIconImage.sprite = roomData.RoomIcon;
}
}
if (lockIcon != null)
{
lockIcon.SetActive(state == RoomState.Locked);
}
if (clearIcon != null)
{
clearIcon.SetActive(state == RoomState.Cleared || state == RoomState.MemoryGot);
}
if (button != null)
{
// 잠긴 방도 클릭 가능하게 둔다. 클릭하면 오른쪽 설명창에서 잠긴 이유를 보여줄 수 있다.
button.interactable = true;
}
ApplyVisualState();
}
public void SetSelected(bool selected)
{
Refresh(currentState, selected);
}
private void HandleClick()
{
if (manager != null)
{
manager.SelectRoom(this);
}
else
{
Debug.LogWarning($"[{nameof(RoomButtonUI)}] Manager가 연결되지 않았습니다: {gameObject.name}");
}
}
private void ApplyVisualState()
{
if (backgroundImage == null)
{
return;
}
Sprite targetSprite = null;
Color targetColor = normalColor;
if (isSelected)
{
targetSprite = selectedSprite;
targetColor = selectedColor;
}
else
{
switch (currentState)
{
case RoomState.Locked:
targetSprite = lockedSprite;
targetColor = lockedColor;
break;
case RoomState.Cleared:
case RoomState.MemoryGot:
targetSprite = clearedSprite;
targetColor = clearedColor;
break;
default:
targetSprite = normalSprite;
targetColor = normalColor;
break;
}
}
backgroundImage.sprite = targetSprite;
backgroundImage.color = targetSprite != null ? Color.white : targetColor;
}
}