게임 개발 포트폴리오 | Don’t Piss Me Off
내일배움캠프 1기 Unity 게임 개발 과정 트랙 수료생 최종 프로젝트 'Don’t Piss Me Off '를 소개합니다.
Feb 26, 2024
⚔️정체불명의 적들에게 집을 빼앗겼다?
💀적을 청소하고 집을 되찾으세요 !💀
🔎정체불명의 적들이 집을 점거했습니다!
힘들게 업무를 마치고 퇴근한 주인공, 그는 친구로부터 들린 소식에 맞서 싸움을 결심한다. 집 가는 길을 점거한 수상한 녀석들, 그들의 앞에 선 주인공은 예전 군인이었던 경험을 떠올리며 적을 섬멸하기로 마음먹는다.
📌 게임 특징
- 1인칭 슈팅 액션: 플레이어는 주인공으로 빙의하여 직접 적들과 맞서 싸우는 짜릿한 1인칭 슈팅 액션을 경험할 수 있습니다. 다양한 총기와 구르기, 슬로우모션 기능을 활용하여 전투의 고조를 느껴보세요.
- PvE 및 보스전: 다양한 종류의 적들이 당신을 향해 몰려옵니다. 각 구간에는 다양한 종류의 적들이 기다리며, 그들을 물리치면서 주인공의 본능적인 전투력을 경험할 수 있습니다.
- 다양한 무기 수집: 게임 내에서 다양한 종류의 총기를 획득하여 적들과의 전투에서 우위를 점할 수 있습니다. 효과적인 전략을 세우기 위해 다양한 무기를 적재적소에 사용하세요.
- 이벤트와 플레이 경험: 특정 구간에서는 과거에 오락실에서 봤던 특별한 게임 방식으로 게임 플레이를 더욱 흥미진진하게 만들 수 있습니다. 이벤트를 통해 인간의 반응속도를 테스트하고 플레이어의 진정한 전투 능력을 확인하세요.
슈팅 액션의 시작, 화가 난 주인공의 마음을 이어받아 적들을 모두 쓸어버리세요.
📌 진행 방식
게임의 흥미진진한 클라이막스 1인 보스 레이드
게임의 대미를 장식하는 특별한 이벤트로, 플레이어는 강력한 1인 보스와의 결전에 참여합니다. 이 보스는 강력한 기술과 전략을 활용하여 플레이어를 공격합니다.
보스를 처치하고 무사히 집을 되찾으시길 바랍니다.
게임의 동작 과정
상태머신
총기
구간
저장
기술적 의사결정
총기의 전략 패턴화
전략 패턴을 사용한 근거 |
기능 또는 무기를 추가할 때 마다 총기 별로 예외 처리가 더해지고 메서드의 부피가 커져 코드가 복잡해지고 가독성이 떨어지는 문제를 해결했습니다. |
플레이어의 인풋에 대응되는 모든 전략 들을 클래스화 하여 무기마다 필요한 기능을 할당 시켜 사용하였습니다. |
전략 패턴을 사용한 결과 |
확장성 및 코드 재사용성 증가
기존에는 모든 무기 관련 기능이 하나의 스크립트인 WeaponBase 에 집중돼 있어서 새로운 총기를 추가하거나 각 총기의 세부 기능을 구현하는 것이 어려웠습니다. 그러나 전략 패턴을 도입하여 각 총기에 대한 전략을 별도의 클래스로 모듈화 함으로써, 무기의 추가 및 세부 기능을 효율적으로 다룰 수 있게 되었습니다. |
게임 제어 옵저버
옵저버 패턴을 사용한 근거 |
게임 내에서 발생하는 다양한 이벤트 및 상황에서 UI 표시, 세이브 데이터 로드, 타임 스케일 변경과 같은 여러 기능을 유연하게 처리하기 위해, 각 기능을 함수로 모듈화하고 이를 연결해 실행해야 하는 필요성을 느껴 대리자(delegate) 를 도입했습니다. |
플레이어와 적들이 공통적으로 가지고 있는 체력(Health) 을 대상으로 Action 대리자를 활용하여 각각의 체력이 0이 되었을 때의 상황을 관리하고자 하였습니다. 각 개체는 자체적인 OnDie 함수를 구현하고 Health 의 대리자에 연결되어, 체력이 0이 되었을 때 이 함수가 작동하도록 하였습니다. |
옵저버 패턴을 사용한 결과 |
옵저버 패턴을 도입함으로써 특정 상황에서 필요한 기능들을 동적으로 활성화하거나 비활성화할 수 있게 되었습니다. |
중앙 체력 관리 및 개별 OnDie 동작 구현
공통된 체력 처리 로직을 중앙에서 관리하면서도, 각 플레이어나 적은 자신만의 OnDie 동작을 수행할 수 있게 되었습니다. |
플레이어, 에너미 FSM
FSM을 사용한 근거 |
행동 트리와 상태 머신중에서 고민을 하였는데 행동 트리는 복잡한 행동 패턴을 나타내기 위한 구조이며,많지 않은 행동들을 정의하는데에는 새로운 상태나 동작을 추가하거나 기존의 것을 간단하게 수정하기 편한 상태머신을 사용하였습니다. |
상태머신은 시스템이 다양한 상태에 있을 때 각 상태에서 어떤 동작이 발생하는지 명확하게 모델링할 수 있습니다. 간단한 행동 로직을 구성할 것이므로 상태 머신이 디버깅 및 코드 가독성 측면에서 더 편할 수 있다고 느꼈습니다. |
FSM을 사용한 결과 |
코드 가독성 및 안정성 향상
FSM(상태 머신) 을 활용한 결과로 상태 변화의 명확성이 높아져 코드의 가독성이 향상되었습니다. 간단한 모델을 사용하여 각 상태에서 특정 이벤트가 발생하면 다음 상태로 전환되는 구조로 상태 전이가 명시적이며 간결하게 표현되므로 코드 구조를 개선하고 버그를 찾는 데 도움이 되었습니다. |
오브젝트 풀링
오브젝트 풀링을 사용한 근거 |
총알, 이펙트 같은 많은 오브젝트로 인해 Instantiate와 Destroy가 자주 일어나서 메모리 사용량 증가와 프레임 드랍이 되는 문제가 있었습니다. 이를 방지하기 위해 오브젝트 풀링을 사용했습니다. |
자주 사용되는 데미지UI, 혈흔 효과, 총알 등의 오브젝트를 재사용할 수 있도록 풀링 매니저를 만들어 원하는 프리팹을 한 곳에 모을 수 있도록 하여 관리를 용이하게 하기 위해 사용하였습니다. |
오브젝트 풀링을 사용한 결과 |
오브젝트 생성과 파괴를 줄여 메모리 사용을 최적화 하고 애플리케이션 성능을 향상 시킬 수 있었습니다. |
PlayerPrefs를 이용한 저장
PlayerPrefs을 사용한 근거 |
구간별 번호, 현재 플레이어의 체력 상태, 그리고 어떤 장비가 해금되었는지 같은 간단한 데이터를 저장해야 하는 상황에서, 저는 플레이어의 데이터를 효과적으로 관리하기 위해 PlayerPrefs를 활용했습니다. |
PlayerPrefs는 Unity 엔진에서 제공하는 간단한 로컬 데이터 저장소로, 키-값 쌍의 형태로 데이터를 저장하고 불러올 수 있어 사용하기 편하고 따로 패키지를 설치할 필요가 없어서 사용하게 되었습니다. |
PlayerPrefs을 사용한 결과 |
간편하고 효과적인 로컬 데이터 저장
PlayerPrefs를 사용함으로써, 간단하면서도 효과적인 방식으로 로컬 데이터 저장 방식으로, 간단한 키-값 쌍을 이용하여 필요할 때 해당 정보를 손쉽게 불러올 수 있었습니다. |
TROUBLE SHOOTING 👀
ㅤ | 원인 | 해결 |
OnTriggerExit - SetActive(false) 감지 못하는 문제 | 기존에 Unity가 기반으로 하고 있던 PhysiX 구현이 오브젝트가 비활성화되어도 OnTriggerExit이 불리지 않는 것. | • Collider가 있는 Object의 Activation은 게임 진행 중엔 끄지 않음.
• 별도의 충돌하지 않는 Layer를 만들고, 대상 Collider가 있는 GameObject의 Layer를 충돌 제거하고 싶은 시점에 해당 레이어로 변경. |
플레이어의 총알이 적에게 안 맞는 문제 | 총알의 속도가 너무 빨라 콜라이더가 충돌을 감지 못한것. | • 총알이 충돌 처리하는 방식을 콜라이더 충돌에서 레이로 변경.
• 총알을 프레임마다 이전 포지션과 다음 포지션 사이에 레이를 그려 충돌 검출. |
미니맵 Batch 문제 | 렌더 텍스쳐를 사용했을 때, 맵이 너무 하이폴리곤이라 카메라의 계산량이 커진것. | • 미니맵을 스프라이트 이미지로 대체하여 카메라를 사용하지 않는 미니맵으로 구현.
• 플레이어가 움직인 거리만큼 미니맵을 이동시키는 방식으로 계산. |
빌드 시 용량이 너무 큼 | Build Report를 확인 한 결과 텍스처가 전체 용량의 2.2기가중 2.1기가를 차지한다는 것을 발견 | • 텍스처의 Max Size를 4분의 1로 하여 용량을 절반으로 줄임. |
보스 공격 애니메이션 정확도 문제 | 보스 로봇의 팔 공격 애니메이션이 2개의 변수값으로 블렌드 트리를 만들었을 때 플레이어 위치를 정확하게 따라가지 못하는 것을 발견. | • 공격 시 플레이어를 바라보게 하고 1개의 변수값 만으로 블렌드 트리를 만들어서 (변수 값은 보스, 플레이어, 팔의 삼각형 각도) 해결. |
기술 스택
- C#
- Unity 2022.3.21f
- Visual Studio
- GitHub
⛔공사 중( 개선 사항과 버그)
종류 | 내용 | 해결방안 | 상태 |
개선사항 | 장전속도와 총기 발사 속도를 올려주세요. | 장전속도 및 총알 발사속도 증가 | 완료 |
개선사항 | 헤드샷의 데미지 차이가 있으면 좋겠습니다. | 헤드에 콜라이더를 추가하여 몸과 헤드 데미지를 구별 | 완료 |
개선사항 | 무기를 변경 시 탭을 눌러야 한다는 게 불편하고, 양 방향으로 휠이 안돌아가는게 불편합니다. | 번호키로도 무기를 바꿀 수 있게 변경 | 완료 |
개선사항 | 감도 조절 기능이 필요한 것 같습니다. | 감도 조절 기능 추가 | 완료 |
개선사항 | 디폴트 사운드가 조정이 필요합니다. | 디폴트 사운드 1 → 0.4로 조정 | 완료 |
개선사항 | 탄퍼짐이 너무 심한 것 같습니다. | 탄퍼짐 값 축소, 초탄 명중률 각 총기의 최대치로 설정 | 완료 |
개선사항 | 샷건 조준점이 화면을 너무 가립니다. | 샷건 크로스헤어 사이즈 축소 | 완료 |
개선사항 | 레이드를 더 긴장감 있게 만들어줄 수 있게 보스 등장시 효과음 적용 | 사운드 리소스 추가 | 완료 |
개선사항 | 미니맵이 보기가 불편합니다. | 미니맵의 구조를 카메라를 이용한 방법으로 변경 | 완료 |
개선사항 | 컷신 스킵 버튼이 있었으면 좋겠습니다. | Skip UI 추가, 키보드 Q 를 누르고 있으면 설정한 타임라인의 시간(거의 끝 부분)으로 이동함. | 완료 |
버그 | 보스 맵의 이벤트 지역 밖에서 적을 죽일 수 있음 | 이벤트 시작 전 콜라이더 false 처리 | 완료 |
버그 | 이벤트 씬에서 스페이스바를 연타하면 가이드라인이 사라지는 현상 | 특정 인풋을 받는 가이드는 대기시간을 추가해 바로 넘길 수 없게 수정 | 완료 |
버그 | 특정 몬스터가 맵에 끼면 무적이 되어서 안죽는 상황이 발생 | 특정 시간 후 무적을 해제하도록 변 | 완료 |
버그 | 첫번째 구간에 계단 난간을 올라가면 적들이 공격을 못함 | 플레이어의 캐릭터 컨트롤러의 StepOffset값을 변경하여 난간에 못올라가게 수정 | 완료 |
🚩발음주의(18조)의 GOAL
프로젝트 초기 목표 업데이트
🎮 게임 설계: 보스레이드 FPS
🎮 게임 설계: 보스레이드 FPS
- 보스레이드가 포함된 FPS 게임으로 초기 목표를 설정하였습니다.
📘 학습 내용 적극 활용: 포트폴리오 완성
- 캠프에서 습득한 지식을 적극적으로 활용하여 프로젝트를 구현하고, 결과물을 통해 강화된 포트폴리오를 구축하는 방향으로 전진 중입니다.
목표 달성 현황
🎮 게임 동작 체크 및 빌드
- 현재는 목표했던 C#의 기술들을 접목시킬 수 있는 보스레이드가 포함된 FPS 게임의 데모 버전을 완성하였습니다.
- 전략 패턴을 이용한 다양한 무기
- 상태머신을 이용한 AI
- 현재까지 게임의 전체적인 동작을 체크하고, 문제 및 개선 사항을 확인했습니다.
- 유저 테스트를 통한 개선사항 및 버그 수정
추후 도전 과제
🎮 게임의 기능 추가
- 추후 좀 더 게임을 플레이 하는 데 필요한 기능들을 고려하여 추가할 예정입니다.
- 걷는 소리, 적이 죽을 때 나는 소리 및 이펙트 추가
- 체력 회복 아이템 추가
- 근접 공격을 만들어 적의 공격을 막거나 적을 죽일 수 있는 액션 추가
팀원 구성 및 연락처
역할 | 이름 | 담당 | GitHub | Blog |
팀장 | 김진규 | 적,애니메이션,저장,UI,맵,이펙트 | ||
부팀장 | 김하늘 | 총기,이펙트,애니메이션,빌드 테스트 | ||
팀원 | 이선재 | 맵,이벤트,총기,애니메이션,UI,사운드,플레이어,컷신,가이드,저장,적 | X | |
팀원 | 장성림 | 보스,맵,애니메이션,이펙트,컷신 |
취업 준비, 어디서부터 시작해야 할지 모르겠다면?
🧐비전공자인데 IT 업계 취업할 수 있을까?
😟프로젝트 경험이 부족한데, 어떻게 준비해야 할까?
🥺IT 기업으로 이직하고 싶은데 뭐부터 시작해야 할까?
이런 고민을 하고 있다면, 내일배움캠프의 IT 취업 컨설팅을 받아보세요.
취업 코칭 전문가들이 여러분의 고민을 해결해 드립니다.
다음 링크에 이메일을 입력하시면 메일로 1:1 커리어 상담권과 취준 자료집을 보내드릴게요.
Share article
Subscribe to our newsletter