178 lines
4.8 KiB
C#
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;
|
|
}
|
|
}
|