지난 시간 복습
- 네트워크 게임 구조 생각 해 보기 : 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를 모두 제공함.
자료 읽기
통신 모듈 만들기
패킷 헤더가 필요하다.
패킷 데이터를 수신했을 때 통신 모듈에서 호출되는 함수를 등록하는 모듈
모듈의 결합도
통신 모듈과 패킷의 관계
인터페이스 정의
아이템 정보 패킷 클래스 구현
송신 함수 구현
각 단말의 시퀀스
게임 전 동기화 할 정보
캐릭터 모듈의 수신 함수 등록
캐릭터의 제어와 동작
아이템 패킷의 흐름
아이템을 소유하고 있을 때 아이템 획득 절차
채팅 메세지 수신
'대학생활 > 수업' 카테고리의 다른 글
게임알고리즘 12주차 - 2-3 Tree, 2-3-4 Tree, Red-Black Tree (0) | 2023.06.07 |
---|---|
게임그래픽프로그래밍 12주차 - 렌더링의 활용 (0) | 2023.06.05 |
게임음악작곡법 11주차 - 투 코드 톤, 패싱 노트, 아르페지오 (0) | 2023.06.01 |
게임레벨디자인기초 12주차 - 시스템 설계 (0) | 2023.06.01 |
게임데이터설계 12주차 - 가챠 시스템의 활용 (0) | 2023.05.31 |