코가손의 블로그
[ DevLog ] MultiplayerShooter#05 멀티 환경의 무기 픽업 위젯 띄우기(Repilicate, RepNotify) 본문
[ DevLog ] MultiplayerShooter#05 멀티 환경의 무기 픽업 위젯 띄우기(Repilicate, RepNotify)
Cogason 2023. 4. 17. 15:17Pickup Widget
무기 근처에 다가가면 "E-PickUp"을 띄움
무기 클래스에 UWidgetComponent를 Attach
Attach한 위젯, 아래와 같이 설정해주면 "E-PickUP"이 월드에서 플레이어를 바라보는 연출 가능
서버 플레이어가 근처에가면 픽업 위젯 활성화됨,
클라이언트는 근처에 가도 픽업 위젯 활성화 안됨
멀티플레이 게임에서 기본적으로 서버에서만 충돌처리를 확인하기 때문에
클라이언트들은 충돌여부를 서버로부터 받아야함 >> Replicate
변수 Replicate
Replicate변수가 변경되면 서버에서 클라이언트로 전파됨
Replicate할 변수 선언
Replicate변수 등록 함수
OverlappingWeapon의 값이 바뀌면 Replicate됨
결과
OverlappingWeapon포인터 변경되면서 모든 클라에게 전파됨
이제 클라이언트에도 픽업위젯이 뜸
하지만 무기에 다가간 특정 캐릭터에만 Replicate하고 싶다
권한에 따라 Replicate할 머신을 특정할 수 있다
OwnerOnly는 엑터의 소유자에게 Replicate하는 방법,
서버, 클라1, 클라2 가 있고 클라1이 무기에 접근한 상태면
서버, 클라1 에 픽업 위젯이 활성화
OnerOnly는 서버도 가질 수 있는 권한, 클라1만 활성화 하기에는 부적절
이 방법보다는 RepNotify를 사용
RepNofity
Repnotify방식으로 변경
Replicate된 변수가 변하면 클라에서 함수 실행됨
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/
'GameDevLog > UnrealEngine5' 카테고리의 다른 글
언리얼C++ 오브젝트 생성, 애셋 레퍼런싱, 애셋 로딩 (0) | 2023.07.08 |
---|---|
언리얼 게임 프레임워크 (0) | 2023.06.21 |
[ DevLog ] MultiplayerShooter#04 유저 접속 (0) | 2023.04.14 |
[ DevLog ] MultiplayerShooter#03 발광 텍스쳐 (0) | 2023.04.14 |
[ DevLog ] MultiplayerShooter#02 입력방향을 따라 회전하는 캐릭터 (0) | 2023.04.14 |