< [이득우의 언리얼 프로그래밍 Part3 필기] 3. 커넥션과 오너십

언리얼엔진5/[Part3] 이득우의 언리얼 프로그래밍

[이득우의 언리얼 프로그래밍 Part3 필기] 3. 커넥션과 오너십

Rocketbabydolls 2024. 4. 25. 20:25

액터의 준비와 게임의 시작

 

 

 

PostInitializeComponents 는 게임과 무관한 액터 설정의 초기화 함수이다. 따라서 네트워크 접속 클라이언트를 위해 PostNetInit 함수를 제공한다.

 

PostNetInit 은 원격 클라이언트에서 호출되는데 서버에서 변경된 내용, 속성, 다양한 값들을 모두 전달받아 액터 세팅이 모두 마무리 될 때 호출된다.

 

 

하이레벨

 

게임을 구성하는 단위인 액터, 컴포넌트 , 월드 등 이 콘텐츠를 구성하는 오브젝트의 상태와 속성에 관련된 상위 개념

 

 

로우레벨

 

위 같은 상태와 속성을 네트웤을 통해 전달하기 위해 만들어진 데이터 스트림

 

 

네트웍 통신을 담당하는 주요 클래스

 

 

 

PlayerController : 네트워크 커넥션을 관리하는 콘텐츠를 대표하는 액터 

UNetConnection : 상위에서 네트워크 통신을 담당하는 클래스 , 상위 명령어를 로우 레벨 데이터로 변환할 수 있는 기초 작업 담당

UNetDriver : UNetConnection에서 정돈된 데이터를 실제 네트워크상으로 보냄 

 

클라이언트는 역순으로 그대로 진행

 

서버에서는 possess 가 일어나지만

다른 클라이언트에서는 오너값이 동기화됌

 

 

현재 월드에 넷드라이버가 있으면 클라이언트-서버, 아니면 스탠드얼론으로 판단

 

서버는 월드의 Listen함수를 호출해 넷드라이버를 생성함으로 네트웍 기능을 시작함.

bool UWorld::Listen( FURL& InURL ) -> 넷 드라이버 만들어줌

ENetMode UNetDriver::GetNetMode() const -> NetMode 반환

 

넷드라이버의 커넥션 관리

 

 

넷드라이버가 모드에 따라 다수의 커넥션을 소유

서버인 경우에는 다수의 클라이언트 커넥션을 소유

모드가 클라이언트라면 넷드라이버는 하나의 서버 커넥션만 소유

 

 

액터와 그 접속 소유

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

 

액터와 그 접속 소유

멀티플레이어에서 서버의 역할에 대한 개요입니다.

docs.unrealengine.com

 

로그 분석

LogABNetwork: [STANDALONE] AABGameMode::Login Begin
LogABNetwork: [STANDALONE] AABGameMode::Login End
LogABNetwork: [STANDALONE] AABGameMode::PostLogin Begin
LogABNetwork: [STANDALONE] AABPlayerController::OnPossess Begin BP_ABPlayerController_C_0
LogABNetwork: [STANDALONE] AABCharacterPlayer::PossessedBy Begin ABCharacterPlayer_0
LogABNetwork: [STANDALONE] AABCharacterPlayer::PossessedBy No Owner
LogABNetwork: [STANDALONE] AABCharacterPlayer::PossessedBy Owner : BP_ABPlayerController_C_0
LogABNetwork: [STANDALONE] AABCharacterPlayer::PossessedBy End ABCharacterPlayer_0
LogABNetwork: [STANDALONE] AABPlayerController::OnPossess End
LogABNetwork: [STANDALONE] AABGameMode::PostLogin No NetDriver
LogABNetwork: [STANDALONE] AABGameMode::PostLogin End
LogABNetwork: [SERVER] AABGameState::HandleBeginPlay Begin No Owner
LogABNetwork: [SERVER] AABPlayerController::BeginPlay Begin BP_ABPlayerController_C_0
LogABNetwork: [SERVER] AABPlayerController::BeginPlay End
LogABNetwork: [SERVER] AABCharacterPlayer::BeginPlay Begin ABCharacterPlayer_0
LogABNetwork: [SERVER] AABCharacterPlayer::BeginPlay End ABCharacterPlayer_0
LogABNetwork: [SERVER] AABGameState::HandleBeginPlay End

 

 

[STANDEALONE]

 

Login -> 플레이어 컨트롤러 생성

PostLogin -> 입장을 위해 기본 설정을 모두 마무리

   OnPossess -> Pawn 에 빙의

       PossessedBy -> 네트워크, 컨트롤러 등 다양한 설정 수행

       PossessedBy End

   OnPossess End
PostLogin -> Netdriver의 여부 확인

PostLogin End

     

[SERVER]

HandleBeginPlay Begin -> Gamestate에서 날아온 명령

   Controller BeginPlay 

   Controller BeginPlay End

   Character BeginPlay 

   Character BeginPlay End

HandleBeginPlay End

 

 

 

++++ 클라이언트 추가 시)

LogABNetwork: [SERVER] AABGameMode::PreLogin ============================================================
LogABNetwork: [SERVER] AABGameMode::PreLogin Begin
LogABNetwork: [SERVER] AABGameMode::PreLogin End
LogABNetwork: [SERVER] AABGameMode::Login Begin
LogABNetwork: [SERVER] AABPlayerController::BeginPlay Begin BP_ABPlayerController_C_1
LogABNetwork: [SERVER] AABPlayerController::BeginPlay End
LogABNetwork: [SERVER] AABGameMode::Login End
LogABNetwork: [SERVER] AABGameMode::PostLogin Begin
LogABNetwork: [SERVER] AABCharacterPlayer::BeginPlay Begin ABCharacterPlayer_1
LogABNetwork: [SERVER] AABCharacterPlayer::BeginPlay End ABCharacterPlayer_1
LogABNetwork: [SERVER] AABPlayerController::OnPossess Begin BP_ABPlayerController_C_1
LogABNetwork: [SERVER] AABCharacterPlayer::PossessedBy Begin ABCharacterPlayer_1
LogABNetwork: [SERVER] AABCharacterPlayer::PossessedBy No Owner
LogABNetwork: [SERVER] AABCharacterPlayer::PossessedBy Owner : BP_ABPlayerController_C_1
LogABNetwork: [SERVER] AABCharacterPlayer::PossessedBy End ABCharacterPlayer_1
LogABNetwork: [SERVER] AABPlayerController::OnPossess End
LogABNetwork: [SERVER] AABGameMode::PostLogin Client Connections : IpConnection_1
LogABNetwork: [SERVER] AABGameMode::PostLogin End
LogABNetwork: [CLIENT1] AABPlayerController::PostNetInit Begin BP_ABPlayerController_C_0
LogABNetwork: [CLIENT1] AABPlayerController::PostNetInit Server Connection : IpConnection_0
LogABNetwork: [CLIENT1] AABPlayerController::PostNetInit End
LogABNetwork: [CLIENT1] AABCharacterPlayer::OnRep_Owner Begin ABCharacterPlayer_0
LogABNetwork: [CLIENT1] AABCharacterPlayer::OnRep_Owner End ABCharacterPlayer_0
LogABNetwork: [CLIENT1] AABCharacterPlayer::PostNetInit Begin ABCharacterPlayer_0
LogABNetwork: [CLIENT1] AABCharacterPlayer::PostNetInit End
LogABNetwork: [CLIENT1] AABCharacterPlayer::PostNetInit Begin ABCharacterPlayer_1
LogABNetwork: [CLIENT1] AABCharacterPlayer::PostNetInit End
LogABNetwork: [CLIENT1] AABGameState::OnRep_ReplicatedHasBegunPlay Begin No Owner
LogABNetwork: [CLIENT1] AABPlayerController::BeginPlay Begin BP_ABPlayerController_C_0
LogABNetwork: [CLIENT1] AABPlayerController::BeginPlay End
LogABNetwork: [CLIENT1] AABCharacterPlayer::BeginPlay Begin ABCharacterPlayer_0
LogABNetwork: [CLIENT1] AABCharacterPlayer::BeginPlay End ABCharacterPlayer_0
LogABNetwork: [CLIENT1] AABCharacterPlayer::BeginPlay Begin ABCharacterPlayer_1
LogABNetwork: [CLIENT1] AABCharacterPlayer::BeginPlay End ABCharacterPlayer_1
LogABNetwork: [CLIENT1] AABGameState::OnRep_ReplicatedHasBegunPlay End

 

1번이 입장했으므로 컨트롤러 생성 후 빙의해서 서버(0번) 에게 보여줌

클라이언트에서는 프록시를 레플리케이션을 통해 보여주어야 하므로 PostNetInit에서 컨트롤러 생성.

그리고 OnRep_Owner 레플리케이션 함수를 통해 클라이언트의 조작 폰을 빙의 동기화 해준다. 

 

서버 폰의 PostNetInit 도 해준 후 (PostNetInit 함수는 Actor를 받고 있는 하위 클래스에서 전부 호출됌)

 

 

같은 방식으로 OnRep_ReplicatedHasBegunPlay 를 통해 Beginplay 호출

 

주의) 서버 입장에서는 클라이언트가 1번,  클라 입장에서는 서버가 1번이다.

 

 

++추가)

 

이제까지 플레이어컨트롤러를 말 그대로 컨트롤러라고 생각했던 나를 반성하자... 사실상 

 

플레이어 컨트롤러 (X)

플레이어 서버 컨트롤러 (O)

 

이다.