This document is about: FUSION 2
SWITCH TO

5 - RPCs

개요

마지막 섹션에는 네트워크 속성이 추가되어 플레이어의 색상을 다른 모든 플레이어와 동기화할 수 있습니다. 플레이어는 자신의 네트워크 속성에 StateAuthority을 가지고 있기 때문에 직접 색상 값을 업데이트할 수 있습니다.

그러나 이는 StateAuthority이 다른 클라이언트인 NetworkObjects의 네트워크 속성에서는 작동하지 않습니다.

이 섹션에는 다른 플레이어의 네트워크 속성을 수정해야 하는 경우 플레이어를 공격하고 플레이어의 체력을 줄이는 예가 포함되어 있습니다.

다른 플레이어 네트워크 속성 수정

다른 클라이언트가 상태 권한을 가지고 있는 네트워크 속성을 변경하는 방법은 개체의 StateAuthority에 RPC(원격 프러시저 호출)를 전송하여 네트워크 속성을 변경하도록 하는 것입니다.

네트워크 속성의 값을 코드별로 변경할 수 있습니다. 변경 사항은 로컬에서만 적용되며 네트워크를 통해 복제되지 않습니다.

그 예로는 레이캐스트 무기로 플레이어를 쏘는 것이 있습니다. Fusion 공유 모드의 경우 플레이어가 로컬에서 레이캐스트를 수행하고 타깃에 명중하면 타깃에 대미지를 입힙니다. 서버/호스트 모드의 레이캐스트 무기에 대한 접근 방식은 다릅니다. 서버/호스트 모드의 예로는 Fusion 발사체 샘플을 확인하십시오.

새 스크립트를 만들고 Health라고 이름 붙입니다. 네트워크화된 속성과 변경 감지 기능을 추가하여 변경 사항을 체력 값에 기록합니다:

C#

using Fusion;
using UnityEngine;

public class Health : NetworkBehaviour
{
    [Networked, OnChangedRender(nameof(HealthChanged))]
    public float NetworkedHealth { get; set; } = 100;
    
    void HealthChanged()
    {
        Debug.Log($"Health changed to: {NetworkedHealth}");
    }
}

다음으로 적 플레이어에게 피해를 입히기 위해 슈터가 호출할 수 있는 RPC를 추가합니다:

C#

    [Rpc(RpcSources.All, RpcTargets.StateAuthority)]
    public void DealDamageRpc(float damage)
    {
        // The code inside here will run on the client which owns this object (has state and input authority).
        Debug.Log("Received DealDamageRpc on StateAuthority, modifying Networked variable");
        NetworkedHealth -= damage;
    }

RpcSources.All을 사용하면 누구나 RPC를 호출할 수 있습니다. 기본적으로 InputAuthority(공유 모드에서는 StateAuthority와 동일)만 RPC를 호출할 수 있습니다.

RpcTargets.StateAuthorityStateAuthority만 RPC를 수신하도록 합니다. 이는 StateAuthority이 상태 네트워크 속성을 업데이트하기 때문입니다. RPC 기능 내부의 코드는 RpcTarget 클라이언트에서 실행되므로 이 경우 자체 네트워크 속성을 변경할 수 있는 StateAuthority에서 실행됩니다.

RPC 기능 내부의 코드는 RpcTarget 클라이언트에서 실행되므로 이 경우 자신의 네트워크 속성을 변경할 수 있습니다.

다음으로 새 스크립트를 만들고 이 스크립트에 RaycastAttack이라는 이름을 붙입니다. 여기에 다음 코드를 추가합니다:

C#

using Fusion;
using UnityEngine;

public class RaycastAttack : NetworkBehaviour
{
    public float Damage = 10;
    
    public PlayerMovement PlayerMovement;
    
    void Update()
    {
        if (HasStateAuthority == false)
        {
            return;
        }
        
        Ray ray = PlayerMovement.Camera.ScreenPointToRay(Input.mousePosition);
        ray.origin += PlayerMovement.Camera.transform.forward;

        if (Input.GetKeyDown(KeyCode.Mouse1))
        {
            Debug.DrawRay(ray.origin, ray.direction, Color.red, 1f);
        }
    }
}

이 코드는 단일 플레이어가 직접 레이캐스트를 구현한 것입니다. HasStateAuthority는 이 코드를 StateAuthority에서만 실행하기 위해 사용되며 플레이어가 발사 버튼을 누르면 자신의 플레이어 캐릭터만 레이캐스트가 발사됩니다.

이제 대상에 피해를 입히기 위해서는 대상 위에 있는 RPC 기능을 호출하는 것이 남은 것입니다. Debug.DrawRay 행 뒤에 다음을 추가합니다:

C#

if (Runner.GetPhysicsScene().Raycast(ray.origin,ray.direction, out var hit))
{
    if (hit.transform.TryGetComponent<Health>(out var health))
    {
        health.DealDamageRpc(Damage);
    }
}

그러면 플레이어 프리팹에 HealthRaycastAttack 컴포넌트를 추가하고 빌드를 만듭니다.

기타 RPC 사용 사례

상태 권한에 네트워크 속성을 수정하도록 요청하는 것이 RPC의 가장 일반적인 사용 사례입니다.

RPC의 다른 유효한 사용 사례는 다음과 같습니다:

  1. 플레이어 간의 조롱 메시지, 이모티콘 또는 기타 휘발성 비게임 플레이 상호 작용을 전송합니다.
  2. 게임을 시작하는 것(게임 모드, 맵 또는 플레이어가 준비되었음을 호스트에게 표시하는 것).

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

게임 플레이하기

축하합니다! Fusion 공유 모드 기본 튜토리얼을 성공적으로 마쳤습니다. 모든 것이 제대로 작동하는지 확인하기 위해 이제 게임을 플레이하고 테스트할 시간입니다.

빌드를 시작하고 유니티에서 플레이 모드를 시작하고 Start Shared Client을 누릅니다. 다른 플레이어를 마우스 오른쪽 버튼으로 클릭하면 상태가 감소한 메시지가 콘솔에 표시됩니다.

또한 유니티의 계층 인스펙터에서 네트워크화된 속성의 Health 값을 확인할 수 있습니다.

다음 공유 모드 기초 6 - 다음에 학습할 내용

Back to top