1. 멀티플레이어 게임에서의 코드 분할 필요성
1) 통신량 감소
- P2P에 비해 통신량이 감소함
: P2P의 경우, 모든 클라이언트가 서로 직접 연결해 데이터를 주고 받지만
클라이언트-서버 통신 방식에서는 클라이언트가 서버로만 자신의 데이터를 전송하기 때문에 통신량이 감소함
2) 안정성과 신뢰성 확보
- 서버에서 게임 버전 및 모든 로직에 대한 유효성 판별
- 서버에서 게임의 관리 / 감독 권한(Authority) 소유
3) 클라이언트와 서버의 역할(Role)에 따른 내부코드만 관리 필요
- 클라이언트와 서버가 하나의 프로젝트를 사용하지만 각각의 역할에 맞는 코드만 실행되도록 분리해야함
2. 서버에서만 동작해야하는 코드
1) 클라이언트와 공유할 월드 인스턴스
- 서버는 클라이언트에게 공유할 월드 제공해야함
: 서버에서 월드에 대한 생성과 관리 필요
* 월드(World): 클라이언트가 알아야할 정보로, 게임모드 / 레벨(레벨 안의 모든 액터)에 대한 인스턴스 정보 생성
: 모든 클라이언트는 서버의 명령에 따라 레벨 전환 / 게임모드 수용해야함
2) 클라이언트의 Login / Logout 관리
- Login 함수 호출 Flow
(1) PreLogin()
- 로그인 함수 전에 호출되는 함수: 서버에 접속하려는 플레이어 승낙 / 거절
→ 클라이언트가 네트워크 상으로 Connection된 상태로 Login이 된 상태는 아님(거절당할 수도 있기 때문)
(2) Login()
- 서버에서 플레이어 컨트롤러 생성(플레이어 입력 / 네트워크 상호작용 처리 목적)
: 생성한 플레이어 컨트롤러를 클라이언트에게 보내줌(=Replication)
: 클라이언트는 복제된 플레이어 컨트롤러 생성
- 플레이어 기본속성 설정: 플레이어의 이름, 고유Id, 옵션 등 초기화
- 생성한 플레이어 컨트롤러가 해당 함수에서는 완전히 초기화 되지 않음: PostLogin() 함수에서 실행
(3) PostLogin()
- Login() 함수가 성공적으로 호출된 이후 플레이어컨트롤러의 Replicated 함수가 처음으로 호출되는 함수
- 플레이어 컨트롤러 초기화
: 플레이어 컨트롤러가 Possess & 캐릭터 설정이 되면 게임 준비 상태 완료!
(4) StartPlay()
- 게임 시작 조건 체크 완료 시 게임 시작 지시
: 게임 시작 조건 - 각 게임마다 다른 시작 조건(ex. 방의 인원수 체크 / 참여한 플레이어 모두 Ready 버튼 눌렀는지 확인)
: BeginPlay() 호출
(5) BeginPlay()
- 게임 시작 후 모든 액터에게 호출
- Logout 함수 호출 Flow
(1) Logout
- 플레이어가 게임을 종료하거나 Player State와 Controller가 파괴될 때 호출되는 함수
: 강제종료를 하더라도 서버는 일정 시간 클라이언트의 정보를 유지하고 이후 DB 처리를 함
3) 게임플레이 로직
- 모든 게임의 로직(게임의 시작/종료, 각 플레이어에 대한 점수 관리 등)을 서버에서 관리
: 이 함수에 관련된 Replication함수는 클라이언트 서버에서 처리
- 클라이언트에서 요청한 처리(RPC)
: RPC(Remote Procedual Call, 원격함수 콜) > 클라이언트에서 서버에 특정 함수를 실행해달라고 요청
'네트워크🔗 > 이론' 카테고리의 다른 글
Multiplayer 게임에서의 코드 분할: 클라이언트와 서버 모두 실행해야하는 코드 (0) | 2024.12.26 |
---|---|
Multiplayer 게임에서의 코드 분할: 클라이언트에서만 동작해야하는 코드 (1) | 2024.12.23 |
게임과 네트워크 (1) | 2024.12.18 |
Actor의 Role: NetRole (0) | 2024.12.06 |
NetMode(넷모드) (0) | 2024.12.02 |