Up to date

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

MultiplayerPeer

继承: PacketPeer < RefCounted < Object

派生: ENetMultiplayerPeer, MultiplayerPeerExtension, OfflineMultiplayerPeer, WebRTCMultiplayerPeer, WebSocketMultiplayerPeer

特化 PacketPeer 的抽象类,MultiplayerAPI 会用到。

描述

管理与一个或多个作为服务器或客户端的远程对等体的连接,并为每个对等体分配唯一的 ID。另请参阅 MultiplayerAPI

注意:MultiplayerAPI 协议是一个实现细节,并不打算由非 Godot 服务器使用。它可能会更改,恕不另行通知。

注意:当导出到 Android 时,在导出项目或使用一键部署之前,确保在 Android 导出预设中启用了 INTERNET 权限。否则,任何类型的网络通信都会被安卓阻止。

教程

属性

bool

refuse_new_connections

false

int

transfer_channel

0

TransferMode

transfer_mode

2

方法

void

close ( )

void

disconnect_peer ( int peer, bool force=false )

int

generate_unique_id ( ) const

ConnectionStatus

get_connection_status ( ) const

int

get_packet_channel ( ) const

TransferMode

get_packet_mode ( ) const

int

get_packet_peer ( ) const

int

get_unique_id ( ) const

bool

is_server_relay_supported ( ) const

void

poll ( )

void

set_target_peer ( int id )


信号

peer_connected ( int id )

远程对等体连接时发出。


peer_disconnected ( int id )

远程对等体断开连接时发出。


枚举

enum ConnectionStatus:

ConnectionStatus CONNECTION_DISCONNECTED = 0

该 MultiplayerPeer 已断开连接。

ConnectionStatus CONNECTION_CONNECTING = 1

该 MultiplayerPeer 正在连接到服务器。

ConnectionStatus CONNECTION_CONNECTED = 2

该 MultiplayerPeer 已连接。


enum TransferMode:

TransferMode TRANSFER_MODE_UNRELIABLE = 0

数据包不被确认,对丢失的数据包不进行重发尝试。数据包可以以任何顺序到达。可能比 TRANSFER_MODE_UNRELIABLE_ORDERED 快。用于非关键数据,并注意考虑顺序是否重要。

TransferMode TRANSFER_MODE_UNRELIABLE_ORDERED = 1

数据包不被确认,对丢失的数据包不进行重发尝试。数据包按其发送顺序接收。有可能比 TRANSFER_MODE_RELIABLE 快。用于非关键数据或由于重发尝试而迟迟不能收到的数据,例如运动和位置数据。

TransferMode TRANSFER_MODE_RELIABLE = 2

数据包必须被接收,并应进行重发尝试,直到数据包被确认。数据包必须按照其发送的顺序接收。最可靠的传输模式,但由于开销很大,可能是最慢的。用于必须按顺序传输和到达的关键数据,例如触发的能力或聊天信息。仔细考虑信息是否真的是关键的,并尽量少用。


常量

TARGET_PEER_BROADCAST = 0

将数据包发送至所有已连接的对等体。

TARGET_PEER_SERVER = 1

将数据包发送至作为服务器的远程对等体。


属性说明

bool refuse_new_connections = false

  • void set_refuse_new_connections ( bool value )

  • bool is_refusing_new_connections ( )

如果为 true,则这个 MultiplayerPeer 拒绝新的连接。


int transfer_channel = 0

  • void set_transfer_channel ( int value )

  • int get_transfer_channel ( )

用于发送数据包的通道。许多网络 API,例如 ENet 和 WebRTC,允许创建多个独立的通道,这些通道的行为在某种程度上类似于单独的连接。这意味着可靠数据只会阻止该通道上其他数据包的传递,并且排序将仅与正在发送数据包的通道有关。使用不同的通道发送不同且独立的状态更新,是优化快节奏游戏的网络使用和减少延迟的常用方法。

注意:默认通道(0)实际上作为 3 个独立的通道工作(每种 TransferMode 一个),因此默认情况下,TRANSFER_MODE_RELIABLETRANSFER_MODE_UNRELIABLE_ORDERED 不会相互交互。请参阅特定的网络 API 文档(例如 ENet 或 WebRTC),以了解如何正确地设置通道。


TransferMode transfer_mode = 2

向目标对等体发送数据包的方式。请参阅 TransferModeset_target_peer 方法。


方法说明

void close ( )

立即关闭多人对等体,返回到 CONNECTION_DISCONNECTED 状态。已连接的对等体将被丢弃,不会发出 peer_disconnected


void disconnect_peer ( int peer, bool force=false )

断开给定的 peer 与该主机的连接。如果 forcetrue,则不会为该对等体发出 peer_disconnected 信号。


int generate_unique_id ( ) const

返回随机生成的整数,可用作网络唯一 ID。


ConnectionStatus get_connection_status ( ) const

返回连接的当前状态。见 ConnectionStatus


int get_packet_channel ( ) const

返回下一个可用数据包被接收使用的通道。请参阅 PacketPeer.get_available_packet_count


TransferMode get_packet_mode ( ) const

返回用于发送下一个可用数据包的远程对等体的 TransferMode。请参阅 PacketPeer.get_available_packet_count


int get_packet_peer ( ) const

返回发送下一个可用数据包的 MultiplayerPeer 的 ID。见 PacketPeer.get_available_packet_count


int get_unique_id ( ) const

返回该 MultiplayerPeer 的 ID。


bool is_server_relay_supported ( ) const

如果服务器在当前配置中可以充当中继者,则返回 true(也就是说,如果更高级别的 MultiplayerAPI 应该通知连接的客户端有其他对等体,并实现一个中继协议以允许它们之间的通信)。


void poll ( )

等待最多 1 秒以接收一个新的网络事件。


void set_target_peer ( int id )

设置数据包将被发送至的对等体。

id 可以是以下之一:TARGET_PEER_BROADCAST,以发送到所有连接的对等体;TARGET_PEER_SERVER,以发送到充当服务器的对等体;一个有效的对等体 ID ,以发送到那个特定的对等体;一个负的对等体 ID,以发送到除那个对等体以外的所有对等体。默认情况下,目标对等体是 TARGET_PEER_BROADCAST