This commit is contained in:
2026-05-12 21:43:03 +07:00
parent 5025383676
commit a1e52f95ad
12 changed files with 995 additions and 32 deletions

View File

@@ -248,6 +248,25 @@ namespace Hallucinate.UI
{
SendLocalMetaData(player);
}
// Spawn player character if we are the server and in the game scene
if (runner.IsServer && UnityEngine.SceneManagement.SceneManager.GetActiveScene().name == "Main Scene")
{
SpawnPlayer(runner, player);
}
}
private void SpawnPlayer(NetworkRunner runner, PlayerRef player)
{
if (_spawnedCharacters.ContainsKey(player)) return;
// Simple spawn logic: Host on left, Client on right
// Using Vector3(..., 1, ...) to ensure player is above the ground
Vector3 spawnPosition = (player == runner.LocalPlayer) ? new Vector3(-8, 1, 0) : new Vector3(8, 1, 0);
Debug.Log($"[BasicSpawner] Spawning player {player} at {spawnPosition}");
var networkPlayerObject = runner.Spawn(_playerPrefab, spawnPosition, Quaternion.identity, player);
_spawnedCharacters.Add(player, networkPlayerObject);
}
private async void SendLocalMetaData(PlayerRef player)
@@ -297,7 +316,10 @@ namespace Hallucinate.UI
{
if (_spawnedCharacters.TryGetValue(player, out NetworkObject networkObject))
{
runner.Despawn(networkObject);
if (networkObject != null && networkObject.IsValid)
{
runner.Despawn(networkObject);
}
_spawnedCharacters.Remove(player);
}
@@ -408,9 +430,7 @@ namespace Hallucinate.UI
{
foreach (var player in runner.ActivePlayers)
{
Vector2 spawnPosition = (player == runner.LocalPlayer) ? new Vector2(-8, 0) : new Vector2(8, 0);
var networkPlayerObject = runner.Spawn(_playerPrefab, spawnPosition, Quaternion.identity, player);
_spawnedCharacters.Add(player, networkPlayerObject);
SpawnPlayer(runner, player);
}
}
if (currentSceneName == "Main Scene")

View File

@@ -26,7 +26,6 @@ namespace OnlyScove.Scripts
[Networked] public bool IsGrounded { get; set; }
[Networked] public bool WasGrounded { get; set; }
[Networked] public float VelocityY { get; set; }
[Networked] public Vector3 NetworkedPosition { get; set; }
private CharacterController controller;
@@ -48,10 +47,6 @@ namespace OnlyScove.Scripts
if (controller != null && controller.enabled)
{
controller.Move(velocity * deltaTime);
if (Object != null && Object.HasStateAuthority)
{
NetworkedPosition = transform.position;
}
}
}

View File

@@ -92,18 +92,13 @@ namespace OnlyScove.Scripts
public override void Spawned()
{
InitializePlayer();
if (Object != null && !Object.HasInputAuthority && Runner.IsClient)
{
if (Controller != null) Controller.enabled = false;
}
}
private void InitializePlayer()
{
if (currentState == null) SwitchState(new PlayerIdleState(this));
bool isLocal = (Object != null && Object.HasInputAuthority) || (Runner == null || !Runner.IsRunning);
bool isOffline = Runner == null || !Runner.IsRunning;
if (isOffline || (Object != null && Object.HasInputAuthority))
if (isLocal)
{
Local = this;
CameraController cameraController = GameObject.FindAnyObjectByType<CameraController>();
@@ -116,6 +111,7 @@ namespace OnlyScove.Scripts
if (Input != null)
{
Input.enabled = true; // Ensure local input is enabled
Input.OnNextInteractEvent -= Interaction.NextInteract;
Input.OnNextInteractEvent += Interaction.NextInteract;
Input.OnPreviousInteractEvent -= Interaction.PreviousInteract;
@@ -124,6 +120,16 @@ namespace OnlyScove.Scripts
if (Controller != null) Controller.enabled = true;
}
else
{
// Disable input for proxies to prevent "Input Overlap"
if (Input != null) Input.enabled = false;
// On clients, proxies don't need CharacterController enabled
if (Runner != null && Runner.IsClient && Controller != null) Controller.enabled = false;
}
if (currentState == null) SwitchState(new PlayerIdleState(this));
}
private void OnDestroy()
@@ -181,6 +187,7 @@ namespace OnlyScove.Scripts
IsSprintHeld = UnityEngine.Input.GetKey(KeyCode.LeftShift);
}
// Only run logic if we have Input Authority (Local Player) or State Authority (Server simulating Player)
if (!isRunning || (Object != null && Object.IsValid && (Object.HasInputAuthority || Runner.IsServer)))
{
if (hasControl)
@@ -197,11 +204,7 @@ namespace OnlyScove.Scripts
bool isRunning = Runner != null && Runner.IsRunning;
if (isRunning && Object != null && Object.IsValid && !Object.HasInputAuthority)
{
// Smooth interpolation for proxies
if (Movement.NetworkedPosition != Vector3.zero)
{
transform.position = Vector3.Lerp(transform.position, Movement.NetworkedPosition, Runner.DeltaTime * 15f);
}
// Note: We now rely on NetworkTransform component for position syncing
UpdateAnimator(Runner.DeltaTime);
}
else if (!isRunning)