Files
FORT-BO/Assets/CONTENT/Friendslop/Scripts/Networking/FriendslopPlayerMotor.cs
T

65 lines
1.8 KiB
C#

using Unity.Netcode;
using UnityEngine;
using UnityEngine.InputSystem;
/// <summary>
/// Server-authoritative prototype movement.
/// The owner reads input, the server applies it, and NetworkTransform replicates the result.
/// </summary>
[RequireComponent(typeof(NetworkObject))]
public sealed class FriendslopPlayerMotor : NetworkBehaviour
{
[SerializeField, Min(0.1f)] private float moveSpeed = 4.5f;
private void Update()
{
if (!IsOwner || !IsSpawned || Keyboard.current == null)
{
return;
}
Vector2 input = ReadMoveInput();
if (IsServer)
{
MoveOnServer(input);
}
else
{
MoveServerRpc(input);
}
}
[ServerRpc]
private void MoveServerRpc(Vector2 input)
{
MoveOnServer(input);
}
private void MoveOnServer(Vector2 input)
{
if (input.sqrMagnitude > 1f)
{
input.Normalize();
}
Vector3 direction = new Vector3(input.x, 0f, input.y);
transform.position += direction * (moveSpeed * Time.deltaTime);
if (direction.sqrMagnitude > 0.001f)
{
transform.forward = Vector3.Slerp(transform.forward, direction, 14f * Time.deltaTime);
}
}
private static Vector2 ReadMoveInput()
{
Keyboard keyboard = Keyboard.current;
float horizontal = (keyboard.dKey.isPressed || keyboard.rightArrowKey.isPressed ? 1f : 0f)
- (keyboard.aKey.isPressed || keyboard.leftArrowKey.isPressed ? 1f : 0f);
float vertical = (keyboard.wKey.isPressed || keyboard.upArrowKey.isPressed ? 1f : 0f)
- (keyboard.sKey.isPressed || keyboard.downArrowKey.isPressed ? 1f : 0f);
return new Vector2(horizontal, vertical);
}
}