MultiplayerAPIExtension
继承: MultiplayerAPI < RefCounted < Object
用于扩展 MultiplayerAPI 的基类。
描述
该类可用于通过脚本或扩展来增强或替换默认的 MultiplayerAPI 实现。
下面的例子通过记录每一个正在进行的 RPC 和为复制而配置的每一个对象,增强了默认的实现(SceneMultiplayer)。
GDScript
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:
GDScript
# autoload.gd
func _enter_tree():
# 将我们的自定义多人游戏设置为 SceneTree 中的主要的多人游戏。
get_tree().set_multiplayer(LogMultiplayer.new())
原生扩展也可以在初始化期间,使用 MultiplayerAPI.set_default_interface 方法将自己配置为默认实现。
方法
_get_multiplayer_peer() virtual | |
_get_peer_ids() virtual const | |
_get_remote_sender_id() virtual const | |
_get_unique_id() virtual const | |
_object_configuration_add(object: Object, configuration: Variant) virtual | |
_object_configuration_remove(object: Object, configuration: Variant) virtual | |
_poll() virtual | |
_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 🔗
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 的回调。
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 时调用。