본문 바로가기

Unity 2D 미니 프로젝트 - 팀원 카드 매칭 게임

@코야딩구2025. 7. 7. 10:00

1. 프로젝트 개요

- 게임 장르: 모바일 퍼즐 / 카드 매칭 게임

- 플랫폼: 모바일

- 사용 엔진: Unity

- 개발 인원: 5명(류동균, 김호경, 강인구, 김성민, 이원진)

- 개발 기간: 4일

- 개발 목표: 협업 능력 강화 및 Unity 2D 기능 복습

- 기존에 개인 프로젝트로 만들었던 '르탄이 카드 뒤집기' 게임을 팀 단위로 다시 구현한 프로젝트다.

- 이번 프로젝트에서는 추가 기능보다는 기존 기능의 재현과 GitHub를 활용한 협업 경험 축적에 초점을 맞췄다.

- 내 담당 역할은 다음과 같다:

  1) 카드 구현 및 카드 배치

  2) 전체 코드 구조 정리 및 팀원 코드 병합 관리

2. 프로젝트 주요 기능

- 이번 프로젝트에서는 기존 게임의 구조를 유지하면서도 스테이지 구성, 카드 배치 연출, 콤보 및 업적 시스템 등을 추가하여 완성도를 높였다.

2-1. 스테이지 시스템

- 스테이지를 여러 개로 구성하였으며, 각 스테이지를 클리어해야 다음 스테이지가 열리는 방식으로 설계하였다.

- 스테이지를 모두 클리어하면, 도전 가능한 스테이지를 다시 선택하거나, 엔딩 크레딧으로 넘어갈 수 있다.

2-2. 시간 기반 인터랙션

- 제한 시간이 줄어들수록 UI 색상과 BGM이 변경되도록 설정하여 긴장감을 조성했다.

2-3. 카드 배치 및 상호 작용

- 카드 배치는 총 4단계로 구성하여 자연스러운 연출을 구현했다.

  1) 준비

  2) 카드 펼치기

  3) 카드 날리기

  4) 배치 완료

- 삼각 함수와 보간을 사용하여 카드가 부드럽게 이동하고 회전하도록 설계했다.

 

Unity 2D 구현 - 카드 배치 연출 Ver.3

1. 게임 시작 시 카드 배치 연출- 게임이 시작되면, 카지노 딜러가 카드를 한 장씩 나눠주는 것처럼, 카드가 화면 아래에서 회전하며 하나씩 순서대로 날아가며 지정 위치에 배치된다.- 이때 각

gyro-code-game.tistory.com

- 클릭 시 카드는 뒤집히며, 짝이 맞지 않으면 다시 원래 상태로 돌아가는 애니메이션 효과도 적용했다.

2-4. 콤보 시스템

- 연속으로 짝을 맞출 경우 콤보가 누적되며, 한 번이라도 틀리면 콤보가 초기화된다.

- 이 기능을 통해 플레이어에게 도전 욕구를 유도했다.

2-5. 업적 시스템

- 스테이지 클리어 시간에 따라, 플레이어의 실력을 시각적으로 보여주는 업적 정보를 출력했다.

2-6. 엔딩 크레딧

- 스테이지를 클리어하면 영화 엔딩 크레딧처럼 팀원과 담당 역할이 소개되는 엔딩 씬이 출력된다.

- 간단하지만 팀 프로젝트의 마무리를 돋보이게 하는 연출이라 생각한다.

3. 시연 영상

4. 협업 과정에서 발생한 문제와 해결 과정

4-1. 문제 상황

- 팀원 대부분이 처음으로 Unity 및 코딩을 접한 분들이었기 때문에, 구조적인 설계 없이 각자 기존에 구현해본 기능부터 개발을 시작했다.

- 이후, 개별적으로 구현한 기능들을 한 번에 통합하는 과정에서 다양한 오류가 발생했다:

  1) 기능을 한 곳에 모두 몰아 구현하면서, 서로의 코드가 꼬이고 충돌 발생

  2) 반대로 지나치게 코드를 분리한 나머지, 불필요한 코드가 남아 정리되지 않고 기능 추적이 어려워짐

4-2. 해결 방법

- 씬 기반 구현이 필요한 경우, 각자 새로운 씬을 따로 만들어 개발하고 테스트하도록 했다.

- GitHub 브랜치를 활용하여 충돌을 최소화했으며, 작업 순서를 다음과 같이 구성했다:

  1) 각자의 브랜치에서 기능 개발

  2) 메인 브랜치의 최신 상태를 자신의 브랜치에 먼저 병합

  3) 이상이 없으면 자신의 브랜치를 메인 브랜치에 병합

- 코드 이해도 차이를 해소하기 위해, 코드 병합 시 팀원이 돌아가며 화면을 공유하고, 함께 코드를 합치는 과정을 가졌다.

  작업 속도는 느렸지만, 팀 전체가 코드 흐름을 함께 이해하고 성장하는 시간이 되었다.

- 기능 분리에 대해서는 이상적인 구조로 다시 설계하는 것이 맞았지만, 이번 기회를 통해 하나의 객체에 다양한 기능이 몰리면 어떤 문제가 생기는지 체험해보는 학습 기회로 삼았다.

  기존 구조를 완전히 바꾸기보다는, 상황에 맞게 수정하고 보완하는 방식을 선택했다.

- 다만, 테스트할 요소가 많고 설명하기 어려운 부분도 있어, 어떤 문제는 먼저 해결한 뒤, 그 과정을 정리해 팀원에게 설명하는 방식으로 진행했다.

- 대표적인 사례로는 GameManager 관련 문제가 있었다.

4-3. GameManager 문제

1. 최초 설계

- 각 씬마다 서로 다른 설정을 가진 GameManager 오브젝트가 존재했다.

- 따라서 싱글턴 패턴을 도입해, 씬 전환 시 기존 GameManager를 삭제하고, 새 씬의 GameManager로 교체하여, 하나의 인스턴스만 유지하도록 설계했다.

2. 발생한 문제

- GameManager 내부에 포함된 BGM기능이 씬 전환 시 함께 삭제되며, 배경음악이 끊기는 현상이 발생했다.
- 이는 기존의 GameManager가 삭제되며 오디오도 함께 사라졌기 때문이다.

3. 해결 방법

  1) 최초 생성된 GameManager를 DontDestroyOnLoad로 지정하여 씬 전환 시 유지되도록 설정

  2) 이후 씬마다 새로 생성된 GameManager의 설정 값 중, BGM과 무관한 설정 값만 기존 인스턴스에 복사

  3) 설정 값 복사 후, 새로 생성된 GameManager는 삭제하여 싱글턴 인스턴스를 일관되게 유지

4-4. 느낀 점

- 강의에서 왜 BGM기능을 따로 빼서 AudioManager를 만들었는지, 팀원 모두가 그 이유를 실감하게 되었다.

- 모든 수정이 완료된 후에는, 오히려 다시 설계해 기능을 분리하는 것이 설명하기에 더 쉽지 않았나라는 생각을 했다.

- 그럼에도 불구하고, 초보자와 경험자 모두가 서로에게 배우며 실제 협업에서 겪을 수 있는 문제를 직접 체험하고 해결해본 값진 시간이었다.

목차