PlayerController

PHOTO EMBED

Thu Apr 28 2022 14:07:10 GMT+0000 (Coordinated Universal Time)

Saved by @DanDHenshaw

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    private Controls controls;
    private CharacterController controller;
    [SerializeField] private GameObject head;
    private AudioSource audioSource;
    private Animator animator;
    
    [Header("Player")]
    [SerializeField] private float walkSpeed = 4f;
    [SerializeField] private float jumpHeight = 1.5f;
    [SerializeField] private float gravity = -19.62f;
    [SerializeField] [Range(0f, 1f)] private float smoothInputSpeed = 0.2f;
    [SerializeField] private AudioClip[] footstepSounds;

    private Vector3 velocity;
    private Vector2 currentInput;
    private Vector2 smoothInputVelocity;

    [Header("Player Grounded")]
    [SerializeField] private Transform groundCheck;
    [SerializeField] private float radius;
    [SerializeField] private LayerMask groundLayer;

    [Header("Mouse")]
    [SerializeField] private float sensitivityX = 100f;
    [SerializeField] private float sensitivityY = 100f;
    private float xRotation = 0f;

    [Header("Weapons")] 
    [SerializeField] private GameObject revolver;
    [SerializeField] private GameObject shotgun;
    bool canSwap = true;
    
    private Vector3 lastPosition;
    private float moveMinimum = 0.01f;

    private void Awake()
    {
        controls = new Controls();

        controls.Player.Primary.performed += _ => Primary();
        controls.Player.Secondary.performed += _ => Secondary();
        controls.Player.Jump.performed += _ => Jump();
        
        controller = GetComponent<CharacterController>();
        audioSource = GetComponent<AudioSource>();
        animator = GetComponent<Animator>();

        Cursor.lockState = CursorLockMode.Locked;
    }

    private void Update()
    {
        Move();
        Look();
        
        velocity.y += gravity * Time.deltaTime;
        controller.Move(velocity * Time.deltaTime);

        if (IsMoving())
        {
            animator.SetBool("Walking", true);
        }
        else
        {
            animator.SetBool("Walking", false);
        }
        
        lastPosition = transform.position;
    }

    private void Move()
    {
        Vector2 input = controls.Player.Movement.ReadValue<Vector2>();
        currentInput = Vector2.SmoothDamp(currentInput, input, ref smoothInputVelocity, smoothInputSpeed);
        Vector3 direction = (-currentInput.y * transform.forward) + (-currentInput.x * transform.right);
        controller.Move(direction * Time.deltaTime * walkSpeed);
    }

    private void Look()
    {
        Vector2 mouseLook = controls.Player.Look.ReadValue<Vector2>();

        float mouseX = mouseLook.x * sensitivityX * Time.deltaTime;
        float mouseY = mouseLook.y * sensitivityY * Time.deltaTime;

        xRotation -= mouseY;
        xRotation = Mathf.Clamp(xRotation, -75f, 75f);

        head.transform.localRotation = Quaternion.Euler(-xRotation, 0, 0);
        transform.Rotate(Vector3.up * mouseX);
    }

    private void Jump()
    {
        if (IsGrounded())
        {
            velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);
        }
    }

    private void Primary()
    {
        if (canSwap)
        {
            canSwap = false;

            shotgun.SetActive(false);
            revolver.SetActive(true);

            Invoke("CanSwapWeapons", 0.75f);
        }
    }
    
    private void Secondary()
    {
        if (canSwap)
        {
            canSwap = false;

            revolver.SetActive(false);
            shotgun.SetActive(true);

            Invoke("CanSwapWeapons", 0.75f);
        }
    }

    public void Footstep()
    {
        audioSource.clip = footstepSounds[Random.Range(0, footstepSounds.Length)];
        audioSource.Play();
    }

    bool IsMoving()
    {
        float distance = Vector3.Distance(transform.position, lastPosition);
        return (distance > moveMinimum);
    }

    private void CanSwapWeapons()
    {
        canSwap = true;
    }
    
    private bool IsGrounded()
    {
        bool isGrounded = Physics.CheckSphere(groundCheck.position, radius, groundLayer);
        Debug.Log(isGrounded);
        
        return isGrounded;
    }

    private void OnDrawGizmosSelected()
    {
        Gizmos.DrawWireSphere(groundCheck.position, radius);
    }
    
    private void OnEnable()
    {
        controls.Enable();
    }

    private void OnDisable()
    {
        controls.Disable();
    }
}
content_copyCOPY