Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

MultiplayerAPIExtension

继承: MultiplayerAPI < RefCounted < Object

用于扩展 MultiplayerAPI 的基类。

描述

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

下面的例子通过记录每一个正在进行的 RPC 和为复制而配置的每一个对象,增强了默认的实现(SceneMultiplayer)。

extends MultiplayerAPIExtension
class_name LogMultiplayer

# 我们想增强默认的 SceneMultiplayer。
var base_multiplayer = SceneMultiplayer.new()

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

# 记录正在进行的 RPC 并将其转发到默认的多人游戏。
func _rpc(peer: int, object: Object, method: StringName, args: Array) -> Error:
    print("获取用于 %d 的 RPC:%s::%s(%s)" % [peer, object, method, args])
    return base_multiplayer.rpc(peer, object, method, args)

# 记录配置添加。例如,根路径(nullptr、NodePath),复制(Node、Spawner|Synchronizer),自定义。
func _object_configuration_add(object, config: Variant) -> Error:
    if config is MultiplayerSynchronizer:
        print("添加用于 %s 的同步配置。同步器:%s" % [object, config])
    elif config is MultiplayerSpawner:
        print("将节点 %s 添加到出生列表。出生器:%s" % [object, config])
    return base_multiplayer.object_configuration_add(object, config)

# 记录配置移除。例如,根路径(nullptr、NodePath),复制(Node、Spawner|Synchronizer),自定义。
func _object_configuration_remove(object, config: Variant) -> Error:
    if config is MultiplayerSynchronizer:
        print("移除用于 %s 的同步配置。同步器:%s" % [object, config])
    elif config is MultiplayerSpawner:
        print("将节点 %s 从出生列表移除。出生器:%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

# autoload.gd
func _enter_tree():
    # 将我们的自定义多人游戏设置为 SceneTree 中的主要的多人游戏。
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, Variant configuration ) virtual

Error

_object_configuration_remove ( Object object, Variant configuration ) virtual

Error

_poll ( ) virtual

Error

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

void

_set_multiplayer_peer ( MultiplayerPeer multiplayer_peer ) 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, Variant configuration ) virtual

MultiplayerAPI.object_configuration_add 的回调。


Error _object_configuration_remove ( Object object, Variant configuration ) virtual

MultiplayerAPI.object_configuration_remove 的回调。


Error _poll ( ) virtual

MultiplayerAPI.poll 的回调。


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

MultiplayerAPI.rpc 的回调。


void _set_multiplayer_peer ( MultiplayerPeer multiplayer_peer ) virtual

在设置 MultiplayerAPI.multiplayer_peer 时调用。