RPCs - 使用例
RPCは、クライアント間で一時的なイベントをトリガーする仕組みです。ここで紹介するパターンはよく使用されるものです。このページは、RPC 基礎を理解していることを前提としています。
クライアントからサーバーへのリクエスト
ゲームステートは、クライアントではなくシミュレーションサーバーが管理します。クライアントが何かを実行したい場合は、実行したい操作をブロードキャストRPCとしてパッケージ化し、マスタークライアント(サーバー)に検証と実行を任せます。
代表的なリクエスト:
- 選択したペイロードのキャラクターをスポーンする - マスタークライアントはリクエストを受信して検証を行った後、リクエスト元に代わって(装備・クラス・コスチュームなどを選択した)キャラクターをスポーンします。
- 近くの取得可能なアイテムを回収する - 範囲内に入ったクライアントが回収リクエストを送信し、サーバーは距離と取得可能性を確認し、リクエストを適用します。
スポーンリクエストパターンの完全に動作するコードは、クイックスタートガイド(ステップ 5)で示されているので、これをテンプレートとして活用してください。
サーバーから全クライアントへの通知
RPCはキャッシュされないため、呼び出し後に参加したプレイヤーには届きません。そのため、RPCは途中参加者が知る必要のない短期間の通知に適しています:
- ヒットエフェクトやキルログの情報
- ラウンド開始やカウントダウンの合図
- サーバーサイドイベントによってトリガーされる単発の視覚エフェクト
途中参加者にも通知する必要があるものは、複製したプロパティに格納してください。すると、途中参加者はスポーン時に最新の値を受け取ることができます。RPCは一時的な通知のみに使用してください。
共通パターン
テキストチャット
チャットはブロードキャストRPCに最適です。あるクライアントが送信して全員が受信する仕組みで、途中参加者への対応は不要です。
GDScript
func _ready():
Fusion.register_broadcast_receiver(self)
func _exit_tree():
if Fusion:
Fusion.unregister_broadcast_receiver(self)
@rpc("any_peer", "call_local")
func chat_message(sender: String, text: String):
$ChatPanel.append_line("[%s]: %s" % [sender, text])
func send_chat(text: String):
Fusion.rpc(chat_message, local_player_name, text)
製品レベルのチャット機能をお探しの場合は、Photon Chatをご覧ください。これはPhotonの別製品で、互換性のあるサードパーティーサービスとの連携によって、AIモデレーションや単語フィルタリングなどの機能を備えています。
UIや単発エフェクト
一時的な効果(サウンド・爆発パーティクル・画面フラッシュ・トースト通知など)は、RPCに最適です。コード分岐せずに送信元でも効果を発生させたい場合は、@rpcアノテーション内で"call_local"を使用してください。
参考リンク
- RPC 基礎 - APIとルーティングのルール
- 予測と入力 - RPCのアクションを置き換える入力ループ
- クイックスタートガイド - ステップ 5で完全なスポーンリクエストパターンを説明
- Photon Chat - マネージドチャットサービス