포스트

[Fishnet] ServerRpc, SyncVar

Mirror Network, Netcode, Fishnet 등을 사용해서 Unity Multiplayer 게임을 만드려면 RPC의 개념을 알아야 합니다. RPC란 Remote Procedure Call (원격 프로시저 호출) 의 약자로, 다른 주소 공간에 위치한 함수를 원격으로 호출하여 실행할 수 있도록 해주는 기술입니다.

자세하게 정리되어있는 포스팅이 있어 아래와 같이 캡처해서 가져왔습니다.(출처 표기)

https://co-no.tistory.com/28

[통신] RPC(Remote Procedure Call)의 개념 및 특징 RPC의 개념 : Remote Procedure Call(원격 프로시저 호출)의 약자로, 별도의 원격 제어를 위한 코딩 없이 다른 주소 공간에서 *함수나 **프로시저를 실행할 수 있게 하는 프로세스 간 통신 기술을 말한다. 다시 말해, RPC를 이용하면 프로그래머는 함수 또는 프로시저가 실행 프로그램이 존재하는 로컬 위치에 있든, 원격 위치에 있든 상관없이 동일한 기능을 수행할 수 있음을 의미한다. ※ 함수 vs 프로시저 * 함수(Function) : Input에 따른 Output의 발생을 목적으로 한다. 따라서 Return값을 필… RPC의 개념 : Remote Procedure Call(원격 프로시저 호출)의 약자로, 별도의 원격 제어를 위한 코딩 없이 다른 주소 공간에서 *함수나 **프로시저를 실행할 수 있게 하는 프로세스 간 통신 기술을 말한다. 다시 말해, RPC를 이용하면 프로그래머는 함수 또는 프로시저가 실행 프로그램이 존재하는 로컬 위치에 있든, 원격 위치에 있든 상관없이 동일한 기능을 수행할 수 있음을 의미한다. ※ 함수 vs 프로시저 * 함수(Function) : Input에 따른 Output의 발생을 목적으로 한다. 따라서 Return값을 필…


문서화가 비교적 가장 잘 되어있는 Netcode에서는 ServerRpc와 ClientRpc를 자세히 설명하고 있습니다. (Netcode는 아래 공식 문서 참조) https://docs-multiplayer.unity3d.com/netcode/current/advanced-topics/message-system/clientrpc/

ClientRpc | Unity Multiplayer Networking Servers can invoke a ClientRpc to execute on all clients. Servers can invoke a ClientRpc to execute on all clients.

https://docs-multiplayer.unity3d.com/netcode/current/advanced-topics/message-system/serverrpc/

ServerRpc | Unity Multiplayer Networking Introduction Introduction


파라미터 옵션이 동일하지는 않지만 FishNet에서는 ServerRpc와 ObserverRpc라는 이름으로 동일하게 사용하게 됩니다.

이번 포스팅은 Fishnet에서 ServerRpc와 SyncVar에 대해서 좀더 다루어보겠습니다.

Fishnet에서는 특정 함수에게는 [ServerRpc]라는 태그가 위에 붙어있습니다.

이 [ServerRpc] 태그가 붙은 함수는 반드시 서버가 실행하는 함수입니다. 단, Rpc, 즉 원격으로 요청을 받아야만 실행할 수 있습니다.

이제 쉽게 이해할 수 있도록 예제를 만들어보겠습니다.

Client와 Server가 'Scene'이라는 한 장면에 같이 접속해 있다고 가정해봅시다. Scene에는 두 가지 method가 있고, Client와 Server모두 이 두 method를 알고 이미 있습니다. 하나는 'ServerAreYouAlive()'라는 함수, 다른 하나는 'ServerAnswer()'라는 함수라고 합시다. 또한 ServerAreYouAlive()함수에는 [ServerRpc]라는 원격 프로시저 호출 태그가 붙어있습니다. ServerAreYouAlive라는 함수가 실행되면 ServerAnswer함수가 실행되고 “Yes”가 출력되도록 만들어보았습니다. 한 가지 더 가정하겠습니다. 제가 만든 ServerAreYouAlive()함수는 server에서 자체적으로 실행하지 않고, 원격으로 Client가 호출하게끔만 만들었다고 해봅시다. (함수의 이름도 그에 맞게 지었습니다. ㅎㅎ 클라이언트가 서버에게 살아있냐고 묻는..) 아무튼 그렇습니다. 서버는 클릭이 가능한 UI가 없고, 키보드 인풋 조작을 받지 않기 때문에 클라이언트의 입력에 의존합니다. 클라이언트에서ServerAreYouAlive() 함수를 호출하는 버튼 클릭 이벤트가 일어나게 되면, ServerRpc태그가 붙어있기 때문에 함수의 실행을 직접 하지 않고 서버에게 해달라고 요청하게 됩니다. 서버는 그 요청을 받아서 실행합니다.


조금 더 심화해보자면, ServerRpc에는 소유자(Owner)권한을 명시할 것인지 불분명하게 할 것인지를 선택하는 파라미터도 존재합니다. Fishnet의 경우에는 소유자를 분명히 하는 것이 default true 세팅입니다. 따라서 Client가 Server에게 ServerRpc 함수 실행을 요청할 때 '내'가 요청했다고 같이 알려주게 됩니다. 마치 편지를 쓸때 뒤에 From아무개 하고 발송인을 적어서 보내는 것이지요. 이렇게 되면 답장을 보내는 Server의 입장에서도 꼭 발송인이 누군지 알아야 하는 업무를 할 때에 문제 없이 처리할 수 있습니다. 예를 들어서 Client가 소유한 캐릭터가 damaged되고 spawn과 despawn되어야 하는 상황을 떠올려봅시다. . Server는 어느 Client의 캐릭터가 대미지를 많이 입었는지를 알아야 합니다. 또 예를 들어 Client가 item을 집은 경우, client가 item의 소유자가 누구인지 Server에게 알려주어야 합니다.


이제 SyncVar에 대해 알아봅시다.

SyncVar는 간단히 설명하자면 Server와 Client가 그 값을 동기화해서 항상 똑같이 알고 있는 변수입니다. SyncVar를 사용하면 편리하게 멀티플레이 게임을 만들 수 있지만, 그 네트워킹이 빈번하게 일어나기 때문에 통신 비용이 크다는 단점이 있습니다. 따라서 적당히 꼭 필요할 때에만 사용해주어야 합니다.

혹시 내용이 이해가 잘 안 간다면 더 잘 이해할 수 있도록 직접 작은 프로젝트를 동작시켜 보는 것이 좋습니다. 아래 참고 자료 유투브 링크의 프로젝트가 많은 도움이 됩니다. https://www.youtube.com/watch?v=tpM2sVL3J9M

[영상]

sticker

혹시 RPC에 대해 잘못된 내용이나 정정이 필요한 개념을 발견한다면 댓글로 주시면 고치도록 하겠습니다. 감사합니다.

sticker

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.