액터의 준비와 게임의 시작
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)
이다.
'언리얼엔진5 > [Part3] 이득우의 언리얼 프로그래밍' 카테고리의 다른 글
[이득우의 언리얼 프로그래밍 Part3 필기] 6. 액터 리플리케이션 빈도와 연관성 (0) | 2024.04.30 |
---|---|
[이득우의 언리얼 프로그래밍 Part3 필기] 5. 액터 리플리케이션 기초 (0) | 2024.04.29 |
[이득우의 언리얼 프로그래밍 Part3 필기] 4. 액터의 역할과 커넥션 핸드셰이킹 (0) | 2024.04.27 |
[이득우의 언리얼 프로그래밍 Part3 필기] 2. 게임 모드와 로그인 (0) | 2024.04.24 |
[이득우의 언리얼 프로그래밍 Part3 필기] 1. 언리얼 네트웍 멀티플레이어 프레임워크 개요 (0) | 2024.04.23 |