131 lines
4.2 KiB
C#
131 lines
4.2 KiB
C#
#nullable enable
|
|
using System;
|
|
using TMPro;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
using UVC.Extention;
|
|
|
|
namespace UVC.UI.Tab
|
|
{
|
|
/// <summary>
|
|
/// 단일 탭 버튼의 UI를 관리하는 컴포넌트입니다.
|
|
/// </summary>
|
|
public class TabButtonView : MonoBehaviour
|
|
{
|
|
[Tooltip("탭 버튼 컴포넌트")]
|
|
[SerializeField] private Button? button;
|
|
|
|
[Tooltip("탭 이름을 표시할 Text 컴포넌트")]
|
|
[SerializeField] private TextMeshProUGUI? tabText;
|
|
|
|
[Tooltip("탭 아이콘을 표시할 Image 컴포넌트")]
|
|
[SerializeField] private Image? tabIcon;
|
|
|
|
[Tooltip("탭 배경 이미지 컴포넌트")]
|
|
[SerializeField] private Image? background;
|
|
|
|
[Tooltip("탭이 활성화되었을 때의 배경 색상")]
|
|
[SerializeField] private Color activeColor = Color.white;
|
|
|
|
[Tooltip("탭이 비활성화되었을 때의 배경 색상")]
|
|
[SerializeField] private Color inactiveColor = Color.gray;
|
|
|
|
[Tooltip("탭이 활성화되었을 때의 배경 색상")]
|
|
[SerializeField] private Color activeTextColor = Color.black;
|
|
|
|
[Tooltip("탭이 비활성화되었을 때의 배경 색상")]
|
|
[SerializeField] private Color inactiveTextColor = Color.white;
|
|
|
|
private int _tabIndex;
|
|
private Action<int>? _onTabSelected;
|
|
|
|
private void Awake()
|
|
{
|
|
// Button 컴포넌트가 할당되지 않은 경우 자동으로 찾기
|
|
if (button == null)
|
|
button = GetComponent<Button>();
|
|
|
|
// 버튼 클릭 이벤트 연결
|
|
if (button != null)
|
|
{
|
|
button.onClick.AddListener(OnButtonClick);
|
|
button.transition = Selectable.Transition.None; // 버튼의 전환 효과를 비활성화
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 탭 버튼을 초기화합니다.
|
|
/// </summary>
|
|
/// <param name="index">탭 인덱스</param>
|
|
/// <param name="tabName">탭 이름</param>
|
|
/// <param name="iconpath">탭 아이콘 경로</param>
|
|
/// <param name="onSelectedCallback">탭 선택 시 호출될 콜백</param>
|
|
public void Setup(int index, string tabName, string iconpath, Action<int> onSelectedCallback)
|
|
{
|
|
_tabIndex = index;
|
|
_onTabSelected = onSelectedCallback;
|
|
|
|
// 탭 이름 설정
|
|
if (tabText != null)
|
|
tabText.text = tabName;
|
|
|
|
// 탭 아이콘 설정
|
|
if (tabIcon != null)
|
|
{
|
|
if (!iconpath.IsNullOrEmpty())
|
|
{
|
|
tabIcon.sprite = iconpath.LoadResource<Sprite>();
|
|
tabIcon.gameObject.SetActive(true);
|
|
}
|
|
else
|
|
{
|
|
tabIcon.gameObject.SetActive(false);
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 탭 버튼의 활성화 상태를 변경합니다.
|
|
/// </summary>
|
|
/// <param name="isActive">활성화 여부</param>
|
|
public void SetActive(bool isActive)
|
|
{
|
|
// 배경 색상 변경
|
|
if (background != null)
|
|
{
|
|
background.color = isActive ? activeColor : inactiveColor;
|
|
}
|
|
else if(button != null)
|
|
{
|
|
button.image.color = isActive ? button.colors.pressedColor : button.colors.normalColor;
|
|
}
|
|
|
|
if(tabIcon != null)
|
|
{
|
|
tabIcon.color = isActive ? activeTextColor : inactiveTextColor;
|
|
}
|
|
|
|
// 텍스트 스타일 변경
|
|
if (tabText != null) {
|
|
tabText.fontStyle = isActive ? FontStyles.Bold : FontStyles.Normal;
|
|
tabText.color = isActive ? activeTextColor : inactiveTextColor;
|
|
}
|
|
}
|
|
|
|
// 버튼 클릭 이벤트 처리
|
|
private void OnButtonClick()
|
|
{
|
|
_onTabSelected?.Invoke(_tabIndex);
|
|
}
|
|
|
|
// 게임 오브젝트가 제거될 때 이벤트 리스너 제거
|
|
private void OnDestroy()
|
|
{
|
|
_onTabSelected = null;
|
|
if (button != null)
|
|
button.onClick.RemoveListener(OnButtonClick);
|
|
}
|
|
|
|
}
|
|
}
|