Files
Multiplayer/Assets/Scripts/Movement.cs
2025-06-16 15:24:27 +02:00

95 lines
2.7 KiB
C#

using Mirror;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Movement : NetworkBehaviour
{
[Header("Movement Settings")]
[SerializeField] private float walkingSpeed = 7.5f;
[SerializeField] private float runningSpeed = 11.5f;
[SerializeField] private float jumpHeight = 8.0f;
[SerializeField] private float gravity = 20.0f;
public Camera playerCamera;
[Header("Grounding")]
[SerializeField] private LayerMask groundMask;
[SerializeField] private Transform groundedCheck;
[SerializeField] private float groundedDistance = 2;
[Header("Camera")]
[SerializeField] private Transform camHolder;
[SerializeField] private float lookSpeed = 2.0f;
[SerializeField] private float lookXLimit = 45.0f;
float rotationX = 0;
Vector2 inputDir;
public CharacterController characterController { get; private set; }
public bool isGrounded { get; private set; }
Vector3 velocity;
void Start()
{
Cursor.lockState = CursorLockMode.Locked;
characterController = GetComponent<CharacterController>();
}
void FixedUpdate()
{
if (!isLocalPlayer) return;
CheckIfGrounded();
bool isRunning = Input.GetKey(KeyCode.LeftShift);
MovementHandler(isRunning);
}
private void MovementHandler(bool isRunning)
{
if (isGrounded && velocity.y < 0)
velocity.y = 0f;
Vector3 moveDir = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical")).normalized;
Vector3 fixedMoveDir;
moveDir *= (isRunning ? runningSpeed : walkingSpeed);
moveDir = transform.TransformDirection(moveDir);
if (Input.GetButtonDown("Jump") && isGrounded)
velocity.y += Mathf.Sqrt(jumpHeight * -3.0f * -gravity);
velocity.y -= gravity * Time.deltaTime;
fixedMoveDir = moveDir;
fixedMoveDir.y = velocity.y;
characterController.Move(fixedMoveDir * Time.deltaTime);
}
public void CheckIfGrounded()
{
isGrounded = Physics.Raycast(groundedCheck.position, Vector3.down, groundedDistance, groundMask);
}
private void LateUpdate()
{
if (!isLocalPlayer) return;
inputDir = new Vector2(Input.GetAxisRaw("Mouse X"), Input.GetAxisRaw("Mouse Y"));
rotationX += -inputDir.y * lookSpeed;
rotationX = Mathf.Clamp(rotationX, -lookXLimit, lookXLimit);
camHolder.transform.localRotation = Quaternion.Euler(rotationX, 0, 0);
transform.rotation *= Quaternion.Euler(0, inputDir.x * lookSpeed, 0);
}
private void OnDrawGizmos()
{
if (groundedCheck)
Gizmos.DrawRay(groundedCheck.position, Vector3.down * groundedDistance);
}
}