95 lines
2.7 KiB
C#
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);
|
|
}
|
|
}
|