Search Unity

Can't turn off camera movement while game is paused

Discussion in 'Getting Started' started by bLazed_offl, Jan 4, 2022.

  1. bLazed_offl

    bLazed_offl

    Joined:
    Jan 31, 2021
    Posts:
    2
    Character script:

    using UnityEngine;

    public class CustomCharacterController : MonoBehaviour
    {
    // Attrib
    [Header("Attributes")]
    //[SerializeField] private Animator anim;
    public Animator anim;
    //[SerializeField] private Rigidbody rig;
    public Rigidbody rig;
    //[SerializeField] private Transform mainCamera;
    public Transform mainCamera;
    // Move
    [Header("Moving")]
    [SerializeField] private float jumpForce = 3.8f;
    [SerializeField] private float walkingSpeed = 3.5f;
    [SerializeField] private float runningSpeed = 6f;
    [SerializeField] private float currentSpeed;
    [SerializeField] private float animationInterpolation = 1f;
    // Step offset
    [Header("Player Step Climb")]
    [SerializeField] private GameObject stepRayUpper;
    [SerializeField] private GameObject stepRayLower;
    [SerializeField] private float stepHeight = 0.25f;
    [SerializeField] private float stepSmooth = 2f;

    private PauseMenu pause;

    private void Start()
    {
    // Прекрепляем курсор к середине экрана
    Cursor.lockState = CursorLockMode.Locked;
    // и делаем его невидимым
    Cursor.visible = false;

    //stepRayUpper.transform.position = new Vector3(stepRayUpper.transform.position.x, stepHeight,
    //stepRayUpper.transform.position.z);
    }

    private void Update()
    {
    MotionChar();
    }

    private void FixedUpdate()
    {
    StepClimb();
    }

    private void LateUpdate()
    {
    MotionCamera();
    }

    private void Run()
    {
    animationInterpolation = Mathf.Lerp(animationInterpolation, 1.5f, Time.deltaTime * 3);
    anim.SetFloat("x", Input.GetAxis("Horizontal") * animationInterpolation);
    anim.SetFloat("y", Input.GetAxis("Vertical") * animationInterpolation);

    currentSpeed = Mathf.Lerp(currentSpeed, runningSpeed, Time.deltaTime * 3);
    }
    private void Walk()
    {
    // Mathf.Lerp - отвечает за то, чтобы каждый кадр число animationInterpolation(в данном случае) приближалось к числу 1 со скоростью Time.deltaTime * 3.
    // Time.deltaTime - это время между этим кадром и предыдущим кадром. Это позволяет плавно переходить с одного числа до второго НЕЗАВИСИМО ОТ КАДРОВ В СЕКУНДУ (FPS)!!!
    animationInterpolation = Mathf.Lerp(animationInterpolation, 1f, Time.deltaTime * 3);
    anim.SetFloat("x", Input.GetAxis("Horizontal") * animationInterpolation);
    anim.SetFloat("y", Input.GetAxis("Vertical") * animationInterpolation);

    currentSpeed = Mathf.Lerp(currentSpeed, walkingSpeed, Time.deltaTime * 3);
    }

    private void Jump()
    {
    // Выполняем прыжок по команде анимации.
    rig.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
    }

    private void MotionChar()
    {
    // Устанавливаем поворот персонажа когда камера поворачивается
    var rotation = transform.rotation;
    rotation = Quaternion.Euler(rotation.eulerAngles.x, mainCamera.rotation.eulerAngles.y, rotation.eulerAngles.z);
    transform.rotation = rotation;

    // Зажаты ли кнопки W и Shift?
    if(Input.GetKey(KeyCode.W) && Input.GetKey(KeyCode.LeftShift))
    Run();
    // Если W & Shift не зажаты, то мы просто идем пешком
    else
    Walk();

    //Если зажат пробел, то в аниматоре отправляем сообщение тригеру, который активирует анимацию прыжка
    if (Input.GetKeyDown(KeyCode.Space))
    anim.SetTrigger("Jump");

    }

    private void MotionCamera()
    {
    // Здесь мы задаем движение персонажа в зависимости от направления в которое смотрит камера
    // Сохраняем направление вперед и вправо от камеры
    var camF = mainCamera.forward;
    var camR = mainCamera.right;
    // Чтобы направления вперед и вправо не зависили от того смотрит ли камера вверх или вниз, иначе когда мы смотрим вперед, персонаж будет идти быстрее чем когда смотрит вверх или вниз
    // Можете сами проверить что будет убрав camF.y = 0 и camR.y = 0 :)
    camF.y = 0;
    camR.y = 0;
    // Тут мы умножаем наше нажатие на кнопки W & S на направление камеры вперед и прибавляем к нажатиям на кнопки A & D и умножаем на направление камеры вправо
    var movingVector = Vector3.ClampMagnitude(camF.normalized * (Input.GetAxis("Vertical") * currentSpeed) +
    camR.normalized * (Input.GetAxis("Horizontal") * currentSpeed),currentSpeed);
    // Magnitude - это длинна вектора. я делю длинну на currentSpeed так как мы умножаем этот вектор на currentSpeed на 86 строке. Я хочу получить число максимум 1.
    anim.SetFloat("magnitude", movingVector.magnitude/currentSpeed);
    // Здесь мы двигаем персонажа! Устанавливаем движение только по x & z потому что мы не хотим чтобы наш персонаж взлетал в воздух
    rig.velocity = new Vector3(movingVector.x, rig.velocity.y,movingVector.z);
    // У меня был баг, что персонаж крутился на месте и это исправил с помощью этой строки
    rig.angularVelocity = Vector3.zero;
    }

    // Step offset method
    private void StepClimb()
    {
    RaycastHit hitLower;
    if (Physics.Raycast(stepRayLower.transform.position, transform.TransformDirection(Vector3.forward), out hitLower, 0.1f))
    {
    RaycastHit hitUpper;
    if (!Physics.Raycast(stepRayUpper.transform.position, transform.TransformDirection(Vector3.forward), out hitUpper, 0.2f))
    {
    rig.position -= new Vector3(0f, -stepSmooth * Time.deltaTime, 0f);
    }
    }

    RaycastHit hitLower45;
    if (Physics.Raycast(stepRayLower.transform.position, transform.TransformDirection(1.5f, 0, 1), out hitLower45, 0.1f))
    {
    RaycastHit hitUpper45;
    if (!Physics.Raycast(stepRayUpper.transform.position, transform.TransformDirection(1.5f, 0, 1), out hitUpper45, 0.2f))
    {
    rig.position -= new Vector3(0f, -stepSmooth * Time.deltaTime, 0f);
    }
    }

    RaycastHit hitLowerMinus45;
    if (Physics.Raycast(stepRayLower.transform.position, transform.TransformDirection(-1.5f, 0, 1), out hitLowerMinus45, 0.1f))
    {
    RaycastHit hitUpperMinus45;
    if (!Physics.Raycast(stepRayUpper.transform.position, transform.TransformDirection(-1.5f, 0, 1), out hitUpperMinus45, 0.2f))
    {
    rig.position -= new Vector3(0f, -stepSmooth * Time.deltaTime, 0f);
    }
    }
    }
    }



    Pause script:


    using UnityEngine;
    using UnityEngine.SceneManagement;

    public class PauseMenu : MonoBehaviour
    {
    public GameObject pauseMenuUI;
    public bool gameIsPaused = false;

    public CustomCharacterController cameraMovement;


    private void Update()
    {
    if (Input.GetKeyDown(KeyCode.Escape))
    {
    if (gameIsPaused)
    Resume();
    else
    Pause();
    }
    }

    public void Resume()
    {
    Time.timeScale = 1f;
    pauseMenuUI.SetActive(false);
    gameIsPaused = false;

    cameraMovement.enabled = true;
    Cursor.lockState = CursorLockMode.Locked;
    }

    void Pause()
    {
    Time.timeScale = 0f;
    pauseMenuUI.SetActive(true);
    gameIsPaused = true;

    cameraMovement.enabled = false;
    Cursor.lockState = CursorLockMode.None;
    }

    public void ExitToMenu()
    {
    Time.timeScale = 1f;
    SceneManager.LoadScene("MainMenu");
    }
    }
     

    Attached Files:

  2. bLazed_offl

    bLazed_offl

    Joined:
    Jan 31, 2021
    Posts:
    2
    not relevant, problem solved