본문 바로가기
  • 식초 한잔 할래..?
공부/게임 공부

쿠키런을 만들어 보자 with Unity

by 돼지피그푸곰 2025. 10. 30.

5명이서 쿠키런류 프로토타입을 만들어 보는 시간입니다.

 

필수로 구현해야 하는 기능은

  • 캐릭터의 자동 이동
  • 장애물과 아이템
  • 속도 증가와 난이도 조절
  • UI 시스템
  • 게임 오버와 재시작

이며, 이 외에 도전 기능으로 사운드, 타이틀, 스테이지, 튜툐리얼, 업적, 캐릭터 커스터마이징 등이 있습니다.

 

사람이 5명이기 때문에 역할 대략적인 기능들을 알아보고 역할분담을 진행했습니다.

 

 

팀원들은 각자

Player : 플레이어 관련 기능
GameManager : 중앙관리 및 리팩토링
Environment : 배경 및 환경 조성, 맵
Obstacle : 장애물 및 아이템

등을 나눠서 맡았고 저는 UI쪽 담당을 맡았습니다.

 

UI쪽을 맡은 이유는, 목적이 기획자이기 때문에 전체적인 구조 파악 및 다른 팀원들을 도와주기 좋은 위치라고 생각했지요.

 

이번 팀 프로젝트 목표는 기본적인 기능들 구현 및 그 외의 시간에 전체적인 협업 방식에 대해서 공부하거나, 실무에서 쓰이는 방식을 최대한 구현해 보고 개인적으로 궁금했던 기획 공부를 조금 더 다룰 예정입니다.

 

UIManager를 이용해서 플레이화면을 꾸밀거긴 하지만, 디자이너의 영역이 아닌 각 오브젝트들이 해당 자리에 위치해야 할 이유와 효과에 대해 좀 더 고찰을 해볼 생각이고, 디자인적으로 꾸미지 않는 대신이 AudioManager, EffectManager, CameraManager 등을 추가로 만들어 효과 발생시에 임팩트 주는 법을 알아보겠습니다.

 

팀원들끼리의 코드와 커밋 컨벤션은 아래와 같이 간단한 정도로만 준비했습니다.

Type 설명
feat 새로운 기능 추가
fix 버그 수정
docs 문서 수전
style 코드 포맷팅, 세미콜론 누락 등 기능적 변경이 없는 경우
refector 코드 리팩토링
test 테스트 코드, 리펙토링 테스트 코드 추가
chore 빌드 업무 수정, 패키지 매니저 수정

 

종류 규칙 예시
클래스 첫 글자 대문자 PlayerMove, GameManager
함수 첫 글자 대문자 StartGame(), Move()
변수 첫 글자 소문자 moveSpeed, playerHp
상수 모두 다문자 MAX_HP, PLAYER_LIMIT
파일이름 클래스 이름과 같게 PlayerMove.cs

 

필수 기능인 UIManager와 도전 기능인 AudioManager 구상해 보겠습니다.

 

일단 전체적인 규모는 GameManager 중심의 싱글톤 기반으로 간다고 가정을 하겠습니다. 팀원들이랑 거기까지는 얘기가 안돼서 확신은 못가지지만, 그만큼 다른 팀원들과는 의존성이 없는 독립적인 기능들로 만드려 합니다.

 

때문에 이벤트 기반과 싱글톤 방식의 하이브리드로 하려다가

 

GameManager와 같은 게층인 것을 만들기 싫어서, 싱글톤구조를 유지하면서 만들기 위해 

 

 

싱글톤 기준으로 가겠습니다. 처음에는 그냥 리스트화를 시키려고 했지만, 나중에 실무에서 어떤 방식을 주로 쓰는지 확인을 해보고 enum, Dictionary방식으로 구현하기로 마음 먹었습니다.

 

AudioManager에 넣어야 할 AudioSource들의 종류들을 미리 준비하고, 후에 설정에서 음량을 조절할 기능과 배경음을 교체할 것까지 생각을 하고, 아이템을 먹었을 때, Buff아이템을 먹었을 때 해당 Buff 아이템의 능력에 따라 재생되는 음악 등을 열거했습니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public enum SoundKey
{
    None,
 
    #region 플레이어
    SFX_PLAYER_JUMP,
    SFX_PLAYER_SLIDE,
    SFX_PLAYER_LAND,
    #endregion
 
    #region 아이템 및 충돌
    SFX_ITEM_COIN,
    SFX_ITEM_PICKUP,
    SFX_OBSTACLE_HIT,
    #endregion
 
    #region UI
    SFX_UI_UICLICK,
    SFX_UI_GAMEOVER,
    #endregion
 
    #region 배경 음악
    BGM_DEFAULT,
    BGM_STAGE1,
    BGM_RESULT,
    BGM_BUFF,
    #endregion
 
}
cs

 

 

내용은 적지만 크게 한다고 생각하고, 확장성을 매우 많이 한다고 가정하고 만들어 봤습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public static AudioManager instance { get; private set; }
 
[Header("사운드 키 목록")]
public SoundPair[] soundPairs;
 
private Dictionary<SoundKey, AudioSource> soundDic = new();
private AudioSource currentBGM;
 
private void Awake()
{
    if (instance == null)
    {
        instance = this;
    }
    else
    {
        Destroy(gameObject);
        return;
    }
    DontDestroyOnLoad(gameObject);
 
    foreach (var pair in soundPairs)
    {
        if (pair.source != null && !soundDic.ContainsKey(pair.key))
        {
            soundDic.Add(pair.key, pair.source);
        }
    }
}
cs

 

페어로 가져오는 key를 soundDic에 등록하였습니다.

Inspector에서는 key와 source를 연결해 주고, 코드만 해당 효과가 발생하는 부분에 하나씩만 추가해주면 됩니다.