[내일배움캠프] Unity 숙련 주차 팀 프로젝트 - 완(完) 및 회고

이민호·2025년 6월 2일
0

1. 프로젝트 명

프로젝트의 이름은 Escape from the Laboratory이다. 평소에 유X브에서 즐겨봤던 Escape the Backrooms이라는 게임의 이름을 오마주하여 지었고, 실제 게임도 비슷하게 진행된다.

2. 프로젝트 기획

3D 퍼즐 게임이라는 주제로 결정하고 난 후 잠시 휴식 신간을 갖을 겸 프로젝트에 사용할 유니티 에셋을 찾아보았고 팀원들이 올린 에셋 중 SF 느낌의 에셋으로 결정되고 세부적인 회의를 진행하였다.

게임의 주제는 에셋에 맞춰 연구실의 로비에서 깨어난 주인공이 각종 장애물이 있는 실험실에서 퍼즐을 풀며 연구실을 탈출하는 내용으로 결정했다.

와이어 프레임:

전반적인 느낌:

클리어 시:

컨셉도 정했으니 다음으로는 가장 중요한 필요한 기능들을 의견을 모아 정리했다.

1. 플레이어 시스템

  • 플레이어는 WASD를 이용하여 이동을 할 수 있고 왼쪽 쉬프트와 스페이스바로 각각 대쉬(달리기) 및 점프를 할 수 있다.
  • 마우스를 이용하여 시점을 이동할 수 있다.
  • 마우스의 좌클릭으로 상호작용 가능한 오브젝트들과 상호작용(예: 아이템 들기)을 할 수 있고, 우클릭으로 다양한 오브젝트들의 설명 UI를 볼 수 있다.
  • 플레이어는 체력과 스태미나가 존재한다. 체력이 0이되면 게임이 끝나고, 스태미나가 0이되면 대쉬를 사용할 수 없다.

2. 아이템 및 핵심 기믹 시스템

  • 프로젝트의 핵심이 되는 아이템인 비콘과 키를 구현한다.
  • 비콘과 키는 한 쌍으로 이루어져 있으며 키를 알맞은 비콘 위에 올려 놓으면 잠겨 있던 문이 열린다.

3. 스테이지 디자인

  • 게임의 맵을 구현한다. 맵은 크게 스폰지점인 로비, 퍼즐을 푸는 핵심 지역인 스테이지, 모든 스테이지를 클리어하면 해제되는 엔딩 룸으로 나누어져 있다.
  • 스테이지에 맞게 에셋 또는 직접 만든 오브젝트(장애물, 키 등)을 배치한다.
  • 맵 내의 문 오브젝트의 열고 닫힘을 구현한다.

4. 퍼즐 시스템

  • 게임에 들어갈 퍼즐을 서치 및 구현한다.
  • Puzzle Manager 스크립트를 통하여 퍼즐을 관리하며 메인 씬과 연동하여 클리어 여부 등 상태를 일정하게 확인한다.

5. 게임 진행 시스템

  • 게임의 전체적인 진행 흐름을 관리하는 GAME MANAGER 스크립트 제작.
  • 다른 기능들을 연결시켜주며 게임이 정상적으로 구동하게 한다.

6. 게임 저장 및 불러오기

  • 플레이어의 게임 진행 상황을 JSON을 이용하여 저장하고, 게임을 종료했다 다시 실행해도 불러오기를 통하여 저장 시점부터 진행 가능하게 구현한다.

7. UI 및 사운드

  • 타이머 UI를 만들어 게임의 남은 시간을 알려주고 타이머 종료 시 게임오버 UI가 화면에 출력되도록 한다.
  • TAB키를 누르면 일시정지 및 메뉴 UI가 출력되고 세이브 및 로드의 버튼이 있다.
  • 엔딩 룸에 들어가면 클리어 UI를 출력한다.
  • 캐릭터의 움직임과 상태에 따른 사운드 출력 및 게임의 진행에 따른 경고 사운드 출력 등 상황에 맞는 사운드를 사용하여 플레이어의 몰입도를 높인다.

이렇게 회의한 기능을 팀원들과 나누었다.

3. 나의 파트

크게 스테이지의 기획 및 디자인, 퍼즐 시스템, 맵의 장애물을 담당하여 프로젝트를 진행했다.

3-1. 스테이지 기획

스테이지는 실험실의 컨셉에 맞는 독가스가 유출된 방으로 플레이어는 안전지대 이외의 곳에서는 일정 시간동안 데미지를 입는 곳으로 기획했다.

실제로 내가 만든 스테이지 맵 디자인:

3-2. 스테이지 장애물

이 스테이지는 세 개의 장애물이 존재한다. 스테이지 중앙 전체에 있으며 별 다른 행동을 하지 않아도 플레이어는 매 시간 데미지를 받는다. 또한 중앙에 독 풀장도 있으며 풀장으로 떨어지면 매 시간마다 더큰 피해를 입게된다. 풀장 안에는 플레이어의 이동 속도를 줄이는 슬로우 지역이 있으며 풀장 안에서 최대한 피해를 줄려고 플레이어를 방해한다.

스테이지 풍경:

이러한 장애물들은 EnvironmentalHazard라는 스크립트 하나로 관리하며 장애물 타입은 enum으로 관리하여 코드의 재활용성 및 확장성을 높혔다. 실제로 독 풀장은 나중에 추가된 장애물 타입으로 해당 장애물에 닿았을 때의 효과만 주는 코드만 추가하면 돼서 매우 편리했다.

Enum으로 관리한는 장애물 타입:

장애물과 닿았을 때에는 TriggerEnter메서드가 장애물의 효과를 부여하는 메서드만을 호출하고 효과 메서드에서 장애물의 타입에 따라 다른 효과를 부여했다. 장애물과 떨어졌을 때는 TriggerExit로 닿았을 때와 만찬가지로 만들었다.

장애물의 효과를 부여하는 메서드와 장애물을 떠났을 때 메서드:

3-3. 퍼즐 시스템

퍼즐은 간단하면서 난이도 꽤 있는 퍼즐 중 하나인 라이트 아웃 퍼즐을 참고하여 만들었다. 라이트 아웃 퍼즐은 5X5 형태로 이루어진 보드에 25개의 버튼(라이트)이 있고, 버트을 누르면 버튼을 중심으로 십자 모양으로 버튼이 현재 상태의 반대가 되며 모든 라이트를 끄는 것을 목표로 하는 퍼즐이다.

라이트 아웃 퍼즐:

출처: https://vidkidz.tistory.com/7732 해당 사이트 게임 캡쳐

팀에서는 퍼즐을 상호작용하면 퍼즐 씬을 로드하여 플레이어가 퍼즐을 할 수 있게 하자고 하였다. 그리고 나는 퍼즐 씬을 로드해오면 메인 씬은 어떻게 되지?라는 의문이 들었고 서치한 결과 다른 씬을 로드하면 원래의 씬은 종료되며 퍼즐을 클리어하고 다시 로드하더라도 기본적으로는 초기화 되어 로드가 된다는 것이였다. 이렇게 되면 플레이어는 절대로 게임을 클리어할 수 없는 문제가 생긴다.

이러한 문제를 해결하기 위해 다시 서치한 결과, SceneManager.LoadScene함수에는 로드할 씬을 적는 것 외에도 어떻게 로드할 것인가에 대해 옵션도 적을 수 있었다. SceneManager.LoadScene("PuzzleScene", LoadSceneMode.Additive); 나는 해당 코드를 사용하였는데 이는 현재 로드하고 있는 씬 위에 해당 씬을 중첩하여 로드해오는 방법이였다. 이로써 플레이어가 있는 씬은 종료도 안되며 플레이어는 퍼즐을 풀 때 동안도 데미지를 입게 되었다.

퍼즐은 위처럼 25개의 버튼이 이차원 배열에 저장되어 있으며 모든 버튼은 켜졌는가를 알 수 있는 isLightON 불 값이 존재하며 PuzzleManager는 이를 계속 확인하여 퍼즐을 클리어 했는지 판단하여 게임 매니저로 넘겨 준다.

해당 코드:

내가 만드 퍼즐:

퍼즐을 클리어 하면 퍼즐과 연결된 잠긴 문이 열리며 방안으로 들어 갈 수 있게 된다.

4. 프로젝트를 진행하며 느낀점

3D 게임 막연하게 만들기 어려울 것이라는 불안감과는 달리 팀원들과 협업과 집단 지성의 힘으로 정말 끝내주는 프로젝트를 만든 것 같았다. 시간이 좀 더 있었더라면 스테이지의 퀄리티와 맵을 확장하여 더욱 완성도 있게 만들 수 있었을 거라는 확신도 있어 부트캠프 초반과 달리 이런 실습에 재미와 자신감이 붙은 것 같았다. 이런 프로젝트를 진행할 수록 최종 프로젝트의 내용과 결과물에 대한 기대감이 커지며 내일의 나를 더욱 발전 시키자는 각오를 다졌다.

profile
게임 개발을 꿈꾸는 남자

0개의 댓글