수정중인 페이지 입니다.

Fusion 106 - 원격 프로시져 호출

개요

RPC(원격 프로시저 호출)는 네트워크 라이브러리의 가장 일반적인 기능 중 하나이며 정규 메소드에 직관적으로 매핑되므로 공유 환경에서 여러 클라이언트를 하나로 모으려고 할 때 가장 쉽게 선택할 수 있지만, 안타깝게도 가장 좋은 선택은 아닙니다.

RPC는 특정 틱에 연결되지 않고 서로 다른 클라이언트에서 서로 다른 시간에 실행되기 때문에 Fusion과 같은 틱 기반 상태 동기화 라이브러리에서 문제가 될 수 있습니다. 그러나 더 중요한 것은 RPC가 네트워크 상태에 속하지 않기 때문에 RPC를 보낸 후 연결하거나 다시 연결한 플레이어 또는 신뢰할 수 없는 RPC가 전송되어 수신되지 않은 플레이어는 RPC의 결과를 볼 수 없습니다.

대부분의 경우 상태 동기화 자체만으로도 플레이어가 정렬된 상태를 유지하는 데 충분하며, 네트워크 속성에 OnChange 리스너를 추가하면 애플리케이션이 실제 상태 자체뿐만 아니라 상태 변화에 관심을 갖는 대부분의 전환 케이스를 처리할 수 있습니다.

RPC를 선택하는 것이 좋은 유스 케이스는 다음과 같습니다:

  1. 놀리는 메시지 또는 플레이어 간에 게임 플레이 상호작용이 아닌 바로 없어져 버리는 것들의 전송
  2. 정확한 시기가 중요하지 않은 게임 내 상점에서 장비를 구입하고 RPC 호출의 직접적인 결과(자금 감소 및 인벤토리에 추가)는 호출한 플레이어에게만 중요합니다(예: RPC를 사용하여 구매를 처리하지 마세요).
  3. 이름, 색상, 스킨과 같은 초기 플레이어 속성을 설정합니다(즉, 플레이어로부터 "레어" 입력의 직접적인 결과입니다). 기본적으로 모든 플레이어 입력이 항목별 입력 구조에서 나에게는 필요하지 않습니다.)
  4. 게임을 시작(게임모드, 맵 선택 또는 호스트에 플레이어 준비 상태 표시).

이 주제에 관해 상세 설명은 매뉴얼을 참고하세요

메인 화면으로

Fusion RPC

RPC가 적합한 몇 가지 경우에는 Fusion을 사용하면 매우 간단합니다. RPC 속성으로 SimulationBehaviour에 대한 기존 메소드에 태그를 지정하고 누가 메소드를 호출하고 누가 호출을 받는지를 표시하기만 하면 됩니다. 메소드의 접두사 또는 접미사(대문자 표시 없음)를 "RPC"를 사용하고 호출할 준비가 되었는지 확인합니다.

다음 예제의 목표는 R 키를 누를 때 다른 모든 플레이어에게 "Hello Mate!" 메시지를 보내는 것입니다.

메인 화면으로

RPC 호출하기

RPC 자체를 추가하기 전에 입력 처리를 확장해야 합니다. RPC 호출은 실제 네트워크 메시지이므로 입력 구조를 확장할 필요가 없습니다. 또한 RPC는 틱 정렬이 되지 않으므로 Fusions 입력 처리를 사용할 필요가 없으므로 Player.cs를 열고 다음을 추가합니다:

private void Update()
{
  if (Object.HasInputAuthority && Input.GetKeyDown(KeyCode.R))
  {
    RPC_SendMessage("Hey Mate!");
  }
}

Object.HasInputAuthority 체크에 주목하세요 - 이 코드가 모든 클라이언트에서 실행되지만, 이 플레이어를 컨트롤하는 클라이언트에서는 RPC를 호출해야 하기 때문입니다.

메인 화면으로

RPC 구현

Player.cs에서 RPC 본문도 추가합니다. [Rpc] 속성으로 태그가 지정되며 메소드 이름은 다음과 같이 "RPC"로 시작합니다:

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

텍스트를 읽기 쉽도록 텍스트 필드의 크기를 전체 화면을 채우도록 변경합니다.


기술문서 TOP으로 돌아가기