This document is about: FUSION 1
SWITCH TO

このページは編集中です。更新が保留になっている可能性があります。

5 - RPC

概要

前章では、プレイヤーの色を他のすべてのプレイヤーに同期させるためのNetworked Propertyが追加されました。プレイヤーは自分のNetworked Propertyに対してStateAuthorityを持っているので、自分の色の値を直接更新することができます。

ただし、StateAuthorityが他のクライアントであるNetworkObjectsのNetworked Propertiesでは、この機能は使えません。

ここでは、プレイヤーを攻撃して体力を減らすために、他のプレイヤーのNetworked Propertyを変更する必要がある場合の例を紹介します。

他のプレイヤーのネットワーク上のプロパティを変更する

他のクライアントが状態権限を持つ Networked Property を変更する方法は、オブジェクトの状態権限に対して RPC(リモートプロシージャコール)を送信して、Networked Property を変更させることです。

コードでNetworked Propertyの値を変更することは可能です。この変更はローカルにのみ適用され、ネットワーク上で複製されることはありません

この例として、レイキャスト武器でプレイヤーを撃つことが挙げられます。Fusion Sharedモードでの簡単な実装は、プレイヤーがローカルでレイキャストを行い、それがターゲットに当たると、そのターゲットにダメージを与えるというものです。サーバー/ホストモードでのレイキャスト武器のアプローチは異なるので注意してください。サーバー/ホストモードの例として、Fusion Projectiles Sample を確認してください。

新しいスクリプトを作成し、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(SharedモードのStateAuthorityと同じ)だけがRPCを呼び出すことができます。

RpcTargets.StateAuthority では、StateAuthority のみがRPCを受信できるようにします。これは、StateAuthorityHealth Networked Propertyを更新するためです。RPC 関数内のコードは RpcTargetクライアントで実行されるため、この場合はStateAuthority` で実行され、自身の Networked Properties を変更することができます。

次に、新しいスクリプトを作成し、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スクリプトに戻り、変更ディテクターを追加します:

C#

private NetworkBehaviourChangeDetector _changeDetector;

public override void Spawned()
{
    _changeDetector = GetChangeDetector();
    _changeDetector.RegisterCallback(this, nameof(NetworkedHealth), NetworkedHealthChanged);
}

private void NetworkedHealthChanged()
{
    // Here you would add code to update the player's healthbar.
    Debug.Log($"Health changed to: {NetworkedHealth}");
}

private void Update()
{
    _changeDetector.DetectChanges(this);
}

これで、プレイヤーのプレハブに HealthRaycastAttack のコンポーネントを追加し、ビルドを作成します。

その他のRPC使用例

State AuthorityにNetworked Propertiesの変更を依頼することは、RPCの最も一般的なユースケースです。

その他、RPCの有効なユースケースは以下の通りです:

  1. タウントメッセージ、エモート、その他プレイヤー間の不安定な非ゲームプレイインタラクションを送信する。
  2. ゲームの起動(ゲームモード、マップの投票、またはプレイヤーが準備できたことをホストに示すだけ)。

ほとんどの場合、プレイヤーの連携を保つには状態の同期だけで十分で、ネットワーク化されたプロパティに変更ディテクターを追加すれば、アプリケーションが実際の状態そのものだけでなく状態の変化を重視するケースを処理できます。

ゲームをプレイする

おめでとうございます!Fusion 105 チュートリアルを終了しました。全ての機能が正常に動作していることを確認するために、ゲームをプレイしてみましょう。

ビルドを開始し、Unityでプレイモードに入り、Start Shared Clientを押してください。他のプレイヤーを右クリックすると、コンソールに体力の減少を示すメッセージが表示されます。

また、UnityのHierarchy inspectorでNetworked PropertyのHealth値を確認することもできます。

次ページ Fusion 106 Shared

Back to top