XR플밍 - (주말작업) 네트워크 프로젝트 Round5 9.1일차 (8/2)

이형원·2025년 8월 2일
0

XR플밍

목록 보기
153/215

1. 금일 한 업무 정리


  • 맵 생성 로직 및 UI 전체적으로 수정
  • 충돌 문제가 발생하여 핫픽스 진행

맵 생성 로직 및 전체적은 사이클은 다음과 같이 진행된다.

  1. 게임 시작 후 게임 씬으로 이동한다.
  2. 게임씬에서 카드 선택 UI가 가장 먼저 출력된다.
    2.1 카드 선택 UI가 출력되는 동안 모든 맵이 로딩되며, 라운드1 맵만 활성화된 상태로 로딩된다.
  3. 카드 선택이 완료되었을 때 첫 번째 맵이 카메라 오른쪽에서 왼쪽으로 이동하여 로딩된다
  4. 게임의 진행, 승패와 함께 UI가 로딩된다.
  5. 한 라운드의 승리자가 결정되었을 때, 이동하는 맵을 가리는 패널이 이동한다. 그리고 해당 UI가 다시 원래 위치로 이동하는 타이밍에 카드 선택 UI가 출력된다.
  6. 이와 같은 과정을 반복하여 최종 게임 우승자가 결정되고 나면, 게임 재시작 UI가 출력된다.

2. 문제의 발생과 해결 과정

2.1 갑작스럽게 발생한 충돌과 핫픽스

  • 디스코드 내용 중


조금은 심각한 문제가 발생했다. 어제자 작업에서 카드 선택 애니메이션 개발 과정에서 다른 사람의 코드를 복사한 다음 네임스페이스를 둘러서 코드를 약간만 수정해서 사용했다. 분명 이렇게 하면 이론상 문제가 없어야 하는데, 병합에서 충돌이 발생했다.

해당 문제를 확인하기 위해서 뭐가 원인인지 찾아봤는데, 분명 복사한 코드에 네임스페이스를 붙여서 작업을 했었는데 이걸 유니티 에디터 쪽에서 잘못 판단한 건지 원본 파일에 네임스페이스가 씌워지고 내가 수정한 코드로 되어 있는 것이 확인됐다.

그래서 이 문제를 어떻게 할까 해당 담당자와 확인해보고, 결론적으로 아래와 같이 처리하기로 했다.

우선은 이와 같이 처리하기는 했지만, 담당자가 자리를 비운 탓에 현상황에서 제대로 병합이 될지는 의문이다.

이런 다소 예상치 못한 충돌 상황에 대해 팀장님은 해당 문제가 재발하지 않도록 룰을 추가했고, 이런 방식으로 처리할 거라는 설명도 더했다.

작업 중인 남의 코드를 이용하거나 수정해서 작업해야 하는 경우, 해당 사람의 브렌치에서 새로 브렌치를 파서 작업을 한 후 합치는 방식으로 한다. 실제 현업에서는 이렇게 한다고 한다.

이 부분은 협업 과정에서 심히 고민해 보고 조심해야 할 부분이란 걸 알게 되었다.

2.2 맵 로딩 방식 로직 수정 및 UI 수정

특히나 쉽게 해결되지 않았던 부분을 위주로 얘기해보고자 한다.

맵 로딩 방식과 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 되는 상황이었기 때문에 찾아오는 방식으로 취함)

3. 개선점 및 과제

3.1 맵 로딩 방식 로직 & UI 부분 리팩토링

3.2 문서화 작업

3.3 각종 구현 내용의 네트워크 동기화

3.4 신맵 디자인

profile
게임 만들러 코딩 공부중

0개의 댓글