MultiplayerAPIExtension

继承: MultiplayerAPI < RefCounted < Object

用于扩展 MultiplayerAPI 的基类。

描述

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

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

GDScript

  1. extends MultiplayerAPIExtension
  2. class_name LogMultiplayer
  3. # 我们想增强默认的 SceneMultiplayer。
  4. var base_multiplayer = SceneMultiplayer.new()
  5. func _init():
  6. # 仅传递基本信号(复制到 var 以避免循环引用)
  7. var cts = connected_to_server
  8. var cf = connection_failed
  9. var pc = peer_connected
  10. var pd = peer_disconnected
  11. base_multiplayer.connected_to_server.connect(func(): cts.emit())
  12. base_multiplayer.connection_failed.connect(func(): cf.emit())
  13. base_multiplayer.peer_connected.connect(func(id): pc.emit(id))
  14. base_multiplayer.peer_disconnected.connect(func(id): pd.emit(id))
  15. func _poll():
  16. return base_multiplayer.poll()
  17. # 记录正在进行的 RPC 并将其转发到默认的多人游戏。
  18. func _rpc(peer: int, object: Object, method: StringName, args: Array) -> Error:
  19. print("获取用于 %d 的 RPC:%s::%s(%s)" % [peer, object, method, args])
  20. return base_multiplayer.rpc(peer, object, method, args)
  21. # 记录配置添加。例如,根路径(nullptr、NodePath),复制(Node、Spawner|Synchronizer),自定义。
  22. func _object_configuration_add(object, config: Variant) -> Error:
  23. if config is MultiplayerSynchronizer:
  24. print("添加用于 %s 的同步配置。同步器:%s" % [object, config])
  25. elif config is MultiplayerSpawner:
  26. print("将节点 %s 添加到出生列表。出生器:%s" % [object, config])
  27. return base_multiplayer.object_configuration_add(object, config)
  28. # 记录配置移除。例如,根路径(nullptr、NodePath),复制(Node、Spawner|Synchronizer),自定义。
  29. func _object_configuration_remove(object, config: Variant) -> Error:
  30. if config is MultiplayerSynchronizer:
  31. print("移除用于 %s 的同步配置。同步器:%s" % [object, config])
  32. elif config is MultiplayerSpawner:
  33. print("将节点 %s 从出生列表移除。出生器:%s" % [object, config])
  34. return base_multiplayer.object_configuration_remove(object, config)
  35. # 这些可以是可选的,但在我们的例子中,我们想要增强 SceneMultiplayer,所以转发所有内容。
  36. func _set_multiplayer_peer(p_peer: MultiplayerPeer):
  37. base_multiplayer.multiplayer_peer = p_peer
  38. func _get_multiplayer_peer() -> MultiplayerPeer:
  39. return base_multiplayer.multiplayer_peer
  40. func _get_unique_id() -> int:
  41. return base_multiplayer.get_unique_id()
  42. func _get_peer_ids() -> PackedInt32Array:
  43. return base_multiplayer.get_peers()

然后在你的主场景或在自动加载中调用 SceneTree.set_multiplayer,以开始使用你的自定义 MultiplayerAPI

GDScript

  1. # autoload.gd
  2. func _enter_tree():
  3. # 将我们的自定义多人游戏设置为 SceneTree 中的主要的多人游戏。
  4. 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 时调用。