Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

UnrealEngineer

[ UnrealEngine5 ] 연결과 오너 본문

언리얼엔진5

[ UnrealEngine5 ] 연결과 오너

UnrealEngineer 2024. 8. 21. 16:48

- 액터의 준비와 게임의 시작

 

PostInitializeComponents() : 액터의 초기화에 사용되는 함수 But 네트워크 기능 X

그래서 PostNetInit() 함수가 서버로부터 변경된 내용을 전달 받아서 원격 클라이언트의 액터 셋팅이 마무리 될때 호출

 


- 실습(PreLogin 함수에 ErrorMessage 발생)

PreLogin에서 ErrorMessage가 발생하여 서버에 접속을 실패하였고 그러므로 더이상 서버는 할 일이 없고 사용자는 StandAlone 형태로 전환된다.

 


- 실습 (PostIninitializeComponents → PostNetInit → BeginPlay)

 

(서버)Login 단계에서 플레이어컨트롤러를 만들어야하기 때문에 PostInitializeComponents()가 호출

 

클라이언트에서는 PostInitializeComponents()가 먼저 호출되어서 초기화(서버로 부터 '변경된' 속성 값을 전달받는다.)가 완료되면 PostNetInit() 함수가 호출된다.

 


 

 

1. PlayerController = 액터 : PlayerController로 전달된 명령은 NetConnection 클래스로부터 관리된다.

2. UNetConnection 클래스 : 상위에서 네트워크 통신을 담당하는 클래스 (상위 명령어를 로우 레벨 데이터로 변환)

3. UNetDrive 클래스 : UNetConnection에서 정돈된 데이터를 통신하는 역할

 

◈ 즉, 현재 월드에 NetDriver가 없으면 StandAlone, 있으면 Server-Client로 판단

◈ 내부적으로 월드가 구동될때, 서버는 월드에 Listen() 함수를 호출해서 NetDriver를 생성한다.

 

NetDrive

1. 서버의 NetDriver는 다수의 커넥션을 가지고, 클라이언트의 NetDrive는 하나의 커넥션을 가진다.

2. NetDriver는 다수의 커넥션을 관리하며, 서버와 클라이언트에 따라 다르게 동작한다.

 

 NetDriver::IsServer() 

+ 클라이언트는 항상 서버 커넥션을 가진다. → ServerConnection == null 이면 Server

ServerConnection != null이면 클라이언트로 판단할 수 있다.

 

 

클라이언트는 하나의 ServerConnection을 가지고

서버는 접속한 클라이언트의 숫자만큼의 ClientConnection을 가진다.

 

 


- 연결과 오너쉽

액터가 통신을 하기 위해서는 자신을 소유한 액터가 커넥션을 소유하고 있어야한다.

일반적으로 PlayerController는 NetConnection을 소유하고 있고

NetConnection 역시 PlayerController를 소유하고 있다.

 

1. Actor::GetNetConnection()

2. PlayerController::GetNetConnection()

 

플레이어컨트롤러는 '서버'와의 연결을 담당한다.

하지만 플레이어컨트롤러에서만 유효한 연결을 담당하는 것이 아니다.

이때, GetNetConnection()이 역할을 한다.

 

액터에서 '리플리케이션' 작업을 수행하기 위해서 GetNetConnection() 함수를 호출해서 '액터의 연결'을 가져온다.

액터의 연결을 확인해서 유효하면 '리플리케이션' 작업을 수행한다.

 

GetNetConnection() 함수는 Actor나 Pawn의 Owner가 있으면 Owner를 반환하고 없으면 null값을 반환한다.

 

즉, 액터가 통신을 진행할때 Owner가 존재해야만 통신이 진행된다.

 

 

서버에서는 PossessedBy() 함수에 의해서 플레이어 컨트롤러가 Owner로 설정된다.

 

클라이언트에서는 빙의가 되지 않는다 즉, OnPossesse() 함수가 호출되지 않는다. 

 

클라이언트에서는 Owner가 변경되면 OnRep_Owner 함수를 통해 동기화된다.