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, 원격함수 콜) > 클라이언트에서 서버에 특정 함수를 실행해달라고 요청

728x90

+ Recent posts