Как предотвратить скольжение при 2D-перемещении

#c# #unity3d

#c# #unity3d

Вопрос:

привет, я хочу переместить свой символ, я огляделся, но не смог найти решения для своего кода, я просто хочу, когда мой символ перемещается, и я не нажал кнопку перемещения вперед, тогда он останавливается, но не мгновенно, он просто останавливается мгновенно после того, как я нажал кнопку d вот мой код

  using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Move : MonoBehaviour
{
    public Rigidbody2D rb2d;
    bool ismoving;
    public float speed = 5f;
    

    void FixedUpdate()
    {
        float horizontal = Input.GetAxis("Horizontal");
        if (Input.GetButton("Horizontal"))
        {
            ismoving = true;
        }
        else { ismoving = false; }

        if (ismoving)
        {
            
            rb2d.AddForce(new Vector2(horizontal, 0) * speed * Time.fixedDeltaTime *10);
        }
        else 
        { 
         while((rb2d.velocity) != (rb2d.velocity = Vector2.zero))
            {
                rb2d.AddForce(new Vector2(horizontal, 0) * Time.fixedDeltaTime *-1);                
            }        
        }
    }
}
  

Комментарии:

1. Пожалуйста, убедитесь, что вы используете правильные теги. Ваш код находится в c# unityscript является / был разновидностью JavaScript, подобной пользовательскому языку, ранее использовавшемуся Unity, и к настоящему времени давно устарел

Ответ №1:

Вы можете изменить множитель для вашего замедления на большее значение

 while((rb2d.velocity) != (rb2d.velocity = Vector2.zero))
    {
        rb2d.AddForce(new Vector2(horizontal, 0) * Time.fixedDeltaTime * -10);                
    }  
  

Теперь он должен замедляться в 10 раз быстрее, чем раньше

Ответ №2:

В настоящее время вы перестаете добавлять силу при отпускании клавиши. Как насчет приближения к скорости 0 после отпускания клавиши? Вот так:

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Move : MonoBehaviour
{
    public Rigidbody2D rb2d;
    bool ismoving;
    public float maxspeed = 5f;
    private float currentSpeed = 0f;
    private float movingDirection = 0f;

    void FixedUpdate()
    {
        float horizontal = Input.GetAxis("Horizontal");
        if (Input.GetButton("Horizontal"))
        {
            ismoving = true;
            movingDirection = horizontal;
        }
        else 
        {
            ismoving = false; 
            // keep the movingDirection as it is.
        }

        if (ismoving)
        {
            // accelerate
            currentSpeed  = 5 * Time.fixedDeltaTime;
            currentSpeed = Mathf.Clamp(currentSpeed, 0, maxspeed); 
        }
        else 
        {
            currentSpeed -= 5 * Time.fixedDeltaTime;
            currentSpeed = Mathf.Clamp(currentSpeed, 0, maxspeed);
            // also fake some friction
            rb2d.velocity = rb2d.velocity * 0.96f;
        }
        // always apply the force, it may be 0 though.
        rb2d.AddForce(new Vector2(movingDirection, 0) * currentSpeed;
    }
}
  

Возможно, это работает лучше при установке скорости вместо добавления силы при таком подходе. Но вы можете понять суть: вместо того, чтобы мгновенно останавливаться, чтобы добавить силу при отпускании клавиши, мы просто уменьшаем переменную currentspeed и продолжаем работать с ней, пока не остановимся. Поскольку horizontal после отпускания клавиши быстро становится 0, я добавил вспомогательную переменную, чтобы запомнить направление, в котором мы двигались, прежде чем отпускать вызываемый movingDirection ключ.

Также полезный совет: попробуйте выполнять все Input... вызовы Update() , сохраняя состояния в переменных, которые вы затем используете FixedUpdate() . Потому что в противном случае вы можете столкнуться с проблемами, когда такие вещи, как Input.GetButtonDown() is true для 2-3 вызовов FixedUpdate, но вы хотите, чтобы что-то происходило один раз за клик / нажатие, как стрельба.