맵 생성 로직 및 전체적은 사이클은 다음과 같이 진행된다.
조금은 심각한 문제가 발생했다. 어제자 작업에서 카드 선택 애니메이션 개발 과정에서 다른 사람의 코드를 복사한 다음 네임스페이스를 둘러서 코드를 약간만 수정해서 사용했다. 분명 이렇게 하면 이론상 문제가 없어야 하는데, 병합에서 충돌이 발생했다.
해당 문제를 확인하기 위해서 뭐가 원인인지 찾아봤는데, 분명 복사한 코드에 네임스페이스를 붙여서 작업을 했었는데 이걸 유니티 에디터 쪽에서 잘못 판단한 건지 원본 파일에 네임스페이스가 씌워지고 내가 수정한 코드로 되어 있는 것이 확인됐다.
그래서 이 문제를 어떻게 할까 해당 담당자와 확인해보고, 결론적으로 아래와 같이 처리하기로 했다.
우선은 이와 같이 처리하기는 했지만, 담당자가 자리를 비운 탓에 현상황에서 제대로 병합이 될지는 의문이다.
이런 다소 예상치 못한 충돌 상황에 대해 팀장님은 해당 문제가 재발하지 않도록 룰을 추가했고, 이런 방식으로 처리할 거라는 설명도 더했다.
작업 중인 남의 코드를 이용하거나 수정해서 작업해야 하는 경우, 해당 사람의 브렌치에서 새로 브렌치를 파서 작업을 한 후 합치는 방식으로 한다. 실제 현업에서는 이렇게 한다고 한다.
이 부분은 협업 과정에서 심히 고민해 보고 조심해야 할 부분이란 걸 알게 되었다.
특히나 쉽게 해결되지 않았던 부분을 위주로 얘기해보고자 한다.
맵 로딩 방식과 GetComponentsInChildren 문제
맵은 이와 같은 방식으로 로딩된다. 기존에는 씬을 왔다갔다 하면서 초기화되는 상황을 상정했기 때문에 3개의 맵만 로딩했지만, 이제는 이와 같이 9개의 맵을 만들어놓고, 각 라운드마다 맵을 활성화하는 방식을 사용한다.
다만 이와 같이 처리했을 때 문제가 발생했다.
Maps에는 GetComponentsInChildren으로 각 맵에 붙어 있는 맵 이동 기능을 실행하는 로직이 있다. 하지만 이와 같이 Maps 바로 아래에 있는 게 맵이 아닌 Round 1, 2, 3 이 붙어있다 보니, 해당 컴포넌트를 못 가져오는 현상이 있다는 걸 알게 된 것이다.
이걸 해결하기 위해서 Rounds[] 라는 변수를 만들고, 그 오브젝트 아래의 컴포넌트를 직접 가져오는 방식으로 취했다.
IEnumerator MovementCoroutine()
{
WaitForSeconds delay = new WaitForSeconds(mapChangeDelay);
MapDynamicMovement[] movements = rounds[TestIngameManager.Instance.CurrentGameRound].GetComponentsInChildren<MapDynamicMovement>();
Debug.Log(movements);
for (int i = 0; i < movements.Length; i++)
{
if (movements[i] != null)
{
movements[i].DynamicMove();
yield return delay;
}
}
moveCoroutine = null;
}
이는 부모 오브젝트를 찾을 때에도 동일하게 작용하며, 가능하다면 직접 참조하는 방식으로 하는 것이 좋아 보인다.
(다만 위와 같의 맵의 상황에서는 해당 오브젝트가 Instantiate 되는 상황이었기 때문에 찾아오는 방식으로 취함)