Приветствую всех! Сегодня я кратко расскажу вам о мультиплеере 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.
Заключение
С помощью этой статьи вы сможете запрограммировать мультиплеер в свою игру. Иногда многопользовательская игра может быть болезненной, потому что что-то не синхронизируется должным образом, и отладить ошибку немного сложно, но с холодной головой вы в конечном итоге найдете ошибку и получите немного больше знаний.
Если вам понравилась эта статья, хлопайте и подписывайтесь на меня! Спасибо за чтение, и я желаю вам удачи на вашем пути.