본문 바로가기
대학생활/수업

게임네트워크프로그래밍 12주차 - 게임프로그래밍 포트폴리오

by se.jeon 2023. 6. 5.
728x90
반응형

지난 시간 복습

- 네트워크 게임 구조 생각 해 보기 : RPG류의 네트워크 게임 서버가 되려면?

- 턴제 게임과 키 입력이 동기화 되어야 하는 게임이 다른 점 

- 키 입력의 동기화를 위하여 UDP를 사용 한 이유

- 클라이언트 입력이 아닌, 서버를 경유한 입력을 통해 플레이 실현하는 예시, 2주 전 만들었던 서버 리뷰

아티스트, 디자이너와 협업할 때 설명을 잘 해줄 것.

- 가장 간단한 충돌 체크 : 원, 사각형

- AABB, OBB(회전 추가), K-Dop(디테일 추가) 설명

- 충돌 체크 (CD), 충돌 체크의 3가지 단계 : 충돌 탐지, 충돌 결정, 충돌 후처리

- 유니티 : 프리팹 - 유니티에서 인스턴스를 만드는 일종의 설계도 역할.

- 유니티 : 아웃렛  - 스크립트 내의 변수에 오브젝트 실체를 연결하는 간단한 방법. public 접근 수식자 사용이 관건.

MMORPG 게임 네트워크 프로그래밍

게임의 전체 프로세스

시작 > 타이틀 > 친구를 기다린다/ 플레이한다 > 둘이서 플레이한다 > 돌아간다 > 종료

통신이 일어나는 것 : 접속, 게임 전 동기화 > 캐릭터 이동, 아이템 획득, 채팅 > 접속 종료 + 오류 알림

 

통신 지연으로 캐릭터의 위치가 어긋난다.

- 캐릭터의 위치가 완전히 일치하는 것을 전제로 하는 게임 디자인은 할 수 없음

- 동시에 이벤트가 일어났을 때, 어떻게 해결 할 것인가?

 

게임에서 통신 할 것

- 캐릭터 이동 : 캐릭터 좌표

- 아이템 획득 : 아이템 ID, 획득 상황, 소유자

- 채팅 : 채팅 메세지

모듈 구성 생각 해 보기

통신할 정보와 관련된 모듈

- 캐릭터 모듈 : 캐릭터 좌표, 이사 이벤트, 채팅

- 아이템 모듈 : 아이템 정보

 

캐릭터 모듈과 통신 모듈의 관계

서버가 캐릭터의 모든 위치와 이동을 처리하지 않는다.

- 캐릭터의 좌표

1. [캐릭터 > 캐릭터 매니저] 현재 좌표 위치 전달

2. [캐릭터 매니저 > 통신 모듈] 어느 캐릭터 좌표인지 정보를 덧붙임

3. [통신 모듈 > 통신 모듈] 캐릭터의 좌표 정보 수신

4. [통신 모듈 > 캐릭터 매니저] 좌표정보 전달

5. [캐릭터 매니저 > 캐릭터] 수신한 정보를 조사해 캐릭터에게 좌표 전달

- 이사 알림

1. [캐릭터 > 캐릭터 매니저] 현재 좌표 위치 전달

2. [캐릭터 매니저 > 통신 모듈] 어느 캐릭터 좌표인지 정보를 덧붙임

3. [통신 모듈 > 게임 서버] 정보 송신

4. [게임 서버 > 통신 모듈] 수신한 정보 그대로 송신

5. [통신 모듈 > 캐릭터 매니저] 캐릭터에 반영

 

아이템 모듈과 통신 모듈의 관계

1. [아이템 > 아이템 매니저] 상태 변경을 알림

2. [아이템 매니저 > 통신 모듈] 변경 상태 전달

3. [통신 모듈 > 게임 서버] 아이템 획득 가능여부 확인

4. [게임서버 > 통신 모듈] 조정한 결과를 알림

5. [통신 모듈 > 아이템 매니저] 조정한 결과를 전달

6. [아이템 매니저 > 캐릭터 매니저] 캐릭터에 반영

 

회사에서 코드를 받을 때, 구조도를 요청하는 것이 좋다.

정보를 어떻게 통신할 것인가

게임 시작 전 동기화 흐름

- 로딩 할 때 네트워크 또한 동기화를 진행한다.

- 아이템을 가지고 있는 것은 본인만 알고 있음. 타 클라이언트는 알 필요가 없다.

- 아이템을 들고 있는 것을 보여주기로 기획했다면

- 플레이어가 나중에 들어오는 상황일 경우, 로딩 시간동안 서버를 한번 경유해서 들고있다는 정보를 받아온다.

 

각 단말에서의 캐릭터 이동

- 전달하는 정보가 워낙 많기 때문에 모든 정보를 반영하기 힘들다.

- 로컬 캐릭터는 현재 좌표로, 리모트 캐릭터는 지연 때문에 과거 좌표로 이동하기 떄문에 캐릭터 위치가 어긋나는 현상이 발생된다.

- 캐릭터 좌표 추출과 보간 (Interpolation/ 선형, 스플라인, 라그랑주, 에르미트 보간 방식이 있음.)

 

스플라인 보간

통신 지연과 보간 연산으로 더 지연되지만, 프레임별 캐릭터 좌표의 차이가 영향을 주지 않는다.

- 프레임을 정해서 프레임 수마다 좌표를 송신

- 송신된 이동 좌표 > 보간된 곡선 > 보간된 좌표

- 수신한 점과 그 전에 수신한 점 사이를 프레임으로 등분하면 지난 프레임의 위치를 구할 수 있음

- 보간으로 구한 좌표는 각 단말에서 일치하지 않지만 큰 차이는 없음

 

게임 서버

- 아이템을 관리할 전용 단말을 게임 서버로 사용한다.

- 각 단말에서 아이템을 줍거나 버리는 상황이 오면 서버 내 관리 정보를 참조해 아이템의 상황을 검사한다.

 

아이템의 상태 주기

- 아이템의 획득 상황을 조정하지 않으면 아이템 증식 상황이 발생한다.

- 아이템의 발생부터 폐기할 때 까지 흐름을 알아두는 것이 중요하다.

- 아이템 발생 > 발생 중 > 미획득 > 획득 중 > 획득 완료 > 폐기중 > 폐기 완료.

 

아이템 조정

- 여러 단말이 동시에 아이템을 클릭했을 때 조정

- A와 B중에서 누가 아이템을 가지게 되었는가. 아이템의 status를 획득중으로 변경해야 한다.

 

아이템 소실

로컬 캐릭터는 아이템을 내려놓을 수 있음.

1. 새 아이템을 획득할 수 있는지 서버에 문의

2. 획득 할 수 있다고 확정되면 기존 아이템의 폐기

지난 주, 2주 전 과제 내용 발표 진행

- 정제훈

- 전시은 (2회)

- 손형준

- 김주원

- 안규원

프로그램 작성 실습 진행

- Array : 크기가 정해져 있을 때 사용, 에러 체크 명확히 해야 함.

- ArrayList : 타입이 달라도 묶어줄 수 있다.

- Split : 기본 제공 기능을 잘 사용하자.

- Insert, Remove, RemoveAt

- List : Add

- Queue : Enque, Deque

- Stack : Push, Pop

- Collection : 기본적으로 오브젝트 타입이다.

- Hash Table

- Dictionary : Key, Value를 지원하는 자료구조, ContainsKey & ContainsValue를 모두 제공함.

자료 읽기

통신 모듈 만들기

패킷 헤더가 필요하다.

패킷 데이터를 수신했을 때 통신 모듈에서 호출되는 함수를 등록하는 모듈

 

모듈의 결합도

통신 모듈과 패킷의 관계

인터페이스 정의

아이템 정보 패킷 클래스 구현

송신 함수 구현

각 단말의 시퀀스

게임 전 동기화 할 정보

캐릭터 모듈의 수신 함수 등록

캐릭터의 제어와 동작

아이템 패킷의 흐름

아이템을 소유하고 있을 때 아이템 획득 절차

채팅 메세지 수신

728x90
반응형