언리얼엔진/언리얼 데디케이트 서버

RPC에 대해 - (Remote Procedure Call)

season97 2024. 11. 1. 16:55
728x90
반응형

 개인적인 공부를 위해 포스팅 하는 글입니다.


▶ 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)로 선언하면 가능하다

728x90
반응형

'언리얼엔진 > 언리얼 데디케이트 서버' 카테고리의 다른 글

Variable Replication 변수  (0) 2024.11.01
Authority 와 Replication  (1) 2024.11.01
NetRole  (0) 2024.10.31
NetMode  (0) 2024.10.31