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.StateAuthority
는 StateAuthority
만 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);
}
}
그러면 플레이어 프리팹에 Health
와 RaycastAttack
컴포넌트를 추가하고 빌드를 만듭니다.
기타 RPC 사용 사례
상태 권한에 네트워크 속성을 수정하도록 요청하는 것이 RPC의 가장 일반적인 사용 사례입니다.
RPC의 다른 유효한 사용 사례는 다음과 같습니다:
- 플레이어 간의 조롱 메시지, 이모티콘 또는 기타 휘발성 비게임 플레이 상호 작용을 전송합니다.
- 게임을 시작하는 것(게임 모드, 맵 또는 플레이어가 준비되었음을 호스트에게 표시하는 것).
대부분의 경우 상태 동기화 자체만으로도 플레이어의 상태를 유지할 수 있으며, 네트워크 속성에 변경 감지기를 추가하면 애플리케이션이 실제 상태 자체뿐만 아니라 상태 변경에 관심을 갖는 대부분의 전환 사례를 처리할 수 있습니다.
게임 플레이하기
축하합니다! Fusion 공유 모드 기본 튜토리얼을 성공적으로 마쳤습니다. 모든 것이 제대로 작동하는지 확인하기 위해 이제 게임을 플레이하고 테스트할 시간입니다.
빌드를 시작하고 유니티에서 플레이 모드를 시작하고 Start Shared Client
을 누릅니다. 다른 플레이어를 마우스 오른쪽 버튼으로 클릭하면 상태가 감소한 메시지가 콘솔에 표시됩니다.
또한 유니티의 계층 인스펙터에서 네트워크화된 속성의 Health
값을 확인할 수 있습니다.