내일배움캠프 83일차 TIL + 버그 잡기 + 개선 사항
작업 내용
지난 주말동안 유저 테스트를 열어서 다양한 유저들이 피드백을 해주었다.
버그 수정
우선 버그의 문제는 다행히 큰 문제는 없었고 사소한 문제가 몇가지 있었다.
예를 들어 유닛 몇가지가 프리팹 수정하다가 미니맵에서 보기 위해 달아놓은 초록 원이 비활성화되어 미니맵에서 안보이는 오류, 유닛 홀드 클릭시 버튼에 노란색 선택 표시가 버튼을 눌러서 홀드 할 때 처럼 안뜨는 오류가 있었는데 당연히 간단한 문제라 고치기 쉬웠다.
또 스테이지 클리어시 뜨는 메달을 단순히 업데이트만 되게 해놓아서 최고기록이 아닌 최근 기록이 나오는 문제도 단순히 현재 저장 데이터랑 비교만 하면 됐기에 금방 고쳤다.
개선사항
버그보다는 개선해달라는 요청이 많았다.
우선 유닛 레벨이 의미없으니 빼야했다. 처음부터 별 생각 없이 넣었던 부분이라 문제없었다.
홀드한 유닛이 밀리는게 싫다는 요청도 있었다. 홀드하면 그자리에서 움직이지만 않는것이지 외부 충돌에는 밀리게 해뒀는데, 단순히 기존에 홀드하면 NavMesh agent를 isStopped해줬던걸 목적지를 현재 위치로 재설정해줬다.
근접유닛이 활약하기를 바란다고 하시길래 맵도 디자인을 바꾸고 디자인에 맞게 네브메쉬도 다 바꿔주었다.
단순히 타일맵 노가다였는데 언덕위에서 라인까지 다가갈 수 있는 자리들을 마련해줬다.
이전에는 언덕 이미지를 산 에셋 그대로 맞췄어서 생긴게 끝에는 못가게 생겼어서 거기에 맞췄는데 억지로 이미지를 좀 바꿨다.
그리고 적 유닛도 도감에 추가해줬다.
하면서 적 유닛으로 도감 화면을 바꾸면 오브젝트풀로 유닛 목록 버튼을 불러와서 내용 text만 바꿔주게했다.
private void CreateUnitList<T>(List<Dict<T>> units, System.Func<int, string> getName, System.Func<int, string> getDescription)
{
foreach (var unit in units)
{
GameObject gameObject = dictionaryContentPool.SpawnFromPool();
dictionaryContents.Add(gameObject.GetComponent<DictionaryUnit>());
gameObject.transform.SetParent(parentContent, false);
DictionaryUnit dict = gameObject.GetComponent<DictionaryUnit>();
dict.Icon.sprite = unit.Value as Sprite;
dict.UnitName.SetText(getName(unit.Key));
dict.UnitDescription.SetText(getDescription(unit.Key));
dict.UnitID = unit.Key;
// 유저 유닛일 경우 잠금 상태 처리
if (isUserUnit && !DataManager.Instance.UserUnitIDs.Contains(unit.Key))
{
dict.Lock();
}
else
{
dict.UnLock();
}
gameObject.SetActive(true);
}
}
람다식을 자주 써보지는 않았는데 이렇게 써보게 되어 좋았다.
리스트를 넣어주고, 람다 함수 2가지를 넣어줘 유닛의 이름과 설명을 불러와 기존에 방식대로 유닛 도감 버튼을 생성해준다.
CreateUnitList(userUnits,
id => DataManager.Instance.UnitSO[id].CharacterName,
id => DataManager.Instance.UnitSO[id].CharacterDescription);
근데 역시 직관적이지는 못해서 써보기는 써봤는데 이렇게 할 바에 그냥 이름이랑 설명 가져오는 작은 함수를 만드는게 나은것 아닌가 싶다.
이외에도 홀드시 유닛들 머리위에 아이콘을 추가해 홀드된 유닛을 구분하기 쉽게 해줬다.
머리위에 칼 표시가 뜨면 홀드된 상태인 것이다.
방법이야 간단하게 유닛에 아이콘 하나 자식 오브젝트로 달아줬다.
유닛 해금 확인 창도 중간에 추가하여 유닛 해금시 잠깐 해금할지 말지 최종 확인을 해야한다.
이외에도 게임 재시작시 오브젝트풀에 오브젝트드들이 비활성화가 잘 안되었는데, 기존에 오브젝트풀의 모두 비활성화 함수가 사실상 작동을 안하는 함수였다.
왜냐하면 오브젝트풀에서 오브젝트들을 빼와서 활용하고 되돌려주는데, 빼와서 활용하다보니 오브젝트풀에서 풀 내의 오브젝트들을 비활성화 해봐야 원래 비활성화 되어있는 동작 안하는 오브젝트들이었다. 그래서 아예 오브젝트풀 내에 활성화된 오브젝트를 따로 저장하는 리스트를 추가해서 이걸로 활성화된 오브젝트들을 모두 비활성화 시키게 해줬다.
public void DisableAllObjects()
{
// 모든 태그 순회
foreach (var entry in temporaryPool)
{
T tag = entry.Key;
List<GameObject> poolList = entry.Value;
// 비활성화할 오브젝트를 수집할 임시 리스트
List<GameObject> objectsToDisable = new List<GameObject>();
foreach (GameObject obj in poolList)
{
obj.SetActive(false);
poolDictionary[tag].Enqueue(obj);
objectsToDisable.Add(obj);
}
// foreach 루프가 끝난 후에 삭제
foreach (GameObject obj in objectsToDisable)
{
temporaryPool[tag].Remove(obj);
}
}
}
비활성화 함수는 내가 아니라 팀원이 짠거였기에 눈치를 못챘는데, 앞으로 오브젝트풀을 짤 때 이런 부분은 조심해야겠다.
마무리
오늘 패치를 다 하고 오늘 다시 출시해서 내일까지 하루 더 유저들에게 테스트 요청을 하려했는데, 아쉽게도 오늘 안에 모두 패치하기에는 오류가 좀 많았다. 내일 아침에 다시 올려서 테스트를 하루만 더 받을 예정이다. 유저들 반응이 좋았는데 패치 후 게임도 더 사랑해주면 좋겠다.