Update
This commit is contained in:
@@ -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")
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user