Приветствую всех! Сегодня я кратко расскажу вам о мультиплеере Godot версии 4.

Если вы хотите лучшего понимания, я рекомендую вам прочитать документацию или, по крайней мере, узнать разницу между серверной и клиентской частью. С учетом сказанного, давайте перейдем прямо к этому.

Настройка сети

Это похоже на Godot 3.5, но синтаксис немного отличается:

Например, теперь все, что касается многопользовательской игры, фактически находится в глобальном классе с именем «мультиплеер» (MultiplayerAPI), что означает, что когда мы подключаем сигналы, они находятся в классе многопользовательской игры.

# GODOT 3.5
get_tree().connect("connected_to_server", self, "_connected_to_server")
# GODOT 4
multiplayer.connected_to_server.connect(self._connected_to_server)

Для быстрой настройки вы можете использовать этот код:

Этот код вы добавите в качестве автозагрузки, а затем создадите узел с лобби и подключите сигналы, затем кнопку для переключения сцен. Чтобы лучше понять код, вы можете ознакомиться с моим предыдущим руководством по мультиплееру 3.5.

Многопользовательский синхронизатор

В этой версии Godot добавили многопользовательский синхронизатор, упрощающий программирование мультиплеера. Теперь вам нужно добавить его в дерево плеера, а затем просто установить свойства, которые вы хотите синхронизировать.

Это очень полезно и может сэкономить вам много времени.

Многопользовательский спаунер

Еще одна новая функция, которая также упрощает процесс создания и управления сетевыми объектами в многопользовательских играх.

Но когда я им пользовался, то натыкался на кучу ошибок, а потом просто реализовал свой спаунер. Если вы хотите поиграться с ним самостоятельно, рекомендую посмотреть документацию.

RPC-вызовы

RPC необходимы для реализации сетевого игрового процесса и взаимодействия, поэтому полезно знать, как правильно их использовать.

RPC изменил синтаксис на гораздо более простую версию.

Например, теперь у вас нет ни мастера, ни марионетки, ни пульта и т. д., но у вас гораздо более простой синтаксис.

Синтаксис вызовов RPC в Godot 4:

Вы начнете с «@», а затем укажете режим RPC, sync, transfer_mode.

# mode, sync, transfer_mode (order doesn't matter)
# reliable -> tcp, unreliable -> udp (spamming), unreliable_ordered
@rpc("any_peer", "call_local", "reliable")
func totaly_sync():
  print("Running locally and any_connected_client running this function")

@rpc("call_local")
func local_call():
  print("calling just local function")

# You also can use different channels used mostly for optimizations 
@rpc(any_peer, 1)
func my_chat_func(message):
 print("RPC received on channel 1, message: " + str(message))

# Calling rpc function:
# rpc() == self.rpc
rpc("totaly_sync")
# with arguments:
rpc("my_chat_func", "Hello")

Но будьте осторожны, вы не можете отправить какой-либо узел, потому что это может привести к уязвимости RCE, поэтому вам нужно обойти это. Обычно я объявляю список элементов, которые хочу синхронизировать, а затем просто отправляю индекс по сети.

@onready var items = [
 preload("res://path/to/scene.tscn"),
 preload("res://path/to/scene.tscn"),
]

@rpc("any_peer", "call_local", "reliable")
func sync_items(index: int) -> void:
 spawn_item(items[index])

Управление потоком выполнения

Последнее в нашем списке — как на самом деле управлять потоком выполнения. Основным способом управления потоком является:

# check whoever executing the code if its the owner of current node
mutiplayer.is_mutliplayer_authority()
# check if its the server
multiplayer.is_server()
# set the ownership of the node
NODE.set_multiplayer_authority()

Когда вы создаете экземпляр игрока, вам нужно установить его как multiplayer_authority его узла. Это сделает вашу жизнь намного проще.

И имейте в виду, что при использовании функции «_ready()» выполнение этой функции обычно происходит до установки multiplayer_authority.

Заключение

С помощью этой статьи вы сможете запрограммировать мультиплеер в свою игру. Иногда многопользовательская игра может быть болезненной, потому что что-то не синхронизируется должным образом, и отладить ошибку немного сложно, но с холодной головой вы в конечном итоге найдете ошибку и получите немного больше знаний.

Если вам понравилась эта статья, хлопайте и подписывайтесь на меня! Спасибо за чтение, и я желаю вам удачи на вашем пути.