MultiplayerAPIExtension

继承: MultiplayerAPI < RefCounted < Object

用于扩展MultiplayerAPI的基类。

描述

此类可用于通过脚本或扩展扩展或替换默认的MultiplayerAPI实现。

以下示例通过记录正在制作的每个RPC和配置用于复制的每个对象来扩展默认实现(SceneMultiplayer)。

extends MultiplayerAPIExtension
class_name LogMultiplayer

# 扩展默认的 SceneMultiplayer 功能。
var base_multiplayer = SceneMultiplayer.new()

func _init():
    # 仅传递基础信号(复制到变量中以避免循环引用)
    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()

# 正在创建日志请求,并将其转发至默认的多人应用模式。
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)

# 日志配置添加。例如:根路径(空值,节点路径),复制(项目,生成器|同步器),自定义。
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)

# 日志配置删除。例如:根路径(空指针,节点路径),复制(项目,生成器|同步器),自定义。
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)

# 这些是可选的,但在我们的案例中,我们想要扩展 SceneMultiplayer 功能,所以要将所有内容都传递过去。
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()

然后在您的主场景中,或者通过自动加载调用的方式 SceneTree.set_multiplayer() 来启动使用您自定义的 MultiplayerAPI

# 自动加载.s3
func _enter_tree():
    # 将我们的自定义多人应用设置为场景树中的主应用模式。
    get_tree().set_multiplayer(LogMultiplayer.new())

原生扩展可以在初始化时使用MultiplayerAPI.set_default_interface()方法,将自己配置为默认实现。

方法

MultiplayerPeer

_get_multiplayer_peer() virtual

PackedInt32Array

_get_peer_ids() virtual const

int

_get_remote_sender_id() virtual const

int

_get_unique_id() virtual const

Error

_object_configuration_add(object: Object, configuration: Variant) virtual

Error

_object_configuration_remove(object: Object, configuration: Variant) virtual

Error

_poll() virtual

Error

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

void

_set_multiplayer_peer(multiplayer_peer: MultiplayerPeer) virtual


方法说明

MultiplayerPeer _get_multiplayer_peer() virtual 🔗

在检索到MultiplayerAPI.multiplayer_peer时调用。


PackedInt32Array _get_peer_ids() virtual const 🔗

MultiplayerAPI.get_peers()的回调。


int _get_remote_sender_id() virtual const 🔗

MultiplayerAPI.get_remote_sender_id()的回调。


int _get_unique_id() virtual const 🔗

MultiplayerAPI.get_unique_id()的回调。


Error _object_configuration_add(object: Object, configuration: Variant) virtual 🔗

MultiplayerAPI.object_configuration_add()的回调。


Error _object_configuration_remove(object: Object, configuration: Variant) virtual 🔗

MultiplayerAPI.object_configuration_remove()的回调。


Error _poll() virtual 🔗

回调MultiplayerAPI.poll()


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

MultiplayerAPI.rpc()的回调。


void _set_multiplayer_peer(multiplayer_peer: MultiplayerPeer) virtual 🔗

设置MultiplayerAPI.multiplayer_peer时调用。