Make Unreal REAL.
article thumbnail
Unreal Engine 5 C++ Multiplayer Shooter

 

서버에서 조종 중인 캐릭터가 무기와 겹치지 않는 이상, 서버에서도 다른 캐릭터로 인해 획득 위젯을 띄울 필요는 없다.

 

따라서, Tick() 함수에서 위젯을 띄우던 부분은 제거한다.

 

 

RepNotify 함수는 복제된 변수의 업데이트를 수신할 때마다 호출되는 콜백 함수다.

  • UFUNCTION() 매크로를 지정해야 한다.
  • "OnRep_변수명" 명명 규칙을 사용한다.

 

복제된 변수에는 UPROPERTY(ReplicatedUsing = RepNotify 함수) 매크로를 지정해준다.

 

 

OverlappingWeapon의 값이 NULL로 변경된 것이 아니라면 획득 위젯을 띄우도록 한다.

 

 

서버에서 캐릭터 2가 무기와 겹치면서 OverlappingWeapon 값이 변경됐고, 소유자인 클라이언트 2에게만 업데이트가 전송되었다.

 

클라이언트 2만 서버의 업데이트를 수신했으므로, 2에서만 OnRep_OverlappingWeapon() RepNotify 함수가 실행되어 획득 위젯이 띄워진다.

 

 

그런데, Listen 서버에서 플레이 중인 캐릭터를 조작해 무기와 겹치면 획득 위젯이 표시되지 않는다.

 

리플리케이션은 항상 서버 -> 클라이언트 단방향으로만 진행되고, 서버는 업데이트를 전송하는 주체이므로 RepNotify를 받을 수 없다.

 

 

따라서, 서버에서는 별도의 로직을 통해 획득 위젯을 띄워줘야 한다.

 

OverlappingWeapon의 Setter를 inline 함수에서 일반 함수로 변경한다.

 

 

현재 SetOverlappingWeapon() 함수는 서버의 Weapon이 캐릭터와 겹칠 때, 서버에서만 호출된다.

 

이 경우, OverlappingWeapon의 복제는 수행되지 않는다.

  • 등록 시 COND_OwnerOnly로 등록해 소유자에게만 업데이트를 전송하는데, 소유자가 업데이트를 수신할 수 없는 서버이기 때문이다.

 

APawn::IsLocallyControlled() 함수는 실제 폰을 조종하고 있는 머신에서만 true가 반환된다.

  • 사실 현재는 서버에서만 이 함수가 호출되기 때문에 검사하지 않아도 된다.

 

 

서버에서는 RepNotify가 아닌, 별도의 로직을 통해 획득 위젯을 띄웠다.

 

 

이제 겹침이 끝났을 때 위젯을 숨기도록 해본다.

 

 

겹침을 판별하는 구의 OnComponentEndOverlap 델리게이트에 함수를 등록하고 구현한다.

 

 

이제 서버에서 겹침이 끝나면 소유자(서버가 아닌 경우)의 머신에 NULL로 업데이트하라는 요청이 전송된다.

 

RepNotify는 콜백 함수이기 때문에, RepNotify 함수가 실행되는 시점에, 소유자의 OverlappingWeapon 값은 이미 NULL이 되어 있다.

 

이를 해결하기 위해 업데이트 전 마지막 값을 RepNotify에서 함께 받도록 한다.

  • RepNotify 함수는 직접 호출하는 함수가 아니므로, 업데이트 전 마지막 값을 저장하는 인자만 추가로 받을 수 있다.

 

겹쳤을 때는, OverlappingWeapon에 값이 설정되어 있고 LastWeapon은 NULL이다.

겹임이 끝났을 때는, OverlappingWeapon은 NULL이고 LastWeapon에는 값이 설정되어 있다.

 

 

이번에도 클라이언트에서는 위젯이 잘 사라지나, 서버에서는 작동하지 않는다.

  • 업데이트를 수신할 수 없는 RepNotify에서만 처리해줬기 때문이다.

 

 

이번에도 서버의 무기 겹침을 통해 서버에서만 호출되는 SetOverlappingWeapon() 함수에 로직을 구현한다.

 

 

클라이언트는 RepNotify 함수를 통해 획득 위젯을 처리했고, 서버는 서버에서만 수행되는 별도의 로직을 통해 위젯을 처리했다.

 

'Unreal Engine > UE5 C++ Multiplayer Shooter' 카테고리의 다른 글

RPC (Remote Procedure Call)  (0) 2023.04.04
무기 장착  (0) 2023.04.04
변수 리플리케이션  (0) 2023.04.03
무기 획득 위젯 띄우기  (0) 2023.04.02
Weapon 클래스 생성  (0) 2023.04.01
profile

Make Unreal REAL.

@diesuki4

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그