5 - 원격 프로시져 호출
개요
이전 섹션에서는 플레이어의 색을 다른 모든 플레이어와 동기화하기 위한 네트워크 속성이 추가되었습니다. 플레이어는 자신의 네트워크 속성에 대한 StateAuthority
을 가지고 있으므로 플레이어는 직접 자신의 색 값을 업데이트할 수 있습니다.
그러나 이는 StateAuthority
이 다른 클라이언트인 NetworkObjects
의 네트워크 속성에 대해서는 작동하지 않습니다.
이 섹션에서는 플레이어를 공격하고 다른 플레이어의 네트워크 속성을 수정해야 하는 플레이어의 상태를 줄이기 위한 예를 설명합니다.
다른 플레이어의 네트워크 속성 변경하기
다른 클라이언트가 상태 권한
을 가지고 있는 네트워크 속성을 변경하기 위한 접근 방식은 RPC(원격 프로시저 호출)를 객체의 StateAuthority
에 전송하여 네트워크 속성을 변경하도록 하는 것입니다.
코드에 의해 네트워크 속성의 값을 변경할 수 있지만, 변경 사항은 로컬에서만 적용되고 네트워크를 통해 복제되지 않습니다.
이것의 예는 레이 캐스트 무기로 플레이어를 쏘는 것입니다. Fusion 공유 모드에 대한 간단한 구현은 플레이어가 로컬에서 레이 캐스트를 수행하고 목표물에 도달하면 대상에 대미지를 입히는 것입니다. 서버/호스트 모드에서 레이캐스트 무기에 대한 접근 방식은 다릅니다. 서버/호스트 모드의 예는 Fusion 발사체 샘플을 확인하십시오.
새로운 스크립트를 생성하고 Health
로 저장합니다.
C#
using Fusion;
using UnityEngine;
public class Health : NetworkBehaviour
{
[Networked]
public float NetworkedHealth { get; set; } = 100;
}
다음으로 슈터가 적 플레이어에게 피해를 입히기 위해 호출할 수 있는 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
가 Health
네트워크 속성을 업데이트하기 때문에 이렇게 됩니다. RPC 기능 내부의 코드는 RpcTarget
클라이언트에서 실행되므로 이 경우 자체 네트워크 속성을 변경할 수 있는 StateAuthority
에서 실행됩니다.
그런 다음 새 스크립트를 만들고 이름을 RaycastAttack
으로 지정합니다. 여기에 다음 코드를 추가합니다:
C#
using Fusion;
using UnityEngine;
public class RaycastAttack : NetworkBehaviour
{
public float Damage;
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
네트워크 속성의 변경에 대한 대응입니다. Health
스크립트로 돌아가서 OnChangedCallback을 추가합니다:
C#
[Networked(OnChanged = nameof(NetworkedHealthChanged))]
public float NetworkedHealth { get; set; } = 100;
private static void NetworkedHealthChanged(Changed<Health> changed)
{
// Here you would add code to update the player's healthbar.
Debug.Log($"Health changed to: {changed.Behaviour.NetworkedHealth}");
}
완료되었으면, 플레이어 프리팹에 Health
와 RaycastAttack
컴포넌트를 추가하고 빌드를 만듭니다.
기타 RPC 사용 사례
상태 권한에 네트워크 속성 수정을 요청하는 것이 RPC의 가장 일반적인 사용 사례입니다.
RPC에 대한 다른 유효한 사용 사례는 다음과 같습니다:
- 놀림 메시지, 이모티콘 또는 플레이어 간의 기타 휘발성 비게임 플레이 상호 작용을 보냅니다.
- 게임 시작(게임 모드 및 맵 투표, 호스트에게 플레이어가 준비되었음을 알려 줌).
대부분의 경우 상태 동기화 자체만으로 플레이어의 일관된 상태를 유지할 수 있으며, 네트워크 속성에 변경 탐지기를 추가하면 애플리케이션이 실제 상태 자체뿐만 아니라 상태 변화에 신경을 쓰는 대부분의 전환 사례를 처리할 수 있습니다.
게임 플레이하기
축하합니다! 105 105 튜토리얼을 성공적으로 완료했습니다. 모든 것이 제대로 작동하는지 확인하려면 이제 게임을 플레이하고 테스트해야 합니다.
빌드를 시작하고 유니티에서 플레이 모드로 진입한 후 Start Shared Client
을 누릅니다. 다른 플레이어를 마우스 오른쪽 버튼으로 클릭하면 콘솔에 체력이 감소한다는 메시지가 표시됩니다.
유니티의 계층 인스펙터에서 네트워크 속성의 Health
값을 확인할 수도 있습니다.