🧠 오늘의 핵심 정리

  • 개인 과제(2D 인벤토리) 시작 : UI로 메인메뉴/스탯/인벤토리 화면 구성
  • AddListener로 버튼 이벤트를 코드에서 연결해봄 (openButton.onClick.AddListener(...))
  • UIManager 싱글톤으로 창 열고 닫는 흐름 정리 (메뉴 열면 다른 창은 닫히게)

 

 

📦 본캠프 40일차 : 개인 과제 <인벤토리> 첫날

오늘은 팀프로젝트가 아니라 개인 과제 하는 날이었습니다.

UI를 이용해서 캐릭터 스탯창 / 인벤토리 등을 구현해야 하는데… 솔직히 아직 시간이 남아 보여서 에셋 구경도 하고 좀 여유롭게 시작했거든요?

근데 인벤토리 생각하니까 갑자기 심장이 빨라지면서… “아… 나 슬슬 스피드 올려야겠다” 싶었습니다. 😂

 

 

🧷 AddListener로 버튼 연결해보기

버튼을 연결할 때 저는 보통 인스펙터에서 OnClick()에 함수 드래그해서 붙이는 방식만 써봤는데, 오늘은 처음으로 코드에서 Button + AddListener를 써봤습니다.

이렇게 해보니까 “UI가 많아져도 코드로 한 번에 정리할 수 있겠는데?” 싶은 느낌이라 개인적으로 되게 유용하게 느껴졌습니다.

UIInventory.cs : 인벤토리 열기/닫기 버튼을 AddListener로 연결

void Awake()
{
    openButton.onClick.AddListener(OpenClicked);
    closeButton.onClick.AddListener(CloseClicked);
}

private void OpenClicked()
{
UIManager.Instance.OpenInventory();
}
private void CloseClicked()
{
UIManager.Instance.CloseInventory();
}

스탯창(UIStatus)이랑 메인메뉴(UIMainMenu)도 동일한 방식으로 패턴을 맞췄습니다. (오늘은 첫날이라 “버튼 동작만 확실히”를 목표로 잡고 갔어요)

 

 

🪟 UIManager로 창 열고 닫기 흐름 정리

UI가 늘어나면 “지금 어떤 창이 열려있지?”가 슬슬 복잡해지기 시작하잖아요. 그래서 오늘은 UIManager에서 창 상태를 정리해두는 쪽으로 시작했습니다.

메인메뉴를 열면 나머지 창(스탯/인벤)은 닫히게, 스탯을 열면 인벤은 닫히게… 이런 식으로 규칙을 잡았어요.

UIManager.cs : 열기/닫기 규칙

void Start()
{
    uiMainMenu.SetActive(false);
    uiStatus.SetActive(false);
    uiInventory.SetActive(false);
}

public void OpenMainMenu()
{
uiMainMenu.SetActive(true);
uiStatus.SetActive(false);
uiInventory.SetActive(false);
}

public void OpenStatus()
{
uiStatus.SetActive(true);
uiInventory.SetActive(false);
}

public void OpenInventory()
{
uiInventory.SetActive(true);
uiStatus.SetActive(false);
}

그리고 싱글톤으로 UIManager.Instance를 만들어서 각 UI 스크립트가 매번 참조를 쉽게 하게 해놨습니다.

UIManager 싱글톤 초기화

public static UIManager Instance;

private void Awake()
{
if(Instance == null)
{
Instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}

 

 

🧑‍🎤 Character 데이터 틀도 먼저 준비

스탯창도 구현해야 하니까 캐릭터 데이터도 미리 틀을 잡아뒀습니다. 이름/레벨/골드/설명/직업 같은 기본 값들을 갖고 있고, 나중에 UI에서 출력하기 쉽게 프로퍼티로 열어둔 형태입니다.

Character.cs : 기본 데이터 + Init

public class Character : MonoBehaviour
{
    [SerializeField] private string _name;
    [SerializeField] private int _level;
    [SerializeField] private int _gold;
    [SerializeField] private string _description;
    [SerializeField] private string _job;

```
public void Init(string name, int level, int gold, string description, string job)
{
    _name = name;
    _level = level;
    _gold = gold;
    _description = description;
    _job = job;
}

public string Name => _name;
public int Level => _level;
public int Gold => _gold;
public string Description => _description;
public string Job => _job;
```

}

아직 첫날이라 진짜 “틀만 잡은 느낌”이긴 한데, 내일 UI 텍스트 연결하고 인벤토리 로직 들어가려면 이런 기본 골격이 먼저 있어야 마음이 편하더라고요.

 

 

📌 오늘의 회고

오늘은 개인 과제 첫날이라 UI 배치 + 버튼 연결 + 창 관리 흐름까지 정리하는 데 집중했습니다.

특히 AddListener는 이번에 처음 제대로 써봤는데, 인스펙터 의존도를 줄이고 코드로 제어할 수 있다는 점이 확실히 매력적이었습니다. 내일부터는… 진짜로… 인벤토리 들어가야겠죠? (벌써 무섭다)

 

 

🔜 내일 할 일

  • 스탯 UI 텍스트에 Character 정보 연결 (이름/레벨/골드/직업/설명)
  • 인벤토리 슬롯 구조 설계 (슬롯/아이템 데이터/표시 UI)
  • 인벤토리 열기/닫기 상태에서 입력/클릭 흐름 정리