Character camera and movement fix - maybe

This commit is contained in:
2025-10-12 13:27:37 +02:00
parent 0f716ab4a7
commit 78836c0691
6 changed files with 191 additions and 12 deletions

View File

@@ -268,6 +268,12 @@ namespace MegaKoop.Game.Networking
}
}
var controller = clone.GetComponent<ThirdPersonCharacterController>();
if (!info.IsLocal && controller != null)
{
controller.SetCameraTransform(null);
}
// Ensure only the local player's camera remains active and is MainCamera
if (info.IsLocal)
{
@@ -297,7 +303,6 @@ namespace MegaKoop.Game.Networking
}
// Bind the character controller to this camera for input-relative movement
var controller = clone.GetComponent<ThirdPersonCharacterController>();
if (controller != null)
{
Transform camTransform = thirdPersonCamera != null ? thirdPersonCamera.transform : (Camera.main != null ? Camera.main.transform : null);
@@ -306,6 +311,11 @@ namespace MegaKoop.Game.Networking
controller.SetCameraTransform(camTransform);
}
}
if (inputSender != null && thirdPersonCamera != null)
{
inputSender.SetCameraTransform(thirdPersonCamera.transform);
}
}
}

View File

@@ -1,4 +1,5 @@
using UnityEngine;
using MegaKoop.Game;
namespace MegaKoop.Game.Networking
{
@@ -7,6 +8,7 @@ namespace MegaKoop.Game.Networking
{
[SerializeField] private SteamCharacterNetworkBridge characterNetwork;
[SerializeField] private float sendInterval = 0.05f;
[SerializeField] private Transform cameraTransform;
private float sendTimer;
@@ -16,6 +18,23 @@ namespace MegaKoop.Game.Networking
{
characterNetwork = GetComponent<SteamCharacterNetworkBridge>();
}
if (cameraTransform == null)
{
var thirdPersonCamera = GetComponentInChildren<ThirdPersonCamera>(true);
if (thirdPersonCamera != null)
{
cameraTransform = thirdPersonCamera.transform;
}
else if (characterNetwork != null && characterNetwork.IsLocalPlayer)
{
Camera mainCamera = Camera.main;
if (mainCamera != null && mainCamera.transform.IsChildOf(transform))
{
cameraTransform = mainCamera.transform;
}
}
}
}
private void Update()
@@ -32,13 +51,58 @@ namespace MegaKoop.Game.Networking
sendTimer -= Time.deltaTime;
Vector2 moveInput = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
moveInput = Vector2.ClampMagnitude(moveInput, 1f);
Vector2 planarMove = ConvertToWorldSpace(moveInput);
bool jumpPressed = Input.GetButtonDown("Jump");
if (sendTimer <= 0f || jumpPressed)
{
characterNetwork.SendLocalInput(moveInput, jumpPressed);
characterNetwork.SendLocalInput(planarMove, jumpPressed);
sendTimer = sendInterval;
}
}
public void SetCameraTransform(Transform camera)
{
cameraTransform = camera;
}
private Vector2 ConvertToWorldSpace(Vector2 moveInput)
{
if (cameraTransform == null)
{
return moveInput;
}
Vector3 forward = cameraTransform.forward;
Vector3 right = cameraTransform.right;
forward.y = 0f;
right.y = 0f;
float forwardSqr = forward.sqrMagnitude;
float rightSqr = right.sqrMagnitude;
if (forwardSqr < 0.0001f && rightSqr < 0.0001f)
{
return moveInput;
}
if (forwardSqr > 0.0001f)
{
forward.Normalize();
}
if (rightSqr > 0.0001f)
{
right.Normalize();
}
Vector3 desiredMove = forward * moveInput.y + right * moveInput.x;
if (desiredMove.sqrMagnitude > 1f)
{
desiredMove.Normalize();
}
return new Vector2(desiredMove.x, desiredMove.z);
}
}
}