(사실 내가 필요해서 정리함)

 

언리얼 입문자들이면 다 알것이다.

어느정도 배우기 시작하면 나타나는 "리플리케이션" (Replication) 이라는 개념을....

 

처음에는 굉장히 생소하고, 이게 뭐... 어쩌라는건지? 싶을때도 있는데

익숙해지고 나면 이거 없이는 개발을 어떻게하지? 싶은 순간도 와버리게 되는 마성의 개념인것같다 (글쓴이 주관임)

 

 

 

여튼,

 

언리얼 네트워크 시스템에 대해 찾아보려고 검색을 하면 다들 이 그림을 보게 될 것이다.

 

 

굉장히 예전부터 보이던 그림이라 어디가 원조인지 궁금하긴 했는데 2020년에도 쓰였다는거 말곤 잘 모르겠더라 (...)

 

 

여튼, 이 그림을 기준으로 정리를 해보도록 하자.

 

결국 리플리케이션 개념은 서버/클라 통신과 관련된 개념이다.

 

모든 데이터를 서버에 둘 수도 없고, 모든 데이터를 클라에만 둘 수도 없으며, 클라이언트에 필요는 하지만 서버에서만 관리해야하는 데이터가 있을수도 있고 등등... 온갖 이슈들이 존재하는데

이를 관계 정리한것이 리플리케이션 개념인것.

 

우선은, 언리얼 네트워크 시스템상에서 각 요소(=액터) 들은 크게 3가지로 나뉜다.

 

Server Only

Server/Client Multy

ClientOnly

 

Server Only는 게임 관리자에 해당하는 "GameMode"  가 포함

Server/Client Multy는 게임 통제 (점수 기록 등)을 담당하는 "GameState", 각 플레이어의 상태를 가지고 있는 "PlayerState", 플레이어의 이동 정보 등을 가지고 있어야하는 "PlayerController", 그리고...

"Pawn" (or Character)

생각해보면, 결국 서버/클라 무관하게 모든 캐릭터는 똑같이 보여야하니까 Pawn이 서버/클라 모두에 있는건 별로 이상한 것은 아닌것같다.

 

사실 네트워크 요소중 다른 사항들은 크게 신경쓰지 않아도 된다. (어차피 네트워크 통신 이슈가 발생하진 않으니까)

하지만, Server/Client Side 양측에 모두 존재하는 액터들이 제일 큰 문제인데

 

여기서도 몇가지 갈린다.

1. 서버가 무조건 우선권을 가짐

2. 모든 클라이언트가 소유하고 있어야 하는 경우

3. 지금 화면을 보고 있는 클라이언트의 정보만 있어야 하는 경우

 

간단히 설명하면 위의 3가지인데, 이를 좀 더 상세하게 풀어가면

1. "관리 권한이 존재"

2. "관리 권한은 없으나 소유권은 있음"

3. "관리 권한도 없고, 소유권도 없음"

 

이렇게 3가지 타입으로 구별이 가능하다.

이를, "Authority", "Autonomous", "Simulated" 이라고 표현한다.

 

디테일한 내용은 아래 공식문서를 참고바랍니다. ->

https://docs.unrealengine.com/4.27/ko/InteractiveExperiences/Networking/Actors/Roles/

 

액터 롤 및 리모트 롤

액터 오브젝트 리플리케이션의 여러가지 부분에 대한 것입니다.

docs.unrealengine.com

 

 

자세한 롤 관련 얘기는 다음 문서에서 설명하기로 하고, 여기서는 네트워크 관계도(?)에 대한 설명을 좀 더 하기로 하겠다.

결국, 리플리케이션이 필요한 객체라도 어떤 클라에선 없을수도 있고, 클라 서버 관계없이 다 있을수도 있고 이런 애들이 나타날 수 있는데, 이게 초반에는 좀 굉장히 헷깔린다. (실제로 일하다가도 좀 실수를 했음..)

 

해서, 정리를 하자면

 

액터 타입/명칭 배치 위치 클라이언트 배치 조건 각 클라이언트당 개수
GameMode Server Only None 0
GameState Server / Client All Clients 1
PlayerState Server / Client All Clients N
PlayerController Server / Client "Controlled Client Only" 1
Other Controller
(ex. AIController)
Basically Server Only "If you need" 0?
Player Pawn Server / Client All Clients N
HUD / UI Client Only Controlled Client Only 1

 

여기서 제일 골치아픈것이 "PlayerController"

내가 컨트롤중인 클라이언트에서는, 본인의 캐릭터에 연결되어있는 PlayerController를 제외하고, 타인의 PlayerController는 없다고 생각하면 된다.

...혹시나 동기화 필요하다고 PlayerController 갖고와서 하고 있으면 어라 이거 왜 안되지 하는 실수를 할 수 있을것이다..

 

그리고 추가, "이펙트는 동기화가 어떻게되나요" 할 수 있는데

이펙트는 재생 시점 / 재생 위치 / 재생 종류만 동기화가 되고, 직접적인 이펙트 랜더링은 클라이언트에서 각자 해결한다.

 

그야 그럴게, 같은곳에 같은 이펙트가 재생은 되어야하지만, 그게 어떤 모양으로 랜더링 될지는 각자 클라이언트가 판단할 문제니까...

 

 

 

 

 

예전에 작업하다가 좀 어처구니 없는 실수했던것이 기억나서 글로 남겨본다.

+ Recent posts