godot multiplayer
GodotではEnet,WebRTC, WebSocketを抽象したMultiplayerPeerクラスを基本機能として提供する
3つの実装の全てMultiplayerPeerを継承している
どれを使うかは開発者が選択するが、どれを使っても同じように扱える。たぶん。
WebRTCMultiplayerPeerについてGDExtenstionプラグインの導入が必要
それとはべつにもっと低レベルなネットワーク機能も提供している
ノードはmultiplayer プロパティをもっている
プロパティはシーンツリーによって設定されたdefaultのMultiplayerAPIobjectへの参照をもつ
get_tree().get_multiplayer() でdefaultのmultipaerAPI objectへの参照を取得
最初に初期化は必須
signalで接続時、切断時にフックして処理が可能
code:gdscript
# Create client. すべてのpeerがユニークなIDをもつ
var peer = ENetMultiplayerPeer.new()
peer.create_client(IP_ADDRESS, PORT)
multiplayer.multiplayer_peer = peer
# Create server. serverIDは常に1
var peer = ENetMultiplayerPeer.new()
peer.create_server(PORT, MAX_CLIENTS)
multiplayer.multiplayer_peer = peer
# terminate networking
multiplayer.multiplayer_peer = OfflineMultiplayerPeer.new()
RPC
接続しているピアに特定メソッドの呼び出しを指示する
code:gdscript
func _ready():
if multiplayer.is_server():
# Callabl functionのrpc()メソッドを呼ぶことで全てのpeerへメソッド呼び出しを指示
# rpd_id()で特定peerのみのrpc実行可能
print_once_per_client.rpc()
# @rpcのanotationでrpcとして呼び出し可能になる
@rpc
func print_once_per_client():
print("I will be printed to the console once per each connected client.")
@rpcアノテーションがついている関数はサーバー、クライアントの両方で宣言されている必要あり
当然かんぜんにおなじシグネチャを持つ必要あり。
未使用でもシグネチャチェックは行われる
anotationは引数設定あり
rpcアノテーションをつけるcallable毎に変更可能
code:gdscript
引数はmode, sync, transfer_mode, transfer_chanel
transfer_chanelはchannel index
@rpc("authority", "call_remote", "unreliable", 0)
mode
:"authority": 実行可能権限。defaultはserverのみでの実行可能
"any_peer": どこでも実行可能. user inputの伝送で使うのに便利
sync:
"call_remote": rpcを自身に対して呼び出すことを許可しない。
"call_local: rpcを自身に対して実行可能にする。clientがhost(server)も兼ねるケースで使う。
transfer_mode
"unreliable": パケットの到着順序保証なし、確認応答なし、パケロス可能性あり
"unrelaible_ordered":パケットの順所保証あり。
後から遅れて到着したパケットは無視。ackなし。パケロス可能性あり。
基本はこれでいいのでは。
"reliable"
パケットのackができるまで再送信をする。順序保証あり。ほぼTCP
channel
一つのコネクションを仮想的に複数のストリームにわけるための単位がchannel
packetはこのstreamで独立してパケットを送信可能
channelごとに重要どのたかいメッセージや、チャットのような不確実性の許されるメッセージがある
異なるchannelを使って
MultiplayerSynchonizer
ノードの特定のプロパティをネットワーク越しに自動同期するための専用ノード
ユーザーの入力とか
右、左入力、
プレイヤーの動きとか
座標、向き、設置状態等々、速度
同期させるプロパティをMultiplayerSYnchonizerで指定する
使わなくてもrpcを使いまくれば同期はできるが、同期処理を簡易化するための仕組み
使用例
サーバー側の値をクライアント側にも同期させる
同期させるパラメータは任意の値を選択可能
同期の間隔も設定可能
誰が値を更新可能か(defaultはサーバーのみ)はautorityでコントロールすべし
set_multiplayer_auhtority(id)で権限設定
idのユーザーが更新権限を持てる
クライアント側の入力をサーバー側に伝搬させる
ユーザーのマウス、ゲームパッド入力をMultiplayerSynchozizer経由でサーバーに同期させて伝搬
MultipalyerSpawner
指定ツリーパスで生成したノード(敵、プレイヤー、アイテム等)を自動的に全クライアントと同期
同じツリー構造で自動生成、削除をしてくれる
add_child, queue_freeを自動で全クライアントで実行してくれる
ネットワーク同期のノード生成、削除は権限をもつピア(サーバ)のみで可能。
クライアント側でノードを追加してもそれらは同期されない
MultiplayerSynchonizerと組み合わせて生成したノードのプロパティ自動同期も可能。
プロパティのSpawnPathで設定したシーン中の指定パスを監視。
SpawnPathは設定必須
プロパティのAutoSpanwListにSpawn可能な監視対象ノードのパスを指定しておく
SpawnPathに監視対象ノードのインスタンスを追加すると、自動で全クライアントに対象ノードを生成&同期
spawn数の制限であるSpanwLimitも設定可能