2026-06-19 UI, UI로직
This commit is contained in:
177
Assets/My project/RoomSelect/Scripts/RoomButtonUI.cs
Normal file
177
Assets/My project/RoomSelect/Scripts/RoomButtonUI.cs
Normal file
@@ -0,0 +1,177 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user