Files
godot-docs-l10n/classes/zh_Hans/class_multiplayerpeer.rst

416 lines
20 KiB
ReStructuredText
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

:github_url: hide
.. meta::
:keywords: network
.. _class_MultiplayerPeer:
MultiplayerPeer
===============
**继承:** :ref:`PacketPeer<class_PacketPeer>` **<** :ref:`RefCounted<class_RefCounted>` **<** :ref:`Object<class_Object>`
**派生:** :ref:`ENetMultiplayerPeer<class_ENetMultiplayerPeer>`, :ref:`MultiplayerPeerExtension<class_MultiplayerPeerExtension>`, :ref:`OfflineMultiplayerPeer<class_OfflineMultiplayerPeer>`, :ref:`WebRTCMultiplayerPeer<class_WebRTCMultiplayerPeer>`, :ref:`WebSocketMultiplayerPeer<class_WebSocketMultiplayerPeer>`
特化 :ref:`PacketPeer<class_PacketPeer>` 的抽象类,\ :ref:`MultiplayerAPI<class_MultiplayerAPI>` 会用到。
.. rst-class:: classref-introduction-group
描述
----
管理与一个或多个作为服务器或客户端的远程对等体的连接,并为每个对等体分配唯一的 ID。另见 :ref:`MultiplayerAPI<class_MultiplayerAPI>`\ 。
\ **注意:**\ :ref:`MultiplayerAPI<class_MultiplayerAPI>` 协议是一个实现细节,并不打算由非 Godot 服务器使用。它可能会更改,恕不另行通知。
\ **注意:**\ 当导出到 Android 时,在导出项目或使用一键部署之前,确保在 Android 导出预设中启用了 ``INTERNET`` 权限。否则,任何类型的网络通信都会被安卓阻止。
.. rst-class:: classref-introduction-group
教程
----
- :doc:`高级多人游戏 <../tutorials/networking/high_level_multiplayer>`
.. rst-class:: classref-reftable-group
属性
----
.. table::
:widths: auto
+--------------------------------------------------------+--------------------------------------------------------------------------------------+-----------+
| :ref:`bool<class_bool>` | :ref:`refuse_new_connections<class_MultiplayerPeer_property_refuse_new_connections>` | ``false`` |
+--------------------------------------------------------+--------------------------------------------------------------------------------------+-----------+
| :ref:`int<class_int>` | :ref:`transfer_channel<class_MultiplayerPeer_property_transfer_channel>` | ``0`` |
+--------------------------------------------------------+--------------------------------------------------------------------------------------+-----------+
| :ref:`TransferMode<enum_MultiplayerPeer_TransferMode>` | :ref:`transfer_mode<class_MultiplayerPeer_property_transfer_mode>` | ``2`` |
+--------------------------------------------------------+--------------------------------------------------------------------------------------+-----------+
.. rst-class:: classref-reftable-group
方法
----
.. table::
:widths: auto
+----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------+
| |void| | :ref:`close<class_MultiplayerPeer_method_close>`\ (\ ) |
+----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------+
| |void| | :ref:`disconnect_peer<class_MultiplayerPeer_method_disconnect_peer>`\ (\ peer\: :ref:`int<class_int>`, force\: :ref:`bool<class_bool>` = false\ ) |
+----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------+
| :ref:`int<class_int>` | :ref:`generate_unique_id<class_MultiplayerPeer_method_generate_unique_id>`\ (\ ) |const| |
+----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------+
| :ref:`ConnectionStatus<enum_MultiplayerPeer_ConnectionStatus>` | :ref:`get_connection_status<class_MultiplayerPeer_method_get_connection_status>`\ (\ ) |const| |
+----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------+
| :ref:`int<class_int>` | :ref:`get_packet_channel<class_MultiplayerPeer_method_get_packet_channel>`\ (\ ) |const| |
+----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------+
| :ref:`TransferMode<enum_MultiplayerPeer_TransferMode>` | :ref:`get_packet_mode<class_MultiplayerPeer_method_get_packet_mode>`\ (\ ) |const| |
+----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------+
| :ref:`int<class_int>` | :ref:`get_packet_peer<class_MultiplayerPeer_method_get_packet_peer>`\ (\ ) |const| |
+----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------+
| :ref:`int<class_int>` | :ref:`get_unique_id<class_MultiplayerPeer_method_get_unique_id>`\ (\ ) |const| |
+----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------+
| :ref:`bool<class_bool>` | :ref:`is_server_relay_supported<class_MultiplayerPeer_method_is_server_relay_supported>`\ (\ ) |const| |
+----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------+
| |void| | :ref:`poll<class_MultiplayerPeer_method_poll>`\ (\ ) |
+----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------+
| |void| | :ref:`set_target_peer<class_MultiplayerPeer_method_set_target_peer>`\ (\ id\: :ref:`int<class_int>`\ ) |
+----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------+
.. rst-class:: classref-section-separator
----
.. rst-class:: classref-descriptions-group
信号
----
.. _class_MultiplayerPeer_signal_peer_connected:
.. rst-class:: classref-signal
**peer_connected**\ (\ id\: :ref:`int<class_int>`\ ) :ref:`🔗<class_MultiplayerPeer_signal_peer_connected>`
远程对等体连接时发出。
.. rst-class:: classref-item-separator
----
.. _class_MultiplayerPeer_signal_peer_disconnected:
.. rst-class:: classref-signal
**peer_disconnected**\ (\ id\: :ref:`int<class_int>`\ ) :ref:`🔗<class_MultiplayerPeer_signal_peer_disconnected>`
远程对等体断开连接时发出。
.. rst-class:: classref-section-separator
----
.. rst-class:: classref-descriptions-group
枚举
----
.. _enum_MultiplayerPeer_ConnectionStatus:
.. rst-class:: classref-enumeration
enum **ConnectionStatus**: :ref:`🔗<enum_MultiplayerPeer_ConnectionStatus>`
.. _class_MultiplayerPeer_constant_CONNECTION_DISCONNECTED:
.. rst-class:: classref-enumeration-constant
:ref:`ConnectionStatus<enum_MultiplayerPeer_ConnectionStatus>` **CONNECTION_DISCONNECTED** = ``0``
该 MultiplayerPeer 已断开连接。
.. _class_MultiplayerPeer_constant_CONNECTION_CONNECTING:
.. rst-class:: classref-enumeration-constant
:ref:`ConnectionStatus<enum_MultiplayerPeer_ConnectionStatus>` **CONNECTION_CONNECTING** = ``1``
该 MultiplayerPeer 正在连接到服务器。
.. _class_MultiplayerPeer_constant_CONNECTION_CONNECTED:
.. rst-class:: classref-enumeration-constant
:ref:`ConnectionStatus<enum_MultiplayerPeer_ConnectionStatus>` **CONNECTION_CONNECTED** = ``2``
该 MultiplayerPeer 已连接。
.. rst-class:: classref-item-separator
----
.. _enum_MultiplayerPeer_TransferMode:
.. rst-class:: classref-enumeration
enum **TransferMode**: :ref:`🔗<enum_MultiplayerPeer_TransferMode>`
.. _class_MultiplayerPeer_constant_TRANSFER_MODE_UNRELIABLE:
.. rst-class:: classref-enumeration-constant
:ref:`TransferMode<enum_MultiplayerPeer_TransferMode>` **TRANSFER_MODE_UNRELIABLE** = ``0``
数据包不被确认,对丢失的数据包不进行重发尝试。数据包可以以任何顺序到达。可能比 :ref:`TRANSFER_MODE_UNRELIABLE_ORDERED<class_MultiplayerPeer_constant_TRANSFER_MODE_UNRELIABLE_ORDERED>` 快。用于非关键数据,并注意考虑顺序是否重要。
.. _class_MultiplayerPeer_constant_TRANSFER_MODE_UNRELIABLE_ORDERED:
.. rst-class:: classref-enumeration-constant
:ref:`TransferMode<enum_MultiplayerPeer_TransferMode>` **TRANSFER_MODE_UNRELIABLE_ORDERED** = ``1``
数据包不被确认,对丢失的数据包不进行重发尝试。数据包按其发送顺序接收。有可能比 :ref:`TRANSFER_MODE_RELIABLE<class_MultiplayerPeer_constant_TRANSFER_MODE_RELIABLE>` 快。用于非关键数据或由于重发尝试而迟迟不能收到的数据,例如运动和位置数据。
.. _class_MultiplayerPeer_constant_TRANSFER_MODE_RELIABLE:
.. rst-class:: classref-enumeration-constant
:ref:`TransferMode<enum_MultiplayerPeer_TransferMode>` **TRANSFER_MODE_RELIABLE** = ``2``
数据包必须被接收,并应进行重发尝试,直到数据包被确认。数据包必须按照其发送的顺序接收。最可靠的传输模式,但由于开销很大,可能是最慢的。用于必须按顺序传输和到达的关键数据,例如触发的能力或聊天信息。仔细考虑信息是否真的是关键的,并尽量少用。
.. rst-class:: classref-section-separator
----
.. rst-class:: classref-descriptions-group
常量
----
.. _class_MultiplayerPeer_constant_TARGET_PEER_BROADCAST:
.. rst-class:: classref-constant
**TARGET_PEER_BROADCAST** = ``0`` :ref:`🔗<class_MultiplayerPeer_constant_TARGET_PEER_BROADCAST>`
将数据包发送至所有已连接的对等体。
.. _class_MultiplayerPeer_constant_TARGET_PEER_SERVER:
.. rst-class:: classref-constant
**TARGET_PEER_SERVER** = ``1`` :ref:`🔗<class_MultiplayerPeer_constant_TARGET_PEER_SERVER>`
将数据包发送至作为服务器的远程对等体。
.. rst-class:: classref-section-separator
----
.. rst-class:: classref-descriptions-group
属性说明
--------
.. _class_MultiplayerPeer_property_refuse_new_connections:
.. rst-class:: classref-property
:ref:`bool<class_bool>` **refuse_new_connections** = ``false`` :ref:`🔗<class_MultiplayerPeer_property_refuse_new_connections>`
.. rst-class:: classref-property-setget
- |void| **set_refuse_new_connections**\ (\ value\: :ref:`bool<class_bool>`\ )
- :ref:`bool<class_bool>` **is_refusing_new_connections**\ (\ )
如果为 ``true``\ ,则这个 **MultiplayerPeer** 拒绝新的连接。
.. rst-class:: classref-item-separator
----
.. _class_MultiplayerPeer_property_transfer_channel:
.. rst-class:: classref-property
:ref:`int<class_int>` **transfer_channel** = ``0`` :ref:`🔗<class_MultiplayerPeer_property_transfer_channel>`
.. rst-class:: classref-property-setget
- |void| **set_transfer_channel**\ (\ value\: :ref:`int<class_int>`\ )
- :ref:`int<class_int>` **get_transfer_channel**\ (\ )
用于发送数据包的通道。许多网络 API例如 ENet 和 WebRTC允许创建多个独立的通道这些通道的行为在某种程度上类似于单独的连接。这意味着可靠数据只会阻止该通道上其他数据包的传递并且排序将仅与正在发送数据包的通道有关。使用不同的通道发送\ **不同且独立的**\ 状态更新,是优化快节奏游戏的网络使用和减少延迟的常用方法。
\ **注意:**\ 默认通道(\ ``0``\ )实际上作为 3 个独立的通道工作(每种 :ref:`TransferMode<enum_MultiplayerPeer_TransferMode>` 一个),因此默认情况下,\ :ref:`TRANSFER_MODE_RELIABLE<class_MultiplayerPeer_constant_TRANSFER_MODE_RELIABLE>` 和 :ref:`TRANSFER_MODE_UNRELIABLE_ORDERED<class_MultiplayerPeer_constant_TRANSFER_MODE_UNRELIABLE_ORDERED>` 不会相互交互。请参阅特定的网络 API 文档(例如 ENet 或 WebRTC以了解如何正确地设置通道。
.. rst-class:: classref-item-separator
----
.. _class_MultiplayerPeer_property_transfer_mode:
.. rst-class:: classref-property
:ref:`TransferMode<enum_MultiplayerPeer_TransferMode>` **transfer_mode** = ``2`` :ref:`🔗<class_MultiplayerPeer_property_transfer_mode>`
.. rst-class:: classref-property-setget
- |void| **set_transfer_mode**\ (\ value\: :ref:`TransferMode<enum_MultiplayerPeer_TransferMode>`\ )
- :ref:`TransferMode<enum_MultiplayerPeer_TransferMode>` **get_transfer_mode**\ (\ )
向目标对等体发送数据包的方式。见 :ref:`set_target_peer()<class_MultiplayerPeer_method_set_target_peer>` 方法。
.. rst-class:: classref-section-separator
----
.. rst-class:: classref-descriptions-group
方法说明
--------
.. _class_MultiplayerPeer_method_close:
.. rst-class:: classref-method
|void| **close**\ (\ ) :ref:`🔗<class_MultiplayerPeer_method_close>`
立即关闭多人对等体,返回到 :ref:`CONNECTION_DISCONNECTED<class_MultiplayerPeer_constant_CONNECTION_DISCONNECTED>` 状态。已连接的对等体将被丢弃,不会发出 :ref:`peer_disconnected<class_MultiplayerPeer_signal_peer_disconnected>`\ 。
.. rst-class:: classref-item-separator
----
.. _class_MultiplayerPeer_method_disconnect_peer:
.. rst-class:: classref-method
|void| **disconnect_peer**\ (\ peer\: :ref:`int<class_int>`, force\: :ref:`bool<class_bool>` = false\ ) :ref:`🔗<class_MultiplayerPeer_method_disconnect_peer>`
断开给定的 ``peer`` 与该主机的连接。如果 ``force````true``\ ,则不会为该对等体发出 :ref:`peer_disconnected<class_MultiplayerPeer_signal_peer_disconnected>` 信号。
.. rst-class:: classref-item-separator
----
.. _class_MultiplayerPeer_method_generate_unique_id:
.. rst-class:: classref-method
:ref:`int<class_int>` **generate_unique_id**\ (\ ) |const| :ref:`🔗<class_MultiplayerPeer_method_generate_unique_id>`
返回随机生成的整数,可用作网络唯一 ID。
.. rst-class:: classref-item-separator
----
.. _class_MultiplayerPeer_method_get_connection_status:
.. rst-class:: classref-method
:ref:`ConnectionStatus<enum_MultiplayerPeer_ConnectionStatus>` **get_connection_status**\ (\ ) |const| :ref:`🔗<class_MultiplayerPeer_method_get_connection_status>`
返回连接的当前状态。
.. rst-class:: classref-item-separator
----
.. _class_MultiplayerPeer_method_get_packet_channel:
.. rst-class:: classref-method
:ref:`int<class_int>` **get_packet_channel**\ (\ ) |const| :ref:`🔗<class_MultiplayerPeer_method_get_packet_channel>`
返回下一个可用数据包被接收使用的通道。请参阅 :ref:`PacketPeer.get_available_packet_count()<class_PacketPeer_method_get_available_packet_count>`\ 。
.. rst-class:: classref-item-separator
----
.. _class_MultiplayerPeer_method_get_packet_mode:
.. rst-class:: classref-method
:ref:`TransferMode<enum_MultiplayerPeer_TransferMode>` **get_packet_mode**\ (\ ) |const| :ref:`🔗<class_MultiplayerPeer_method_get_packet_mode>`
返回远程对等体用于发送下一个可用数据包的传输模式。请参阅 :ref:`PacketPeer.get_available_packet_count()<class_PacketPeer_method_get_available_packet_count>`\ 。
.. rst-class:: classref-item-separator
----
.. _class_MultiplayerPeer_method_get_packet_peer:
.. rst-class:: classref-method
:ref:`int<class_int>` **get_packet_peer**\ (\ ) |const| :ref:`🔗<class_MultiplayerPeer_method_get_packet_peer>`
返回发送下一个可用数据包的 **MultiplayerPeer** 的 ID。见 :ref:`PacketPeer.get_available_packet_count()<class_PacketPeer_method_get_available_packet_count>`\ 。
.. rst-class:: classref-item-separator
----
.. _class_MultiplayerPeer_method_get_unique_id:
.. rst-class:: classref-method
:ref:`int<class_int>` **get_unique_id**\ (\ ) |const| :ref:`🔗<class_MultiplayerPeer_method_get_unique_id>`
返回该 **MultiplayerPeer** 的 ID。
.. rst-class:: classref-item-separator
----
.. _class_MultiplayerPeer_method_is_server_relay_supported:
.. rst-class:: classref-method
:ref:`bool<class_bool>` **is_server_relay_supported**\ (\ ) |const| :ref:`🔗<class_MultiplayerPeer_method_is_server_relay_supported>`
如果服务器在当前配置中可以充当中继者,则返回 ``true``\ (也就是说,如果更高级别的 :ref:`MultiplayerAPI<class_MultiplayerAPI>` 应该通知连接的客户端有其他对等体,并实现一个中继协议以允许它们之间的通信)。
.. rst-class:: classref-item-separator
----
.. _class_MultiplayerPeer_method_poll:
.. rst-class:: classref-method
|void| **poll**\ (\ ) :ref:`🔗<class_MultiplayerPeer_method_poll>`
等待最多 1 秒以接收一个新的网络事件。
.. rst-class:: classref-item-separator
----
.. _class_MultiplayerPeer_method_set_target_peer:
.. rst-class:: classref-method
|void| **set_target_peer**\ (\ id\: :ref:`int<class_int>`\ ) :ref:`🔗<class_MultiplayerPeer_method_set_target_peer>`
设置数据包将被发送至的对等体。
\ ``id`` 可以是以下之一:\ :ref:`TARGET_PEER_BROADCAST<class_MultiplayerPeer_constant_TARGET_PEER_BROADCAST>`\ ,以发送到所有连接的对等体;\ :ref:`TARGET_PEER_SERVER<class_MultiplayerPeer_constant_TARGET_PEER_SERVER>`\ ,以发送到充当服务器的对等体;一个有效的对等体 ID ,以发送到那个特定的对等体;一个负的对等体 ID以发送到除那个对等体以外的所有对等体。默认情况下目标对等体是 :ref:`TARGET_PEER_BROADCAST<class_MultiplayerPeer_constant_TARGET_PEER_BROADCAST>`\ 。
.. |virtual| replace:: :abbr:`virtual (本方法通常需要用户覆盖才能生效。)`
.. |required| replace:: :abbr:`required (This method is required to be overridden when extending its base class.)`
.. |const| replace:: :abbr:`const (本方法无副作用,不会修改该实例的任何成员变量。)`
.. |vararg| replace:: :abbr:`vararg (本方法除了能接受在此处描述的参数外,还能够继续接受任意数量的参数。)`
.. |constructor| replace:: :abbr:`constructor (本方法用于构造某个类型。)`
.. |static| replace:: :abbr:`static (调用本方法无需实例,可直接使用类名进行调用。)`
.. |operator| replace:: :abbr:`operator (本方法描述的是使用本类型作为左操作数的有效运算符。)`
.. |bitfield| replace:: :abbr:`BitField (这个值是由下列位标志构成位掩码的整数。)`
.. |void| replace:: :abbr:`void (无返回值。)`