6 - 원격 프로시져 호출
개요
RPC(원격 프로시저 호출)는 네트워크 라이브러리의 가장 일반적인 기능 중 하나이며 정규 메소드에 직관적으로 매핑되므로 공유 환경에서 여러 클라이언트를 하나로 모으려고 할 때 가장 쉽게 선택할 수 있지만, 안타깝게도 가장 좋은 선택은 아닙니다.
RPC는 특정 틱에 연결되지 않고 서로 다른 클라이언트에서 서로 다른 시간에 실행되기 때문에 Fusion과 같은 틱 기반 상태 동기화 라이브러리에서 문제가 될 수 있습니다. 그러나 더 중요한 것은 RPC가 네트워크 상태에 속하지 않기 때문에 RPC를 보낸 후 연결하거나 다시 연결한 플레이어 또는 신뢰할 수 없는 RPC가 전송되어 수신되지 않은 플레이어는 RPC의 결과를 볼 수 없습니다.
대부분의 경우 상태 동기화 자체만으로도 플레이어가 정렬된 상태를 유지하는 데 충분하며, 네트워크 속성에 OnChange 리스너를 추가하면 애플리케이션이 실제 상태 자체뿐만 아니라 상태 변화에 관심을 갖는 대부분의 전환 케이스를 처리할 수 있습니다.
RPC를 선택하는 것이 좋은 유스 케이스는 다음과 같습니다:
- 놀리는 메시지 또는 플레이어 간에 게임 플레이 상호작용이 아닌 바로 없어져 버리는 것들의 전송
- 정확한 시기가 중요하지 않은 게임 내 상점에서 장비를 구입하고 RPC 호출의 직접적인 결과(자금 감소 및 인벤토리에 추가)는 호출한 플레이어에게만 중요합니다(예: RPC를 사용하여 구매를 처리하지 마세요).
- 이름, 색상, 스킨과 같은 초기 플레이어 속성을 설정합니다(즉, 플레이어로부터 "레어" 입력의 직접적인 결과입니다). 기본적으로 모든 플레이어 입력이 항목별 입력 구조에서 나에게는 필요하지 않습니다.)
- 게임을 시작(게임모드, 맵 선택 또는 호스트에 플레이어 준비 상태 표시).
Fusion RPC
RPC가 적합한 몇 가지 경우에는 Fusion을 사용하면 매우 간단합니다. RPC 속성으로 SimulationBehaviour
에 대한 기존 메소드에 태그를 지정하고 누가 메소드를 호출하고 누가 호출을 받는지를 표시하기만 하면 됩니다. 메소드의 접두사 또는 접미사(대문자 표시 없음)를 "RPC"를 사용하고 호출할 준비가 되었는지 확인합니다.
다음 예제의 목표는 R
키를 누를 때 다른 모든 플레이어에게 "Hello Mate!" 메시지를 보내는 것입니다.
RPC 호출하기
RPC 자체를 추가하기 전에 입력 처리를 확장해야 합니다. RPC 호출은 실제 네트워크 메시지이므로 입력 구조를 확장할 필요가 없습니다. 또한 RPC는 틱 정렬이 되지 않으므로 Fusions 입력 처리를 사용할 필요가 없으므로 Player.cs
를 열고 다음을 추가합니다:
C#
private void Update()
{
if (Object.HasInputAuthority && Input.GetKeyDown(KeyCode.R))
{
RPC_SendMessage("Hey Mate!");
}
}
Object.HasInputAuthority
체크에 주목하세요 - 이 코드가 모든 클라이언트에서 실행되지만, 이 플레이어를 컨트롤하는 클라이언트에서는 RPC를 호출해야 하기 때문입니다.
RPC 구현
Player.cs
에서 RPC 본문도 추가합니다. [Rpc]
속성으로 태그가 지정되며 메소드 이름은 다음과 같이 "RPC"로 시작합니다:
C#
private Text _messages;
[Rpc(RpcSources.InputAuthority, RpcTargets.All)]
public void RPC_SendMessage(string message, RpcInfo info = default)
{
if (_messages == null)
_messages = FindObjectOfType<Text>();
if (info.Source == Runner.Simulation.LocalPlayer)
message = $"You said: {message}\n";
else
message = $"Some other player said: {message}\n";
_messages.text += message;
}
RPCSources.InputAuthority
그리고 RPCTargets.All
파라미터는 Fusion에게 플레이어에 대한 입력 권한이 있는 클라이언트만 이 메소드를 호출하도록 허용하고 모든 클라이언트에서 실행하도록 합니다.
코드 자체는 씬의 텍스트 필드를 검색하여 메시지를 추가하기만 하면 됩니다. 따라서 테스트하려면 Text 컴포넌트를 추가하십시오.
GameObject > UI > Text
텍스트를 읽기 쉽도록 텍스트 필드의 크기를 전체 화면을 채우도록 변경합니다.
Back to top