Я пытаюсь остановить скольжение спрайта после того, как кнопка больше не нажимается - PullRequest
0 голосов
/ 23 июня 2019

Итак, я хочу создать небольшой платформер с обычными вещами, такими как персонаж, враги и т. Д. Я добавил код, который позволяет моему персонажу двигаться влево и вправо, однако, когда я прекращаю нажимать кнопку, соответствующую направлению, спрайт продолжает двигаться, как если бы он был на льду.Может кто-нибудь помочь мне решить эту проблему, так как у меня нет ни единой подсказки, что пошло не так?

public float speed = 2f;
Rigidbody2D mRB2D;
datasheet mDTS;

// Start is called before the first frame update
void Start()
{
    mDTS = GetComponent<datasheet>();
    Debug.Assert(mDTS != null, "require datasheet");
}

// Update is called once per frame
void Update()
{
    float tHorizontal = Input.GetAxis("Horizontal");
    //float tVertical = Input.Get
    mDTS.movement += (Vector2)transform.right * speed * tHorizontal * Time.deltaTime;
}

~

public float max_ms = 6f;    
public Vector2 movement = Vector2.zero;

// Start is called before the first frame update
void Start()
{

}

// Update is called once per frame
void Update()
{
    transform.position += (Vector3)movement * Time.deltaTime;
}

private void LateUpdate()
{
    SpeedClamp();

}

void SpeedClamp()
{
    if (movement.magnitude > max_ms)
    {
        movement = movement.normalized * max_ms;
    }
}

1 Ответ

0 голосов
/ 23 июня 2019

О, понятно.

Вы нажимаете кнопку со стрелкой вправо. Теперь посмотрите на эту строку:

mDTS.movement += (Vector2)transform.right * speed * tHorizontal * Time.deltaTime;

mDTS.movement будет увеличен. Допустим, это первый раз, когда вы нажимаете «стрелка вправо». Скажем, mDTS.movement был (0,0) -вектором до нажатия, а теперь он (1,0) -вектором из-за увеличения. Когда вы отпустите кнопку, mDTS.movement не будет снова установлен в 0.

Нет «взлома». Нет трения. Что вам нужно сделать, это (что-то вроде этого):

float friction = 0.95f;
float halt_speed = 0.05f;
void SpeedClamp()
{
    if (movement.magnitude > max_ms)
    {
        movement = movement.normalized * max_ms;
    }
    movement = movement * friction;
    if (movement.magnitude < halt_speed)
        movement = Vector2.Zero;
}

С этим кодом персонаж будет замедляться при каждом обновлении. Как машина на дороге, когда ты больше не ускоряешься. Просто катится без поломок.

Если вам не нужен «ледяной эффект», просто установите вектор движения на ноль, как только вы отпустите кнопку. Как:

// Update is called once per frame
void Update()
{
    float tHorizontal = Input.GetAxis("Horizontal");
    //float tVertical = Input.Get
    if (tHorizontal != 0.0f) {
        mDTS.movement += (Vector2)transform.right * speed * tHorizontal * Time.deltaTime;
    } else {
        mDTS.movement = Vector2.Zero;
    }
}

Однако этот режим заставит вашего персонажа быстро бегать, пока вы нажимаете кнопку, и как только вы отпускаете кнопку, персонаж мгновенно останавливается.

...