코가손의 블로그

[ DevLog ] MultiplayerShooter#05 멀티 환경의 무기 픽업 위젯 띄우기(Repilicate, RepNotify) 본문

GameDevLog/UnrealEngine5

[ DevLog ] MultiplayerShooter#05 멀티 환경의 무기 픽업 위젯 띄우기(Repilicate, RepNotify)

Cogason 2023. 4. 17. 15:17

Pickup Widget

무기 근처에 다가가면 "E-PickUp"을 띄움

무기 클래스에 UWidgetComponent를 Attach

Attach한 위젯, 아래와 같이 설정해주면 "E-PickUP"이 월드에서 플레이어를 바라보는 연출 가능

 

 

서버 플레이어가 근처에가면 픽업 위젯 활성화됨,

클라이언트는 근처에 가도 픽업 위젯 활성화 안됨

서버는 픽업위젯을 띄울 수 있지만 클라이언트들은 띄울 수가 없다

멀티플레이 게임에서 기본적으로 서버에서만 충돌처리를 확인하기 때문에

클라이언트들은 충돌여부를 서버로부터 받아야함 >> Replicate

 

 

변수 Replicate

Replicate변수가 변경되면 서버에서 클라이언트로 전파됨

Replicate할 변수 선언

 

Replicate변수 등록 함수

#include "Net/UnrealNetwork.h"추가해야됨

OverlappingWeapon의 값이 바뀌면 Replicate됨

 

 

결과

OverlappingWeapon포인터 변경되면서 모든 클라에게 전파됨

이제 클라이언트에도 픽업위젯이 뜸

하지만 무기에 다가간 특정 캐릭터에만 Replicate하고 싶다

 

 

권한에 따라 Replicate할 머신을 특정할 수 있다

OwnerOnly는 엑터의 소유자에게 Replicate하는 방법,

서버, 클라1, 클라2 가 있고 클라1이 무기에 접근한 상태면

서버, 클라1 에 픽업 위젯이 활성화

OnerOnly는 서버도 가질 수 있는 권한, 클라1만 활성화 하기에는 부적절

 

 

이 방법보다는 RepNotify를 사용

 

RepNofity

Repnotify방식으로 변경

Replicate된 변수가 변하면 클라에서 함수 실행됨

 

클라1이 무기에 접근한 상황(좌), 서버가 무기에 접근한 상황(우)

Repnotify는 클라에서 실행되는 함수

서버 자신은 영향이 없음, 따로 로직 작성

- SetOverlappingWeapon은 충돌체가 있는 서버에서만 호출됨

- OverlappingWeapon = Weapon으로 OnRep_OverlappingWeapon() 호출

- 서버는 IsLocallyControlled()분기이용, 로직 작성

 

결론

충돌처리는 서버에서만, 클라에게 정보전송 필요

특정한 클라에게 충돌 사실을 알리고 싶은 경우 RepNotify를 이용

위젯이 적절하게 활성화되는 모습

 

+ 위젯 비활성화

RepNotify는 매개변수로 Replicate정의한 변수만 받을 수 있음

OverlappingWeapon이 바뀔 때 Replicate발생

- 무기 충돌 Start : nullptr-> 무기ptr

- 무기 충돌 End : 무기ptr -> nullptr

 

>> RepNotify 발생 + LastWeapon이 nullptr이 아님 == 무기충돌 End, 위젯 비활성화

 

 

+ OnRep vs RPC

참고 :  https://vorixo.github.io/devtricks/stateful-events-multiplayer/

Comments