[포트폴리오 / Unity 3D] Dungeon Robber

⭐ Dungeon Robber

프로젝트 소개

Escape From Duckov + 리썰 컴퍼니, R.E.P.O 느낌의 3D 게임으로

맵을 돌아다니며 아이템을 파밍하고 적을 피해 탈출하는 게임입니다.

파밍한 아이템을 팔아 돈을 벌어 스탯을 업그레이드하며 더 많은 돈을 버는 것이 목표입니다.

 

인원: 4명

기간: 2025.10.27 ~ 2025.11.01

도구: Unity 3D, C#, Git, Notion

영상: https://www.youtube.com/watch?v=SvnF2pNJUOM

 

 

 

기획 전략


Notion을 이용해 그라운드 룰, 에셋 링크, 컨벤션, 구상, 태스크 등을 관리했습니다.

Notion을 이용한 협업 스케쥴 및 룰 관리의 일부분

 

 

● 깃 컨벤션을 정해 통일된 커밋 메세지 규칙 및 브랜치 전략을 선택하여 효율적이고 안정적인 깃 관리를 하였습니다.

    ○ Git Flow 전략을 택해 팀원마다 담당하는 브랜치를 만들어 관리 후 기능이 완성될 때 마다 머지를 하였습니다.

Notion에 정리된 깃 컨벤션 내용

 

 

 

● 코드 컨벤션을 정해 클래스, 변수, 필드 등의 명명 규칙과 코드 스타일을 통일하여 가독성과 협업 효율을 증가 시켰습니다.

   파일 계층 구조를 리소스 파일 형식마다 위치를 분리하여 효율적인 관리를 하였습니다.

 

 

 

 

담당한 기능


● 플레이어 컨트롤러

플레이어 움직임
플레이어의 상태를 나타내는 비트 플래그

 

● 애니메이션 블렌딩을 통해 플레이어의 모션을 부드럽게 처리

● 플레이어의 기능이 추후 확장되며 복잡해질 것을 염두해 partial 클래스를 이용해 기능 별로 스크립트 파일 분리

● Coroutine을 이용해 특정 시간 뒤에 수행해야 할 처리를 효율적으로 구현

● 델리게이트를 이용해 체력, 스태미나 등의 값이 변할 때 UI등의 변화에 유연하게 대처

● 비트 플래그를 이용해 일반 bool 변수를 사용할 때 보다 성능적인 면을 챙김

 

 

 

● 시야각

시야각

 

● 화면을 보여주는 메인 카메라 앞에 Panel을 하나 놓고 쉐이더를 통해 시야 범위만 보이도록 설정

● 시야 범위 내에 있는 적의 렌더러는 켜줌

● 시야 범위 밖에 있거나 안에 있어도 장애물을 끼고 있는 적의 렌더러를 꺼줌

 

● 스탯 클래스

 

스탯 타입
스탯 정보 클래스
Entity들이 가질 BaseStat 클래스의 일부 코드

 

● 플레이어와 적 클래스 모두 Entity 클래스를 상속받으며 게임 특성상 여러 종류의 스탯이 변하는 상황이

   많이 발생하기 때문에 모둔 Entity들이 갖는 BaseStat 클래스를 통해 스탯 관리

● 스탯은 EnumType과 Value의 한 쌍으로 이루어져 리스트 자료 구조에 저장됨

● 초기 스탯 수치인 BaseStats과 런타임중 동적으로 값이 변할 Stats 리스트를 통해 스탯 수치의 변동과 초기화를 수행

 

● 버프 시스템

 

Entity들이 가질 BuffManager 클래스

 

● 어떤 버프인지를 관리하는 BaseBuff와 Entity 클래스의 필드에서 직접 버프를 관리해줄 BuffManager로 구성됨

● 플레이어를 비롯한 Entity를 상속받는 객체들은 각자 가지고 있는 BuffManager의 ApplyBuff 메서드를 이용해 관리됨

 

 

OnActivate 메서드
OnTick 메서드
OnDeActivate 메서드

 

● 이동 속도를 낮추거나, 도트뎀을 가하는 등의 버프, 디버프를 효율적으로 관리하기 위해 따로 클래스를 빼서 구현

● BaseBuff 클래스는 버프 효과가 발동했을 때 각 시점에서 발생할 메서드를 가지고 있음

    ○ OnActive(): 버프가 처음 발동됐을 때 호출

    ○ OnTick(): 버프가 적용되는 동안 일정 Tick 시간마다 호출

    ○ OnDeActivate(): 버프가 끝날 때 호출

 

● 매니저 및 확장 시스템

 

Singleton 제네릭 클래스

 

 

● 전역적으로 하나의 객체만 존재해야하는 GameManager나 SoundManager등 다른 매니저 클래스를

   제네릭 Singleton을 상속받아 사용

 

Extension 확장 클래스

 

 

● 쿼터뷰 시야 특성상 마우스 좌표를 월드 벡터로 반환하는 기능이 필요하며, 이를 간편하게 사용하기 위해 확장 메서드로 구현

 

CoroutineManager 클래스

 

● 코루틴의 WaitForSeconds 등의 캐싱을 위한 CoroutineManager 클래스를 구현

 

 

 

 

 

보완해야 할 점


● 플레이어의 기능 구현에서 걷기, 달리기, 대쉬 등 여러 상태를 관리할 때 두 가지 이상의 상태가 동시에 들어올 수도 있어야해서

상태패턴이 아닌 bool 변수를 이용한 조건 체크 방식을 사용했습니다.

의도에 맞게 여러 상태가 중첩되어 기능이 동작하지만 상태의 개수가 많아질 수록 조건 체크를 위한 로직이 매우 복잡해지는

문제가 발생했습니다.

조건이나 상태가 복잡해질 경우 FSM이나 상태 패턴을 이용해 상태별로 로직을 분리하는 방식을 사용해야겠습니다.

 

● 시야각을 통한 적 렌더링 등의 기능은 이번 프로젝트에서 필수로 구현되어야 하는 기능이기에 쉐이더에 대한 지식이

부족한 상태로 제작하게 되었습니다.

추후 쉐이더와 그래픽스에 대한 지식을 쌓아 더 나은 FOV 시스템을 구현해볼 계획입니다.