Top.Mail.Ru
Ответы

Создание сервера Godot 4.4 через локальную сеть

Я создаю 2D игру и хочу сделать мультиплеер через локальную сеть У меня возникла ошибка Я не понимаю как её исправить и он пишет то что id равен нулю как это исправить

12345678910111213141516171819202122232425262728293031323334
 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")  

ошибка выходит тут

123456
 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
подключиться к серверу ничего не открывает

пожалуйста помогите

По дате
По рейтингу
Аватар пользователя
Оракул
2мес

1. Вы вызываете change_scene_to_packed(), а сразу после этого обращаетесь к get_tree().current_scene.
В Godot 4 смена сцены происходит в конце кадра, поэтому сразу после change_scene_to_packed() current_scene ещё равен null.

2. Вы создаёте экземпляр игрока неправильно:

12
 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])