어제 경험치 드랍을 만들고 나서 오늘은 플레이어가 먹으면 경험치가 오르게 했다.
뱀서에서는 레벨업을 하면 위의 아이템 선택 창이 뜨는데, 우리 게임도 마찬가지다.
이미 캐릭터가 레벨업을 하는 기능과 아이템 선택 창은 다른 분들이 구현해주셨기 때문에 나는 레벨업을 했을 때, 아이템 선택 창이 띄워지도록 연결해주기만 하면 됐다.
현재 우리 프로젝트는 스테이지 클리어 시, 맵에 남아있는 모든 경험치가 흡수되도록 만들어져있다.
이러면 한 번에 폭업을 하게 되는데, 이 경우엔 아이템 선택 창이 레벨업을 한 횟수만큼 연속적으로 띄워져야했다.
Player.cs
private void Update()
{
if (exp > level * 5)
{
GameManager.Instance.uiManager.LvFlag++;
level++;
exp -= level * 5;
Debug.Log($"player level up, LvFlag: {GameManager.Instance.uiManager.LvFlag}");
}
}
UIManager
에 LvFlag
라는 변수를 만들어서, 레벨이 몇 올랐는지 알 수 있도록 했다.
UIManager.cs
private void Update()
{
if (currentStage == 0)
{
...
}
else
{
ShowStageData();
if (LvFlag > 0 && !itemSelectWindow.activeSelf)
{
Debug.Log($"open select window, LvFlag: {LvFlag}");
SelectItem();
}
...
}
UIManager.cs
private void ChoiceItem(Define.EItemType item)
{
Time.timeScale = 1;
LvFlag--;
Debug.Log($"select item, LvFlag: {LvFlag}");
itemSelectWindow.SetActive(false);
//아이템 장착
...
}
생각했던 대로 작동하는 것 같다!
다른 분이 작업하신 코드를 읽고 디버깅 해보면서 코드의 흐름을 이해하고, 버그를 찾은 것은 좋았다고 생각한다. UIManager에서 아이템 선택 창이 열리면, 선택 가능한 아이템들을 지정하고 버튼에 이벤트를 등록하는데, 이 과정에서 창이 열릴 때마다 이벤트가 누적해서 중복 등록되는 현상을 찾고 고쳤다.
// 창이 열릴 때마다 이벤트가 등록돼서, 기존에 등록된 리스너 Remove하도록 변경
selectButton.onClick.RemoveAllListeners();
selectButton.onClick.AddListener(() => ChoiceItem(upitems[index]));
하지만, 다른 분의 코드를 건드린 만큼 병합할 때 더 신중히 병합했어야했는데, 나의 변경사항과 팀원분의 변경사항을 모두 반영하려다보니 결과적으로 중복되는 코드가 발견됐다.
itemSelectWindow.SetActive(false);
curUI.transform.Find("SelectItem").gameObject.SetActive(false);
위의 둘은 같은 GameObject를 disable하고 있다.
다행히 큰 버그가 생길 만한 이슈는 아니지만, 다음부터는 다른 분과 동시에 같은 클래스를 변경했을 때 더 신중하게 병합 충돌 처리를 할 수 있어야겠다.