본문 바로가기
Project

[Unity/Zepeto] 멀티플레이 좀비 게임 만들기 정리본 - 1

by 배애앰이 좋아 2023. 8. 23.
반응형

 

이번 프로젝트는 스팀 상점에 있는 Yet Another Zombie Defense라는 게임을 참고하여 제페토 내에서도 비슷한 게임을 만들어보고자 합니다. 다만, 이 글에서 코드를 세세히 올리는 것이 아닌 게임 로직이나 중요한 부분을 정리하고자 작성하는 글입니다.

 

관련 영상 링크 : https://youtu.be/33ZRyEi9PBg

 

이때까지는 싱글 플레이 게임이나 1인 게임만 개발하다가 멀티 플레이 게임을 제작하게 되니 멀티는 정말 고려할 부분도 엄청 많구나를 느꼈습니다. 또한, 서버에 대한 지식, Client 와 Server 간의 통신 방식, 데이터 저장 방법, 데이터 저장 관련한 JSON 등등 익숙하지 않지만 배워가는 것이 많은 프로젝트 같습니다.

 

이 게임을 만들면서 대표적으로 고민했던 부분들을 정리해보았습니다.

 

 

- 플레이어를 따라오는 좀비 로직

 

 

멀티 게임을 하기 위해서는 host 인 사람과 아닌 사람의 동작이 다르게 흘러가는데 저 같은 경우 host 인 플레이어(제일 처음에 입장한 사람) 게임 내에서 좀비, 총알 충돌 등을 처리해서 해당 정보를 서버로 보내줬습니다. 그래야 데이터의 중복, 혼선이 일어나지 않습니다.

 

다만, 이 경우 호스트의 인터넷 상태 등에 따라 다른 플레이어도 영향을 받을 수 있다는 단점이 있습니다. 또한 호스트가 중간에 게임을 나가거나 튕길 경우를 대비해 게임이 안 끊기고 이어지기 위해 다른 사람을 host 로 지정해주는 예외 처리도 중요한 것 같습니다. 

 

- 총알 충돌에 따른 좀비 HP 상태 관리 로직

 

 

호스트에서 충돌 처리를 해서 좀비 HP 값을 서버로 보내고 동기화해주기

-> 총알을 각자 생성해주기 때문에 호스트 처리를 안하면 충돌처리가 인원 수만큼 호출 될 수 있음.

 

- 플레이어가 쏘는 총알 관리 + 오브젝트 풀링 기법 사용

 

 

총알 경우 최대 총알 오브젝트만큼 미리 생성한 후, 해당 오브젝트를 활성/비활성하면서 오브젝트 풀링을 통해서 최적화 및 과부화를 줄일 수 있도록 관리하였습니다. 

 

플레이어가 총을 쏘면 해당 총알의 위치, 회전 값을 서버로 보내고 다른 플레이어에게 보내서 다같이 똑같이 총알 생성
-> 이때, 서버에서 몇번 째 총알인지 관리하기
-> 플레이어 각자가 자신이 쏜 총알 갯수는 관리하여 탄약 제어

-> 만약에 총알이 충돌하거나 빗나갈 경우, 비활성 후 다시 서버로 비활성 값 리턴

-> 서버에서 비활성 값 받으면 해당 총알을 재사용 가능하다고 판단

 

- 전체 프로젝트 스크립트 관리

 

 

- 해당 게임에서 필요한 기능 및 구현한 기능 정리

 

더보기

- 기본 환경 구현하기 (멀티플레이어, 좀비, 배경)

- 플레이어 따라가는 좀비 기능 만들기

- 좀비 위치 동기화

총알 기능 구현

총알 위치 동기화 & 이벤트 동기화

총알 충돌 처리 및 좀비 hp 동기화

좀비 HP bar 만들어주기

쿼터뷰 구현하기

사용자 HP bar 만들어주기

좀비 수 바꿀 수 있게 로직 바꾸기

좀비 공격 기능 구현하기

플레이어 무기 드는 자세로 만들어주기

총과 총알 구현 & 애니메이션

좀비 죽는 애니메이션 추가해주기

무기 바꿀 수 있는 UI 제작하기

조작 키패드 구현하기

사진, 영상 찍는 기능 구현하기

분위기 조정하기 (어둡고, 음산하게)

BGM 찾아서 추가하기

세부 BGM 추가하기 - 총 쏘기, 좀비 소리 등

탄약, 탄창 기능 구현하기

장전 및 사격 기능 구현하기

좀비 자동으로 리스폰 - 좀비 웨이브 만들기

- 플레이어 제스처 아바타 마스크 및 동기화

 

 

- 이때까지 한 부분에 대한 결과물 영상 : 

 

1) 유니티 & 싱글 버전

 

2) 모바일 & 멀티 버전

 

하지만 여기까지 구현했을 때 문제점이 생겼습니다. 오브젝트 풀링 기법 등을 이용했으나 코드적으로 비효율적인 부분과 에셋에 대한 부분들 등으로 인해 프레임이 많이 떨어지는 문제점이 있었습니다. 제페토 특성상 30fps가 최대인데 20마리 이상 좀비 생성하면 5fps로 떨어지고 렉도 걸리고 위치동기화가 어려워져서 프로젝트를 한번 갈아엎게 되었습니다.

 

다시 제작한 프로젝트 경우, 최대한의 최적화를 위해 에셋은 기본 에셋으로 쓰고 총알 방식, 특히나 코드적인 부분에서 많이 수정을 하였습니다. 

 

어떻게 최적화를 진행했는 지에 대해서는 따로 글로 정리하겠습니다.

 

- 수정된 대표적인 구현 기능

  • 좀비 (주요 건물 부수기, 공격, 피해, 죽음 등)
  • 총탄, 총알 기능 (좀비 공격, 속도, 데미지, 탄약 채우기 등)
  • 라운드 관리 기능 (매 라운드 좀비 생성 및 관리, UI 등)
  • 플레이어 (HP Bar, Animation 등)
  • 주요 건물 (HP Bar, 데미지 등)
  • 코인 시스템 ( 영구적인 데이터(서버  연결), 무기 데미지, 탄약 수 업그레이드 등)
  • 장애물 세우기 시스템 
  • 환경 (멀티 서버, 쿼터뷰 카메라, 조작, BGM, UI 등)

 

- 요약

  • 메타버스 플랫폼인 Naver Zepeto 기반 게임 콘텐츠를 만든 프로젝트로 Steam 상점에 있는 Yet Another Zombie Defense라는 게임을 참고하여 좀비 디펜스 게임 구현을 진행했습니다. 멀티 기반 게임을 만들기 위해 Client 와 Server 간의 통신을 배웠으며 서버와 저장소 간의 데이터 저장 방식은 JSON을 이용한 방식을 익힐 수 있었습니다. 또한, 멀티 게임인만큼 최적화에 대한 문제도 자세히 다뤘으며 게임 로직 세우는 역량을 익힐 수 있었습니다.

 

- 기술 스택

  • Unity, TypeScript, JSON

 

- 업무 기간

  • 2023.5 ~ 2023.08 (약 3개월)

 

- 역할

  • 1인 레퍼런스 참고 기획 및 프로트 타입 개발

 

- 세부 역할 및 배운 점

  • 새로운 언어 TypeScript 을 익혀서 응용 개발
  • Client와 Server 간의 통신 방법
  • Sever 에서 데이터 처리 방식
  • Sever 와 DataStorge 간의 데이터 저장 방법(JSON)
  • 게임 최적화
  • 게임 로직 세우는 역량 및 코드 기능 세분화

 

- 업그레이드 버전 관련 영상 

 

관련 코드 참고 링크 : https://github.com/Seonga02024/Muti-Defense-game-zepeto.git

 

반응형

댓글