처음 게임 창이 떴을 때 채팅 입력 창에 플레이어의 이름을 보이게 하고 싶어서, SetupHUD() 함수에 빨간 박스 코드를 추가하고
실행 해보니, 또 서버에만 잘 나오고 클라이언트에는 안나왔다
디버깅을 해보니 서버의 PlayerState는 잘 나오는데, 클라이언트의 PlayerState는 nullptr 이였다
왜 그런가 찾아봤는데, PlayerController가 있어도 PlayerState가 nullptr일 수 있다는 정보는 간간히 볼 수 있었는데, "왜" 는 찾을 수가 없었다
그래서 ChatGpt한태 물어보니 Unreal Engine의 Replication의 특징이라고 해야하나 동작 방식이라고 해야하나, 뭐 이런 것들 때문에 nullptr로 나올 수도 있다고 하였다
약간 설명해보자면,
일단 언리얼에서 Property Replication은
1. 업데이트 루프를 돌면서 처리되고
2. 처리될 때 최적화를 위해 Actor 별로 묶음으로 보내고
3. 이 Actor들의 리플리케이션은 독립적으로 처리되고
4. TCP를 사용하지만, 성능을 위해 순서를 보장하지 않는 경우도 있음
그리고 PlayerController와 PlayerState는 트러블 슈팅2의 내용대로 서버에서 만들어지는데, 이걸 클라이언트 쪽으로 리플리케이션를 해야 클라이언트에서 사용할 수가 있음
그래서 리플리케이션을 했는데 위의 리플리케이션 특징들 때문에 PlayerState가 리플리케이션이 안되서 nullptr로 나올 수 있다고 한다
이를 해결하는 방법 중에 OnRep_PlayerState()를 사용하는 것이 있어 해봤는데 (SetupHUD()의 빨간 박스 부분을 지우고)
OnRep_PlayerState()
는 PlayerState가 네트워크를 통해 클라이언트로 복제(Replication)되었을 때 자동으로 호출되는 함수OnRep_@@@()
: Replicated 변수의 값이 서버에서 바뀌고, 그 값이 클라이언트로 동기화된 후, 오직 클라이언트에서만 자동으로 호출되는 함수이번에는 서버에서 UI가 제대로 나오지 않았다. 생각해보면 당연한 것임. 서버는 리플리케이션을 할 필요가 없으니 OnRep_PlayerState가 호출되지 않음
그래서 SetupHUD()의 빨간 박스 부분에 if(HasAuthority())
를 추가해서 서버인 경우에만 바로 UI를 업데이트 하도록 하니 잘 동작하였다