※ 개인적인 공부를 위해 포스팅 하는 글입니다.
▶ RPC란? (Remote Procedure Call) 원격 함수 호출.
ㆍ 한마디로 정리하면 말 그대로 Remote(원격으로) 함수를 호출한다. 끝
https://season97.tistory.com/171
ㆍ 이전에 포스팅 한 글인데.. Variable(변수) 리플리캐이션이던 Authority와 리플리캐이션이든.. 서버에서 클라이언트로 뿌려줘야 하는 구조라고 했다... 근데 실제 게임에선 클라이언트 에서 서버에 요청해야 하는 상황도 꽤나 많다.
# RPC는 클라든 서버든 반대쪽에다 함수를 실행하라고 명령하는 개념
# 실습하면서 해보자
ㆍ 변수 리플리케이션을 일단 None으로 바꿔보고 커스텀 이벤트를 생성해 봤다.
1. 멀티캐스트
ㆍ 모두에게 뿌려주겠단 소리다. 이 옵션은 반드시 서버에서 실행되어야 겠다, 중앙 서버가 있는 데디케이트 구조에서
클라이언트에서 멀티캐스트를 해봤자 아무 기능도 일어나지 않을 것이다.
ㆍ 브로드캐스트 라고도 부른다.
ㆍ 체크하지 않으면.. UDP 방식은 중간에 분실 될 가능성이 있는데 절대 분실되질 않길 원하면 체크하면 된다.
ㆍ Chane Color MULTI를 타고 올거고
ㆍ 그 부분에서 이렇게 멀티캐스트로 모두에게 뿌려줄거다! 라는 뜻
※ 기능은 이전 포스팅인 Veriable 방식이랑 동일하지만 RPC방식으로 변경해 Multi Cast (Brode Cast)로 뿌려줘
동기화 시키고 있는 방식으로 변경된 것 !
※ 그럼 뭐가 더 나을가?
ㆍ 두 상황이 다 가능하다면 변수로 쓰는게 좋다.
패킷의 용량을 줄일 수 있고, 변수로 할때는 일정 주기를 설정해 일정 주기마다 한번에 처리하는 방법도 생각할 수 있다.
ㆍ 하지만 RPC 방식은 호출되는 순간 GO. 변수는 최적화 여지가 많다.
굳이굳이 하자면 배그 자기장을, 자기장 생성해주세요! 하고 방송하는 방식으로 써볼 수 있겠다..
어떤 상황에서 뭐가 더 나을지는 잘 고민해 보도록 하자.
2. 서버에서 실행
ㆍ 야. 이 함수좀 서버에서 실행해줘! 라고 클라에서 서버로 요청을 보내는 것
-> 클라가 랜덤하게 서버를 바꾼 상태이고, 서버에게 바꿔달라고 요청을 한 상태
ㆍ 이렇게 하면 뭐가 될까?
ㆍ 아무런 일도 일어나지 않는다... 클라에서 서버로 요청을 보낸줄 알았는데 왜?
ㆍ 힌트는 요놈한테 있다. 소유는 클라이언트?
ㆍ 언리얼에서 스폰을 보면 Owner. 소유주를 입력 받을 수 있는 칸이 있다.
- 이 개념이 왜 등장할까?
한번 잘 생각해보자. 나는 플레이어1 시즌 이다. 그리고 저 옆에 플레이어2 티스토리가 있다
근데 티스토리가 갑자기 시즌의 무기를 없애줘! 라고 서버가 요청했을때 들어주면 그건 말이 안되겠지?
그래서 Owner 즉 소유주라는 개념이 등장한 것이다..
따라서 지금은 이 Box의 소유권을 넘겨줘야 한다.
ㆍ 소유권을 주기 위한 Collision 영역을 하나 더 생성했다.
ㆍ 클라에서 서버에 요청을 보내고 변경할거니 이렇게 해줘야 한다!
ㆍ 근데 그냥 넘기면 누가 오너인지 중요하지 않게 그냥 서버의 색상이 다 변하고있다;;
ㆍ 이유는 클라에서 클라끼리도 서로 연동이 되고 Simutated로 그려주고있는 상황이다 그럼 해결하려면 어케해야할까?
ㆍ 내가 주인인지 한번 체크해주는 과정이 들어가면 되겠다.
3. 소유중인 클라이언트에서 실행
ㆍ 서버가 실행하는것이고 서버가 클라에게 패킷을 보내줘서 색상을 바꿔주세요~ 라는거를 노리는 상황
ㆍ 거의 비슷해서 설명은 생략
ㆍ 오너의 큐브 색상이 바뀐다. 근데 오너가 없는 상황에서가 조금 특이한 상황이 나온다.
ㆍ 오너쉽이 없을땐 누가 들어가든 서버의 색상이 바뀐다...
ㆍ 음.. 받아들이자... 클라이언트한테 보낼땐 오너가 없으면 서버가되는데 뭐 신기할 뿐 받아들이면 되겠다
※ 중요한건 RPC가 무엇이고 어떤식으로 활용할 수 있을지를 생각해보는 것이 중요할 것 같다.
# C++코드로도 간단하게 한번 보자
ㆍ 옵션은 매우 직관적이다. 내가 에디터를 한글로 해놔서 매치가 잘 안되는거 같은데 에디터 영어로하면 찰떡이다
ㆍ Implementation키워드를 붙힘으로 서버에서 호출될 때 그 부분이 살행될 때 클라에선 이 부분이 실행된다
ㆍ 서버 부분에선 Validate라는 키워드로 문제가 있는 클라이언트까지 설정할 수 있다.
UFUNCTION(Server, Reliable,WithValidation)로 선언하면 가능하다
'언리얼엔진 > 언리얼 데디케이트 서버' 카테고리의 다른 글
Variable Replication 변수 (0) | 2024.11.01 |
---|---|
Authority 와 Replication (1) | 2024.11.01 |
NetRole (0) | 2024.10.31 |
NetMode (0) | 2024.10.31 |