Skip to main content
장르 1 vs 1 실시간 전략 디펜스 게임
목표 상대방의 HQ 파괴
개요
• 3개의 라인에서 일정한 주기마다 로봇이 생성
• 로봇은 자동으로 라인을 따라 상대방의 HQ를 향해 전진
하고 적 로봇을 만나면 전투에 돌입
• 플레이어는 영웅을 소환해 강력한 스킬을 사용
▶ 전장의 상황을 빠르게 파악하고 적재적소에 스킬을
사용하는 라인 관리 능력이 필요
백 성 진
서버 & 클라
이 규 원
클라이언트
최 재 우
서버
클라이언트 메인 로직 구현
게임 전반 기획
UI 및 맵 디자인
클라이언트 – 서버 통신 모듈 제작
애니메이션
VFX, SFX
멤버십 서비스
로비/채팅/게임 서버 관리
다량의 실시간 비동기 통신
클라이언트는 서버를 사용한 3D 게임이라는
서버는 비동기 실시간 통신이라는
새로운 경험을 제 1순위로 선정
마감 2주 전에 기획을 엎어버리면서
무의식적으로만 생각하고 있었던
게임의 재미가 제일 중요한 목표였다는 사실을 깨달음
0 재 미
1 새로운 경험
2 성능, 비주얼 등
백 성 진
서버 & 클라
100% GitHub을 통한 협업 경험
기능이 부족한 Unity Teams의 Collaborate를 사용해서 개발하
는 단계를 넘어 GitHub을 원활하게 사용하는 수준으로 발전
70% JSON, CSV를 활용한 VFX, SFX 데이터 유지 보수
스킬의 종류가 많아짐에 따라 자료 관리의 필요성을 느끼고 사용
JSON과 CSV를 사용해 스킬 정보 및 사운드 관리
90% 클라이언트단 통신 모듈
서버에서 패킷 송신 시 헤더 패킷 ID 분석 후 목적지로 전달
서버로 데이터 송신 시 클래스 요소별로 데이터 세팅 후 송신 요청
100% 3D 온라인이라는 새로운 장르의 게임 개발
많이 경험했던 2D 싱글 게임에서 벗어나 실력 있는 사람들과
새로운 장르의 개발을 통해 도전에 대한 심리적 부담감 탈피
90% 실시간 전략 게임에 대한 게임 디자인 전반을 수행
고민해보지 않았던 장르에 대해 고민할 기회를 갖고 UI나 맵 디자인
등 프로그래밍 외적인 지식 습득
80% 클라이언트 개발자로서 서버에 대한 이해
서버에 대해 전무했던 지식을 보충하고 서버에 대한 이해도를
높여서 온라인 게임 개발력 함양
이 규 원
클라이언트
100% 스스로 하나의 프로젝트에만 열중하기
2달 동안 하나의 프로젝트에만 열중해서 코딩을 해보면서
자신의 한계를 시험하고 극복
100% 처음 접하는 분야에 대한 열정 발휘
이전에 해보지 못했던 ‘게임 서버’라는 분야에 도전해서 열정을
가지고 스스로 공부해가면서 개발
100% 각자의 역할을 충실히 수행하기
팀원들을 믿고 자신이 맡은 역할을 충실히 수행하여 만족스러운
결과 도출
최 재 우
서버
엑스컴을 본따서 1 vs 1 턴제 체스류 게임을 목표
빠른 역할 분담 이후 작업 착수
• 백성진 : Python Socket을 이용한 서버 프로토타입 제작
• 이규원 : Unity로 게임 메인 로직 구현
• 최재우 : Flask를 이용한 멤버십 서비스 구현
1:N 채팅, 유닛 이동 및 공격 정보 전달까지 성공
▶ 1 vs 1 턴제 게임으로는 얻을 수 있는 지적 향상의 수준이 너무 낮다는 피드백
피드백 수용 후 롤과 스타를 섞은 1 vs 1 실시간 AOS 게임으로 변경
한 플레이어가 3명의 영웅을 컨트롤해서 상대방의 HQ를 파괴하는 게임
• 백성진 : 서버-클라 송수신 모듈 구현, 캐릭터 애니메이션 및 스킬 이펙트 작업
• 이규원 : 이동과 스킬 사용 구현, 수신한 데이터로 remote 캐릭터 행동 동기화
• 최재우 : 멤버십 기능 구현 완료, 로비 / 채팅 / 게임 서버 구현
게임의 완성도를 위해 에셋을 구매해서 보기 좋은 게임을 만들기 위해 노력
▶ 게임이 재미가 없다는 의견이 나옴
마감이 2주 남았지만 빠르게 피드백 수용 후 현재의 1 vs 1 디펜스 게임으로 변경
스킬의 개수가 많아지고 그 효과도 다양해짐
자동으로 움직이는 캐릭터의 수도 급증하면서 서버를 비동기 방식으로 전환
서버-클라 테스트에서 생각지도 못했던 통신 에러 발생
• TCP로 빠르게 전송된 packet들이 붙어서 출력되는 현상 발생
• 정상적인 해결법 : packet의 헤더 뒤에 packet size를 붙여서 size 만큼의 정보를 read
• 최종적인 해결법 : padding을 넣어서 인게임에서 사용하는 모든 packet의 size를 37로 통일
Flask를 이용해 게임 클라이언트와 API 통신
이를 이용해 로그인 및 업적 시스템 구현
Flask 서버 피드백 시 MVC 패턴에 맞추기 위해
Flask의 blueprint 기능을 이용
타 게임의 채팅에서 인터넷이 끊겼을 경우에
채팅을 보내도 로컬 클라이언트에 출력이
안되는 것을 확인
▶ 유저가 메시지 입력 시 항상 서버로 전송
▶ 서버에서 모든 유저에게 broadcast
유저끼리 매칭을 맺는 과정에서
수많은 TCP 패킷 전송이
필요하다는 사실을 깨달음
반드시 동기화 되어야하는 요소(유닛 HP) 등을 처리하는 방법에 대한 고민 및 구현
Receive한 패킷을 Deserialize한 후 분류해서 작업
▶ 게임 뿐만 아니라 네트워크 전반에 대한 지식 함양
서버를 통해 주고 받는 패킷의 종류의 다양화
▶ 하나의 개체를 통해 관리 해야할 필요성 대두
▶ Network Manager에서 송/수신 담당
수신
Network Manager는 서버로부터 수신한 데이터
패킷 역직렬화 후 알맞은 Manager에게 전달
송신
Manager는 각 인터페이스에 맞게 패킷 포장 후
네트워크 매니저에게 송신 요청
수많은 로봇이 자동으로 행동
각 로봇이 처한 상황도 천차만별
▶ 최대한 간단하면서 구조화하기 쉽고 버그를 찾기 용이한
Finite State Machine이 필요
기능들을 명확하게 구분/관리
▶ Skill Indicator를 이용해 플레이어가 스킬을
사용할 위치를 선정
▶ 스킬 입력 시 Skill Manager를 통해 서버로
스킬 사용 정보를 전달
▶ 서버로부터 받은 스킬 정보를
토대로 해당 좌표에 영웅을
소환하고 스킬 사용
스킬 정보, 사운드 관리
20종의 스킬의 관리를 위해 JSON과 CSV를 도입
스킬의 모든 정보(선딜, 후딜, 쿨타임, 데미지 등)를 JSON에서 읽는 방식으로 유지 및 보수
THANK YOU