반응형
원리는 간단하다.
탭은 각 UI를 할당하고 있고,
탭버튼을 누를때 다른 종속된 모든UI를 꺼지게하고
내가 누른 버튼에 할당된 UI만 띄우게 하면된다.
결국 각 오브젝트들이 껐다 켜지면서 전환되는 개념이다.
실제 윈도우폼에서의 탭 작동과도 원리가 유사하다
2개의 cs파일로 간단하게 끝낼 수 있다.
기능이 동작하는 방식을 이해하기 쉽도록 아주 간단한 코드로 작성했다
TabButton.cs - 탭 버튼
using UnityEngine.UI;
using UnityEngine;
[RequireComponent(typeof(Button))] //버튼이 없는 오브젝트라면 자동으로 추가
public class TabButton : MonoBehaviour
{
//해당 버튼 클릭시 열어 줄 UI를 인스펙터창에서 받아온다
[SerializeField] GameObject panel;
Image btnImage; //버튼 이미지
public GameObject GetPanel => panel;
TabController parent; //부모 컨트롤러
private void Start()
{
Button btn = GetComponent<Button>();
btn.onClick.AddListener(SwitchTab); //버튼 리스너에 함수를 할당
parent = transform.parent.GetComponent<TabController>(); //TabController컴포넌트를 보유한 부모를 가져옴
btnImage = btn.image; //버튼에 할당된 이미지를 가져옴
}
void SwitchTab() //버튼 클릭시 부모에게 내가 눌려졌음을 알림
{
parent.SwitchTab(this);
}
public void ChangeButtonImage(Sprite _sprite)
{
if (btnImage == null) return;
if (btnImage.sprite != _sprite) //현재 버튼 이미지의 스프라이트와 매개변수 _sprite가 다르다면
btnImage.sprite = _sprite; //_sprite로 버튼 이미지를 바꿈
}
}
TabController.cs - 탭들을 관리하는 관리자 역할
using UnityEngine;
public class TabController : MonoBehaviour
{
[SerializeField] Sprite btnNormal; //탭버튼이 정상일때
[SerializeField] Sprite btnSelect; //탭버튼이 눌러진 상태일때
TabButton[] tabs; //자식들인 탭버튼을 저장할 배열
// Start is called before the first frame update
void Start()
{
tabs = GetComponentsInChildren<TabButton>();
SwitchTab(tabs[0]); //첫번째 탭을 눌러준다
}
public void SwitchTab(TabButton _target)
{
for (int i = 0; i < tabs.Length; i++)
{
bool _isActiveTab = _target == tabs[i]; //tabs[i]가 눌려진 버튼인지 판단
tabs[i].GetPanel.SetActive(_isActiveTab); //모든 탭을 다 꺼준다
//삼항연산자로 버튼이 눌러졌을때와 일반적인상태일때를 판단해 바꾸어 준다
tabs[i].ChangeButtonImage(_isActiveTab? btnSelect : btnNormal);
}
}
}
두개의 스크립트를 만들고 하이어라키창을 아래와 같이 구성해준다(당연히 입맛대로 설정해주면 된다)
모든 탭버튼에 열리게할 패널을 하나씩 각각 넣어주면 버튼쪽은 준비 끝
버튼들의 부모가 되는 pTabs에
BtnNormal, BtnSelect 두개의 스프라이트를 채워넣자.
버튼이 일반적인 상태일때는 BtnNormal의 이미지가 보여질것이고
버튼이 눌려진 상태일때는 BtnSelect 의 이미지가 보여질것이다.
(난 대충 아무거나 넣었다.)
pPanels와 그 아래 panel0, panel1 자식들은 UI아무렇게 가져다 꾸몄다.
예시를 위해 바로 보이게끔 0에는 빨강 / 1에는 파랑의 이미지를 넣었다.
여러 UI에 탭버튼을 활용해야할때마다 언제든지 갖다 쓰면 될듯하다.
실제로 바로사용해도 무방하나, 프로젝트 상황에 맞게 입맛대로 변경하면 되지싶다.
퍼가고 맘대로 사용해도 되지만 출처는 꼭 밝히시길..
이해하는데 도움이 되셨다면 아래 하트 부탁함다.
반응형
'개발 & 강의 > Unity' 카테고리의 다른 글
[C# & 유니티] DateTime & TimeSpan ToString() 표기방법 (2) | 2024.02.15 |
---|---|
유니티(Unity C#) static / const 예제를 통해 간단하게 이해하기 (0) | 2024.01.19 |
[유니티]바로써먹자, Factory 패턴에 대한 소개 및 예제 (0) | 2023.09.26 |
[유니티UI] 레이아웃 크기에 맞춰 자동 크기 조절 ContentSizeFitter 예제 (0) | 2023.09.17 |
[유니티] float to ToString() 소수점 자리 표시 / 콤마(,)표시 (0) | 2020.12.31 |