강화 대상 선택 및 강화 패널 동기화 구조
1. 시스템 요구 사항
강화 시스템에서 가장 먼저 해결해야 했던 문제는 플레이어의 입력이 강화 UI로 어떻게 전달되어야 하는가였다.
인벤토리에서 아이템을 선택했을 때,아이템 이미지, 이름, 강화 단계, 필요 재화가 즉시 강화 패널에 반영되어야 했고,
이후 강화 규칙이나 UI 구조가 변경되더라도 입력 처리 방식 자체는 영향을 받지 않아야 했다.
즉, 단순한 UI 갱신이 아니라 '입력 → 시스템 → UI'로 이어지는 데이터 흐름 구조 설계가 필요했다.
2. 설계 목표
- 인벤토리 입력과 강화 UI 로직을 직접 연결하지 않을 것
- 선택 이벤트 발생 후 한 프레임 내 UI 반영
- UI 구성 변경 시 로직 수정 최소화
- 이후 비용 계산, 조건 판단 로직이 자연스럽게 확장될 수 있는 구조
3. 흐름도

입력 이벤트는 선택 상태만 변경하고, 실제 UI 반영과 로직 처리는 Update 루프에서 수행하도록 설계했다.
이를 통해 입력 시점과 시스템 처리 시점을 분리하고, 한 프레임 내에서 모든 강화 관련 정보가 일관되게 갱신되도록 흐름을 구성하였다.
4. 구현
4.1. 강화 대상 선택 상태 관리
강화 대상은 인벤토리 슬롯 클릭을 통해 전달된다.
강화 시스템은 아이템의 참조만 저장하고,강화에 필요한 정보는 이후 단계에서 분리하여 처리하도록 구성했다.
public void SelectItem(Item _item)
{
selectedItem = _item;
}SelectItem()은 인벤토리 슬롯 클릭 시 호출되는 함수이다.
인벤토리 슬롯에서 선택된 Item을 그대로 받아, UI는 직접 건드리지 않고 선택되었다는 상태만 저장한다.
입력 처리와 UI 갱신을 분리함으로써 입력 방식이 바뀌어도 강화 시스템 구조는 유지가 가능하다.
4.2. 강화 시스템 처리 흐름 제어
선택된 아이템이 존재할 경우, 강화 패널에서는 해당 아이템의 기본 정보만 표시한다.
void Update()
{
if (selectedItem != null)
{
UpdateSelectedItemUI();
UpdateRequirementsByType();
UpdateUpgradeState();
}
UpdateGradeImageVisibility();
}
초기에는 Update() 함수 내부에서 아이템 선택 여부 판단, UI 표시, 강화 비용 계산, 강화 가능 여부 판단을 하나의 흐름으로 처리했다.
이로 인해 UI 수정이 필요할 경우 강화 로직까지 함께 수정해야 했고, Update()가 과도한 책임을 가지게 되었다.
그래서 Update()는 선택된 아이템이 있는지만 확인하도록 역할을 줄이고, 실제 처리는 전용 함수로 분리했다.
UI 갱신, 비용 계산, 조건 판단은 각각의 전용 함수로 분리하였다.
이후 강화 시스템의 ‘입력 → 계산 → 판단 → 출력’ 흐름이 한 프레임 내에서 명확히 드러나게 되었다.
4.3. 강화 패널 UI 출력 동기화
private void UpdateSelectedItemUI()
{
icon.enabled = true;
icon.sprite = selectedItem.itemImage;
gradeImage.sprite = selectedItem.gradeSprite;
itemName.text = selectedItem.itemName;
}
아이콘, 강화 단계 이미지, 아이템 이름만 갱신한다.
강화 비용, 버튼 상태 등은 이 함수에서 다루지 않는다.
강화 규칙이나 조건 판단과 완전히 분리하여 UI 구성 변경 시 이 함수만 수정하면 되도록 하였다.
즉, 해당 함수는 UI 출력만 담당하며 강화 규칙이나 조건 판단 로직과는 분리되어 있다.
4.4. UI 상태 초기화
강화 대상이 없는 상태에서도 UI가 이전 상태를 유지하는 문제를 방지하기 위해 명확한 초기화 함수를 분리했다.
public void CancelSelection()
{
selectedItem = null;
icon.enabled = false;
icon.sprite = null;
gradeImage.enabled = false;
gradeImage.sprite = null;
itemName.text = "";
upgradeInfo.text = "";
crystalCount.text = "";
reqCoin.text = "";
BtnOrErr(false, false);
if (roulettePanel != null) roulettePanel.SetActive(false);
if (resultPanel != null) resultPanel.SetActive(false);
isRotating = false;
upgradeAttempted = false;
}
아이템 선택 해제 시 UI와 강화 상태를 모두 초기화한다.
룰렛, 결과 패널, 강화 상태 플래그까지 함께 리셋하여이전 강화 시도의 흔적이 남지 않도록 했다.
강화 시스템을 항상 동일한 시작 상태로 되돌릴 수 있게 구성했다.
5. 개발 의도
처음에는 인벤토리 슬롯 클릭 시 강화 UI를 직접 갱신하는 방식도 고려했다.
하지만 이 방식은 UI 구조가 변경될 경우 인벤토리 코드까지 수정해야 하고, 강화 로직이 늘어날수록 시스템 간 의존성이 빠르게 증가할 수 있다고 판단했다.
이러한 문제를 고려하여, 입력 처리와 시스템 반영을 분리한 구조를 선택했다.
이 구조를 통해 강화 비용 계산, 강화 가능 조건 판단, 이후 확률 시스템까지 Update 루프 안에서 자연스럽게 확장할 수 있는 기반을 마련할 수 있었다.
결과적으로 인벤토리와 강화 패널 간의 데이터 흐름이 명확해졌고, UI 변경에도 영향을 받지 않는 구조를 확보할 수 있었다.
또한 강화 시스템이 확장되더라도 기존 코드 수정 없이 기능을 추가할 수 있어 유지보수성과 확장성을 동시에 만족시킬 수 있었다.
