언리얼 엔진 본캠프 14주차-7 언리얼 엔진 C++ : 야구 게임 - 트러블 슈팅2

정재훈·2025년 3월 23일
0

unreal engine

목록 보기
32/45

트러블 슈팅2

RepNotify

플레이어마다 독립적인 시도 횟수를 가지고 있어야하니까 시도 횟수를 저장할 변수를 PlayerState에 만들어 놓고, 이걸 서버(GameMode)에서 적절한 입력을 받았을 때 횟수를 줄이기 위해 RepNotify를 이용하기 위해 ReplicatedUsing 지정자를 사용함

근데 빌드를 해보니 링크 에러 발생

찾아 보니 ReplicatedUsing 또는 Replicated 지정자를 사용할려면 GetLiftimeReplicatedProps() 함수를 오버라이드 해야 했다.

  • GetLiftimeReplicatedProps() 내부에 DOREPLIFETIME() 매크로가 보이는데, 이 매크로는 리플리케이션 대상 변수를 등록하는 매크로임
  • 해당 매크로를 사용하기 위해선 #include "Net/UnrealNetwork.h" 해야함

UPROPERTY(ReplicatedUsing)은 언리얼 리플렉션 시스템에 해당 변수가 리플리케이션될 수 있다고 "알려"주는 거고, DOREPLIFETIME()은 이 변수를 실제로 리플리케이션 될 수 있도록 "등록"하는 것

다 만들고 나서 보니 ReplicatedUsing으로 하는 일이 없음
그냥 Replicated로 변경하고 OnRep_@@@()함수도 지워도 됨

ReplicatedUsing은 리플리케이션 되는 변수의 값이 서버에서 바뀌고, 그 값이 클라이언트로 리플리케이션 됬을 때, 클라이언트에서 자동으로 호출될 함수를 바인딩 하는 것

즉, On_Rep@@@() 함수는 클라이언트 측에서만 호출됨
=> 값이 변경되었을 때 클라이언트 측에서 작업을 해야하는 상황이 있으면 그 때 사용해야 함


PlayerState 생성 시기

PlayerState는 정상적인 상황이라면 PlayerController가 생성될 때 함께(?) 생성됨

  • 클라이언트가 서버에 접속하면 AGameModeBase의 Login()이 호출되고
  • AGameModeBase의 SpawnPlayerController() 시리즈에 의해, 월드 세팅이나 프로젝트 세팅에 지정한 PlayerController가 스폰되고
  • APlayerController의 PostInitializeComponents()에서 InitPlayerState()가 호출되고
    • PostInitalizeComponents()는 BeginPlay() 전에 호출됨(라이프 사이클)
  • AController의 InitPlayerState()에서 월드 세팅이나 프로젝트 세팅에 지정한 PlayerState를 스폰하고, 멤버 변수로 가지고 있는 PlayerState에 할당

PlayerState 리플리케이션

클라이언트가 서버에 접속하면, 클라이언트에게 이름을 붙여주기 위해 GameMode의 PostLogin()에서 PlayerState의 PlayerName에 적절한 이름을 붙여주도록 하였다

막상 실행해보니 이름이 비어있었음

중단점을 찍어가면서 보니 서버는 이름이 잘 할당되었는데, 클라이언트들은 이름이 비어있었고, 출력된 로그를 보니

서버 측 PlayerController에만 로그가 떴음(생각해보니 이건 당연한거임, GameMode는 서버니까)

근데 여기서 간과한게 트러블 슈팅1의 UI를 AddToViewport()하는 부분에서 PlayerController는 서버에서 만들어서 클라이언트로 복제를 해준다는 부분이다

즉, (서버에서 만든 PlayerController의)PlayerState와 (클라이언트로 복사된 PlayerController의)PlayerState 두 개가 생기고, 서버에서 값이 바뀌면 클라이언트 쪽도 바뀌도록 해야함 => Replicate를 해야함

PlayerState는 기본적으로 bReplicated = true 설정이 되어 있음.
그렇다고 PlayerState의 변수들도 Replication이 되는건 아님

  • 각 변수마다 리플리케이션 지정을 해야 함

➡️ PlayerState의 PlayerName에 Replicated 지정자를 붙여주니 잘 동작함








참조 사이트
-- RepNotify
1. https://velog.io/@ryan_ur/Unreal-Replication
2. https://lemonyun.tistory.com/137
3. https://bio200127.tistory.com/213
4. https://dev.epicgames.com/documentation/en-us/unreal-engine/property-replication?application_version=4.27
-- PlayerState
1. https://diesuki4.tistory.com/695

profile
드가자

0개의 댓글