@Pushiron

Как правильно принимать сигналы от клиента на сервере?

Использую GODOT 3 и не совсем понимаю, как мне правильно обрабатывать сигналы с клиента на сервере и возвращать результат обратно? Клиент и сервер реализуются как 2 отдельных GODOT приложения

Использую NetworkedMultiplayerENet

На клиенте есть функция _on_Start_button_pressed(), в которой мне необходимо вызвать функцию на сервере _create_room(), в которой я генерирую 4-х буквенный код.

Пробовал так:

Client:

-server.gd
func _ready():
	get_tree().connect("connected_to_server", self, "_connected_to_server")
	get_tree().connect("server_disconnected", self, "_server_disconnected")
	get_tree().connect("connection_failed", self, "_connection_failed")


func join_server():
	var client = NetworkedMultiplayerENet.new()
	var err = client.create_client(SERVER_ADDRESS, 4242)
	if err != OK:
		print("Unable connect to server")
		return
	get_tree().network_peer = client


func _connected_to_server():
	print("Connected to server")


func _server_disconnected():
	print("Server disconnected")


func _connection_failed():
	print("Connection failed")


-MainMenuUI.gd

func _ready():
	Server.join_server()


func _on_StartGameButton_pressed():
     rpc_id(1, "_create_room", username)


Server:

extends Node


func _ready():
	with_multiplayerapi()


func with_multiplayerapi():
	var server = NetworkedMultiplayerENet.new()
	server.set_bind_ip("127.0.0.1")
	var error = server.create_server(4242)
	if error != OK:
		print("Unable to start server: ", error)
		return
	get_tree().network_peer = server
	get_tree().connect("network_peer_connected", self, "_player_connected")
	get_tree().connect("network_peer_disconnected", self, "_player_disconnected")
	print("Server started")


func _player_connected(id):
	print("Player ", id, " connected to the server")


func _player_disconnected(id):
	print("Player ", id, " disconnected from the server")

func _create_room(username):
    #код функции
  • Вопрос задан
  • 44 просмотра
Пригласить эксперта
Ответы на вопрос 1
@r245_r
Для вызовов rpc у вас должна быть одинаковый путь до нода. Если я не ошибаюсь, то при rpc вызове _create_room из root/MainNode/MainMenuUI на клиенте, Godot попытается найти на сервере такой же путь root/MainNode/MainMenuUI, но не найдет.

Я бы создал что-то вроде root/MainNode/Multiplayer/RoomManager на клиенте и на сервере (у них должен быть одинаковый путь в дереве нодов). В RoomManager на клиенте сделал бы функцию
func create_room_on_server(username): #вызовите ее из внешнего нода (вашего меню)
  rpc_id(1, "_create_room", username)


В RoomManager на сервере сделал бы функцию
remote func _create_room(username):
  ...


То есть суть в том, чтобы у нодов, вызывающих и принимающих rpc в дереве был одинаковый путь на клиенте и сервере.

А так, это все вроде в документации есть ;-) https://docs.godotengine.org/ru/3.x/tutorials/netw...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы