게임 개발 포트폴리오 | Don’t Piss Me Off

내일배움캠프 1기 Unity 게임 개발 과정 트랙 수료생 최종 프로젝트 'Don’t Piss Me Off '를 소개합니다.
Feb 26, 2024
게임 개발 포트폴리오 | Don’t Piss Me Off

⚔️정체불명의 적들에게 집을 빼앗겼다?

notion image

💀적을 청소하고 집을 되찾으세요 !💀

🔎정체불명의 적들이 집을 점거했습니다!

🗒️
힘들게 업무를 마치고 퇴근한 주인공, 그는 친구로부터 들린 소식에 맞서 싸움을 결심한다. 집 가는 길을 점거한 수상한 녀석들, 그들의 앞에 선 주인공은 예전 군인이었던 경험을 떠올리며 적을 섬멸하기로 마음먹는다.

📌 게임 특징

  1. 1인칭 슈팅 액션: 플레이어는 주인공으로 빙의하여 직접 적들과 맞서 싸우는 짜릿한 1인칭 슈팅 액션을 경험할 수 있습니다. 다양한 총기와 구르기, 슬로우모션 기능을 활용하여 전투의 고조를 느껴보세요.
  1. PvE 및 보스전: 다양한 종류의 적들이 당신을 향해 몰려옵니다. 각 구간에는 다양한 종류의 적들이 기다리며, 그들을 물리치면서 주인공의 본능적인 전투력을 경험할 수 있습니다.
  1. 다양한 무기 수집: 게임 내에서 다양한 종류의 총기를 획득하여 적들과의 전투에서 우위를 점할 수 있습니다. 효과적인 전략을 세우기 위해 다양한 무기를 적재적소에 사용하세요.
  1. 이벤트와 플레이 경험: 특정 구간에서는 과거에 오락실에서 봤던 특별한 게임 방식으로 게임 플레이를 더욱 흥미진진하게 만들 수 있습니다. 이벤트를 통해 인간의 반응속도를 테스트하고 플레이어의 진정한 전투 능력을 확인하세요.
    1. 🔥
      슈팅 액션의 시작, 화가 난 주인공의 마음을 이어받아 적들을 모두 쓸어버리세요.
       

📌 진행 방식

notion image

각 구간 별 적 섬멸

🕹️
시작할 때, 플레이어는 기본 총기를 가지고 있고 WSAD로 움직이며 마우스 좌클릭을 통해 총알을 발사 해 적을 처치합니다
🧩
구간 내에는 정해진 수의 일반 적이 등장하며, 이들을 모두 처치해야 다음 구간으로 진행할 수 있습니다.
 
notion image

특별한 Rail Shooting액션

🎮
게임 중반, 구역에서 플레이어는 특수한 환경 속에서 적들을 처치합니다.
🎲
플레이어의 움직임이 총 쏘기와 숨기기로 제한되며, 적들은 특수한 총알을 발사하여 플레이어를 공격합니다.
🧩
플레이어는 주어진 제한 시간 안에 모든 적을 섬멸하여 이벤트를 성공적으로 클리어해야 합니다.
 
notion image

특정 조건에서 발동하는 스킬

🕹️
기본 동작으로 스페이스바를 이용하여 회피 동작을 할 수 있으며, 특정 조건을 만족하면 회피동작 대신 주변이 느려지는 “집중” 스킬이 발동됩니다.
notion image

다양한 총기 수집 및 활용

🎲
각 구간은 다양한 전투 상황을 대비하여 숨겨진 강력한 무기들로 가득 차 있습니다. 지형을 주의 깊게 살펴보고, 강력한 무기들을 찾아서 효과적으로 활용하여 적들을 물리치세요.
notion image

게임의 흥미진진한 클라이막스 1인 보스 레이드

🎮
게임의 대미를 장식하는 특별한 이벤트로, 플레이어는 강력한 1인 보스와의 결전에 참여합니다. 이 보스는 강력한 기술과 전략을 활용하여 플레이어를 공격합니다.
🎉
보스를 처치하고 무사히 집을 되찾으시길 바랍니다.

게임의 동작 과정

상태머신
notion image
총기
notion image
구간
notion image
저장
notion image
 

기술적 의사결정

총기의 전략 패턴화
notion image
전략 패턴을 사용한 근거
기능 또는 무기를 추가할 때 마다 총기 별로 예외 처리가 더해지고 메서드의 부피가 커져 코드가 복잡해지고 가독성이 떨어지는 문제를 해결했습니다.
플레이어의 인풋에 대응되는 모든 전략 들을 클래스화 하여 무기마다 필요한 기능을 할당 시켜 사용하였습니다.
전략 패턴을 사용한 결과
확장성 및 코드 재사용성 증가 기존에는 모든 무기 관련 기능이 하나의 스크립트인 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
팀원
장성림
보스,맵,애니메이션,이펙트,컷신
Share article
Subscribe Newsletter
Stay connected for the latest news and insights.
RSSPowered by inblog