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を受信できるようにします。これは、StateAuthority
がHealth
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);
}
これで、プレイヤーのプレハブに Health
と RaycastAttack
のコンポーネントを追加し、ビルドを作成します。
その他のRPC使用例
State AuthorityにNetworked Propertiesの変更を依頼することは、RPCの最も一般的なユースケースです。
その他、RPCの有効なユースケースは以下の通りです:
- タウントメッセージ、エモート、その他プレイヤー間の不安定な非ゲームプレイインタラクションを送信する。
- ゲームの起動(ゲームモード、マップの投票、またはプレイヤーが準備できたことをホストに示すだけ)。
ほとんどの場合、プレイヤーの連携を保つには状態の同期だけで十分で、ネットワーク化されたプロパティに変更ディテクターを追加すれば、アプリケーションが実際の状態そのものだけでなく状態の変化を重視するケースを処理できます。
ゲームをプレイする
おめでとうございます!Fusion 105 チュートリアルを終了しました。全ての機能が正常に動作していることを確認するために、ゲームをプレイしてみましょう。
ビルドを開始し、Unityでプレイモードに入り、Start Shared Client
を押してください。他のプレイヤーを右クリックすると、コンソールに体力の減少を示すメッセージが表示されます。
また、UnityのHierarchy inspectorでNetworked PropertyのHealth
値を確認することもできます。
次ページ Fusion 106 Shared
Back to top