한 플레이어에게만 보내면 되는 함수가 있을경우 대상 플레이어게만 RPC를 보내면 네트워크 대역폭과 처리량을 절약할 수 있어서 게임의 성능과 안정성을 향상시킬 수 있습니다. 이번 글에서는 특정 플레이어게만 RPC를 보내는 방법을 다루겠습니다.

 

✅ 구현(스크립트 작성)

· 전역 함수

using UnityEngine;
using Photon.Pun;

public class UtilityManager : MonoBehaviour
{
    ...

    // 닉네임을 가진 플레이어에게만 RPC를 호출하는 함수
    public static void CallRpcForPlayerWithName(string rpcMethodName, string targetPlayerName, params object[] parameters)
    {
        PhotonView? photonView = null;

        foreach (PhotonView pv in PhotonNetwork.PhotonViewCollection)
        {
            Debug.Log(pv.Owner.NickName + "     " + targetPlayerName);

            if (pv.Owner.NickName == targetPlayerName)
            {
                photonView = pv;
                break;
            }
        }

        if(photonView == null)
        {
            Debug.Log($"{targetPlayerName}을 찾을 수 없음");
            return;
        }
        else
        {
            // RPC 호출
            photonView.RPC(rpcMethodName, photonView.Owner, parameters);
        }
    }

    ...
}

 

  • UtilityManager이라는 이름으로 게임 디버그 및 유용한 함수를 전역으로 정의하였습니다.

 

PhotonView? photonView = null;
  • 포톤 뷰를 가져오기 위해 선언합니다.

 

foreach (PhotonView pv in PhotonNetwork.PhotonViewCollection)
  • 현재 접속중인 플레이어를 검사하여 대상의 닉네임과 동일한 대상을 찾습니다.

 

// RPC 호출
photonView.RPC(rpcMethodName, photonView.Owner, parameters);
  • 포톤 뷰를 찾아 대상이 있다면, 그 대상에게만 RPC를 호출합니다.

 

✅ 사용 예시

/// <summary>
/// 
/// </summary>
/// <param name="nickName"></param>
/// <param name="isOn"></param>
public void ToggleMuteTargetForce(string nickName, bool isOn)
{
    UtilityManager.CallRpcForPlayerWithName("ToggleMute", nickName, isOn);
}
  • 관리자가 특정 대상의 보이스챗을 강제로 Mute하기위한 함수입니다.
  • 클라이언트의 로컬 자신이 Mute 처리하는것은 한명에게만 이루어지면 되기에 단일 RPC 호출을 사용합니다.
bonnate