MultiplayerAPIExtension

继承: MultiplayerAPI < RefCounted < Object

Base class used for extending the MultiplayerAPI.

描述

This class can be used to augment or replace the default MultiplayerAPI implementation via script or extensions.

The following example augment the default implementation (SceneMultiplayer) by logging every RPC being made, and every object being configured for replication.


    extends MultiplayerAPIExtension
    class_name LogMultiplayer
    
    # We want to augment the default SceneMultiplayer.
    var base_multiplayer = SceneMultiplayer.new()
    
    func _init():
        # Just passthrough base signals (copied to var to avoid cyclic reference)
        var cts = connected_to_server
        var cf = connection_failed
        var pc = peer_connected
        var pd = peer_disconnected
        base_multiplayer.connected_to_server.connect(func(): cts.emit())
        base_multiplayer.connection_failed.connect(func(): cf.emit())
        base_multiplayer.peer_connected.connect(func(id): pc.emit(id))
        base_multiplayer.peer_disconnected.connect(func(id): pd.emit(id))
    
    func _poll():
        return base_multiplayer.poll()
    
    # Log RPC being made and forward it to the default multiplayer.
    func _rpc(peer: int, object: Object, method: StringName, args: Array) -> Error:
        print("Got RPC for %d: %s::%s(%s)" % [peer, object, method, args])
        return base_multiplayer.rpc(peer, object, method, args)
    
    # Log configuration add. E.g. root path (nullptr, NodePath), replication (Node, Spawner|Synchronizer), custom.
    func _object_configuration_add(object, config: Variant) -> Error:
        if config is MultiplayerSynchronizer:
            print("Adding synchronization configuration for %s. Synchronizer: %s" % [object, config])
        elif config is MultiplayerSpawner:
            print("Adding node %s to the spawn list. Spawner: %s" % [object, config])
        return base_multiplayer.object_configuration_add(object, config)
    
    # Log configuration remove. E.g. root path (nullptr, NodePath), replication (Node, Spawner|Synchronizer), custom.
    func _object_configuration_remove(object, config: Variant) -> Error:
        if config is MultiplayerSynchronizer:
            print("Removing synchronization configuration for %s. Synchronizer: %s" % [object, config])
        elif config is MultiplayerSpawner:
            print("Removing node %s from the spawn list. Spawner: %s" % [object, config])
        return base_multiplayer.object_configuration_remove(object, config)
    
    # These can be optional, but in our case we want to augment SceneMultiplayer, so forward everything.
    func _set_multiplayer_peer(p_peer: MultiplayerPeer):
        base_multiplayer.multiplayer_peer = p_peer
    
    func _get_multiplayer_peer() -> MultiplayerPeer:
        return base_multiplayer.multiplayer_peer
    
    func _get_unique_id() -> int:
        return base_multiplayer.get_unique_id()
    
    func _get_peer_ids() -> PackedInt32Array:
        return base_multiplayer.get_peers()

Then in your main scene or in an autoload call SceneTree.set_multiplayer to start using your custom MultiplayerAPI:


    # autoload.gd
    func _enter_tree():
        # Sets our custom multiplayer as the main one in SceneTree.
    get_tree().set_multiplayer(LogMultiplayer.new())

Native extensions can alternatively use the MultiplayerAPI.set_default_interface method during initialization to configure themselves as the default implementation.

方法

MultiplayerPeer_get_multiplayer_peer ( ) virtual1
PackedInt32Array_get_peer_ids ( ) virtual1 const2
int_get_remote_sender_id ( ) virtual1 const2
int_get_unique_id ( ) virtual1 const2
Error_object_configuration_add ( object: Object, configuration: Variant ) virtual1
Error_object_configuration_remove ( object: Object, configuration: Variant ) virtual1
Error_poll ( ) virtual1
Error_rpc ( peer: int, object: Object, method: StringName, args: Array ) virtual1
void_set_multiplayer_peer ( multiplayer_peer: MultiplayerPeer ) virtual1

方法说明

MultiplayerPeer _get_multiplayer_peer ( ) virtual1

Called when the MultiplayerAPI.multiplayer_peer is retrieved.


PackedInt32Array _get_peer_ids ( ) virtual1 const2

Callback for MultiplayerAPI.get_peers.


int _get_remote_sender_id ( ) virtual1 const2

Callback for MultiplayerAPI.get_remote_sender_id.


int _get_unique_id ( ) virtual1 const2

Callback for MultiplayerAPI.get_unique_id.


Error _object_configuration_add ( object: Object, configuration: Variant ) virtual1

Callback for MultiplayerAPI.object_configuration_add.


Error _object_configuration_remove ( object: Object, configuration: Variant ) virtual1

Callback for MultiplayerAPI.object_configuration_remove.


Error _poll ( ) virtual1

Callback for MultiplayerAPI.poll.


Error _rpc ( peer: int, object: Object, method: StringName, args: Array ) virtual1

Callback for MultiplayerAPI.rpc.


void _set_multiplayer_peer ( multiplayer_peer: MultiplayerPeer ) virtual1

Called when the MultiplayerAPI.multiplayer_peer is set.

1

本方法通常需要用户覆盖才能生效。

2

本方法无副作用,不会修改该实例的任何成员变量。

3

本方法除了能接受在此处描述的参数外,还能够继续接受任意数量的参数。

4

本方法用于构造某个类型。

5

调用本方法无需实例,可直接使用类名进行调用。

6

本方法描述的是使用本类型作为左操作数的有效运算符。

7

这个值是由下列位标志构成位掩码的整数。

8

无返回值。