Как мне сделать движение моего персонажа менее «глючным»

#c# #visual-studio #unity3d

#c# #visual-studio #unity3d

Вопрос:

Всякий раз, когда я натыкаюсь на стену, например, если слева от меня стена, и я прижимаю букву «а» к стене, это как бы сбивает с толку. Похоже, что персонаж входит и выходит из стены. Надеюсь, это имело смысл, и вы знаете, о чем я говорю. Итак, мой вопрос в том, как я могу это исправить, чтобы, когда я активно сталкиваюсь со стеной, этого не происходило, и вместо этого персонаж просто стоял у стены и, похоже, вообще двигался.

код для движения:

 void Update()
{
var movement = Input.GetAxis("Horizontal");
        transform.position  = new Vector3(movement, 0, 0) * Time.deltaTime * MovementSpeed;
        if (Input.GetButtonDown("Jump") amp;amp; Mathf.Abs(_rigidbody.velocity.y) < .001f)
        {
            _rigidbody.AddForce(new Vector2(0, JumpForce), ForceMode2D.Impulse);
        }
}
 

Ответ №1:

Установка transform.position буквально телепортирует игрока, поэтому иногда он телепортирует их в стену, а затем их отбрасывает назад. Чтобы предотвратить это, я предлагаю использовать функцию MovePosition rigidbody. Это учитывает физику при движении, поэтому оно взаимодействует с другими объектами, которые там есть.

Чтобы изменить ваш текущий код на это, это было бы что-то вроде этого:

     void Update()
    {
        var movement = Input.GetAxis("Horizontal");
        //This moves the GameObject to the currentPosition   The move direction. Which means to move it in the direction that you intended to move in.
        _rigidbody.MovePosition(transform.position   new Vector3(movement, 0, 0) * Time.deltaTime * movementSpeed);

        if (Input.GetButtonDown("Jump") amp;amp; Mathf.Abs(_rigidbody.velocity.y) < .001f)
        {
        _rigidbody.AddForce(new Vector2(0, JumpForce), ForceMode2D.Impulse);
        }
    }
 

Однако я предлагаю разделить его на это:

 float movement = 0f; //Setting a default value.

void Update()
{
    movement = Input.GetAxis("Horizontal"); //Getting movement input from player

    if (Input.GetButtonDown("Jump") amp;amp; Mathf.Abs(_rigidbody.velocity.y) < .001f)
    {
        _rigidbody.AddForce(new Vector2(0, JumpForce), ForceMode2D.Impulse);
    }
}

private void FixedUpdate()
{ //Moving in Physics update
    _rigidbody.MovePosition(transform.position   new Vector3(movement, 0, 0) * Time.deltaTime * movementSpeed);
}
 

Поскольку Update проверяет каждый кадр, поэтому он хорош для проверки ввода, однако вы должны применять физику в FixedUpdate() , потому что это применяется всякий раз, когда есть обновление физики (или фрейм физики). (Для еще большей плавности!)