@Seriy_Chelovek

Unity конфликт функций Move и Velocity?

Делал управление персонажем в Unity. Все работает отлично, кроме прыжка, а именно прыжок возможен только при перемещении персонажа. Есть две вызываемые функции - одна отвечает за перемещение(Movement), вторая за прыжок(Velocity). Опытным путем понял, что они конфликтуют,
spoiler
при удалении функции Movement из Update прыжок отлично срабатывает, но персонажем, естественно, управлять не получится.
но в чем именно дело понять не могу. Объясните, в чем беда.

using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.InputSystem;

public class PlayerContoller : MonoBehaviour
{
    [SerializeField] private CharacterController _characterController;
    [SerializeField] private Transform _cameraTransform;
    

    [Header("Settings")]
   
    [SerializeField] private float _gravity = -14f;
    [SerializeField] private float _speed = 4f;
    [SerializeField] private float _jumpHeight = 1f;

    [Range(1, 100)]
    [SerializeField] private float _sensitivity = 50f;

    float rotationX;

    Vector3 velocity;
    Vector3 move;
    void Start()
    {

        Cursor.lockState = CursorLockMode.Locked;
        Cursor.visible = false;
    }

    void Update()
    {
        
        Rotate();
        Movement();
        Velocity();


    }
    

    private void Rotate()
    {
        float mouseX = Input.GetAxis("Mouse X") * _sensitivity * Time.deltaTime;
        float mouseY = Input.GetAxis("Mouse Y") * _sensitivity * Time.deltaTime;

        rotationX -= mouseY;

        rotationX = Mathf.Clamp(rotationX, -90f, 90f);

        _cameraTransform.localRotation = Quaternion.Euler(rotationX, 0, 0);

        transform.Rotate(Vector3.up * mouseX);
    }
    private void Velocity()
    {
       
        if (_characterController.isGrounded && velocity.y < 0)
            velocity.y = -2f;

        velocity.y += Time.deltaTime * _gravity;

        if (Input.GetKeyDown(KeyCode.Space) && _characterController.isGrounded)
            velocity.y = Mathf.Sqrt(_jumpHeight * -2f * _gravity);


        _characterController.Move(velocity * Time.deltaTime);

    }

    private void Movement()
    {
        
        float moveX = Input.GetAxis("Horizontal");
        float moveY = Input.GetAxis("Vertical");

        move = transform.forward * moveY + transform.right * moveX;

        _characterController.Move(move * _speed * Time.deltaTime);
    }

  
}
  • Вопрос задан
  • 129 просмотров
Пригласить эксперта
Ответы на вопрос 1
@DrRen7
у вас 2 раза вызывает _characterController.Move
в Velocity() сделайте расчет float verticalMover(это будет velocity.y)
private void Movement() ....
_characterController.Move(move * _speed * Time.deltaTime+transform.up*verticalMover*Time.deltaTime );
....
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы