Godot Version
4.6.stable.mono.official [89cea1439]
Question
I’m setting up a little dummy project to confirm I understand how the high level multiplayer systems work before I commit to building something larger for a real project. Currently I’m using MultiplayerSpawners and MultiplayerSynchronizers to load an arbitrary number of little Godot icons into a 3D level and move them around. Currently, clients work great. I can join with a handful of client players and they all move and replicate their movement, since position is synced with the MultiplayerSynchronizer. The issue is that the host does not seem to be broadcasting its position changes, though it can observe the client position changes.
Player:
class_name Player extends CharacterBody3D
@export var speed = 1.0
@export var gravity = 1.0
var up_down: float = 0.0;
var left_right: float = 0.0;
func _enter_tree() -> void:
set_multiplayer_authority(name.to_int())
func _ready() -> void:
# Follow own character
if is_multiplayer_authority():
var player_camera = CameraManagerGlobal.get_player_camera()
player_camera.follow_target = self
player_camera.current = true
func _physics_process(delta: float) -> void:
if !is_multiplayer_authority(): return
if !is_on_floor():
velocity.y -= gravity * delta
else:
velocity.y = 0.0
var left_right := Input.get_axis("Left", "Right")
var up_down := Input.get_axis("Up", "Down")
var input_vec := Vector2(
left_right,
up_down
).normalized()
velocity.x = input_vec.x * speed
velocity.z = input_vec.y * speed
move_and_slide()
Spawner:
extends MultiplayerSpawner
@export var network_player: PackedScene
@export var player_spawn_1: Node3D
@export var player_spawn_2: Node3D
@export var player_spawn_3: Node3D
@export var player_spawn_4: Node3D
func _ready() -> void:
multiplayer.peer_connected.connect(spawn_player)
func spawn_player(id: int) -> void:
if !multiplayer.is_server(): return
var player: Node = network_player.instantiate()
player.name = str(id)
player.position = player_spawn_1.position
get_node(spawn_path).call_deferred("add_child", player)
test_level
extends Node3D
var multiplayerSpawner: MultiplayerSpawner
var playerSpawners: Node
func _ready() -> void:
multiplayerSpawner = find_child("Spawner")
playerSpawners = find_child("Spawner").find_child("Players")
if multiplayer.is_server():
multiplayerSpawner.spawn_player(multiplayer.get_unique_id()) # Server is always id 1