Создание сервера Godot 4.4 через локальную сеть
Я создаю 2D игру и хочу сделать мультиплеер через локальную сеть У меня возникла ошибка Я не понимаю как её исправить и он пишет то что id равен нулю как это исправить
extends Control
var Port = 23456
var Ip_address = '127.0.0.1'
var game_scene = preload("res://ShopLocition/fight_location.tscn")
func _on_host_server_pressed() -> void:
var peer = ENetMultiplayerPeer.new()
var result = peer.create_server(Port,5)
if result != OK:
print("Faild")
return
multiplayer.multiplayer_peer = peer
multiplayer.peer_connected.connect(connect_player)
print("host server creat")
func connect_player(id): # Проверяем, что дерево сцены доступно
await get_tree().create_timer(0.1).timeout
add_player(id)
func add_player(id):
get_tree().change_scene_to_packed(game_scene)
var player_scene = preload("res://character/player.tscn").get_instance_id()
player_scene = str(id)
get_tree().current_scene.add_child(player_scene)
player_scene.position = Vector2(randi_range(200,500),800)
func _on_just_server_pressed() -> void:
var peer =ENetMultiplayerPeer.new()
peer.create_client(Ip_address,Port)
get_tree().set_multiplayer(peer)
multiplayer.multiplayer_peer = peer
print("server join")
ошибка выходит тут
get_tree().current_scene.add_child(player_scene)
пишет то что
Invalid access to property or key 'current_scene' on a base object of type 'null instanse'
работает без добавления персонажа открывает только сцену
где должна происходить сама игра и открывается только то
откладка которая нажимал создать сервер a
подключиться к серверу ничего не открывает
пожалуйста помогите
1. Вы вызываете change_scene_to_packed(), а сразу после этого обращаетесь к get_tree().current_scene.
В Godot 4 смена сцены происходит в конце кадра, поэтому сразу после change_scene_to_packed() current_scene ещё равен null.
2. Вы создаёте экземпляр игрока неправильно:
var player_scene = preload("res://character/player.tscn").get_instance_id()
player_scene = str(id)
get_instance_id() возвращает число, а не сам узел! Потом вы ещё и превращаете его в строку…
3. Вы никогда не ждёте момента, когда новая сцена действительно загрузилась — поэтому и current_scene == null.
Исправленный вариант:
extends Control
var PORT := 23456
var IP_ADDRESS := "127.0.0.1"
var game_scene_packed := preload("res://ShopLocition/fight_location.tscn")
var player_scene_packed := preload("res://character/player.tscn")
func _on_host_server_pressed() -> void:
var peer = ENetMultiplayerPeer.new ()
if peer.create_server(PORT, 5) != OK:
push_error("Failed to start server")
return
multiplayer.multiplayer_peer = peer
multiplayer.peer_connected.connect(_on_peer_connected)
print("Server started on port %d" % PORT)
func _on_peer_connected(id: int) -> void:
await get_tree().process_frame
_add_player(id)
func _add_player(id: int) -> void:
get_tree().change_scene_to_packed(game_scene_packed)
await get_tree().scene_changed
var player = player_scene_packed.instantiate()
player.name = "Player_%d" % id
if player.has_method("set_global_position"):
player.set_global_position(Vector2(randi_range(200, 500), 800))
elif player.has_meta("position"):
player.position = Vector2(randi_range(200, 500), 800)
var root = get_tree().current_scene
if root:
root.add_child(player)
else:
push_error("current_scene is still null!")
func _on_just_server_pressed() -> void:
var peer = ENetMultiplayerPeer.new ()
peer.create_client(IP_ADDRESS, PORT)
multiplayer.multiplayer_peer = peer
print("Joined server at %s:%d" % [IP_ADDRESS, PORT])