2D символ прилипает к стенам в Unity

#c# #unity3d #2d-games

#c# #unity3d #2d-игры

Вопрос:

Это начало происходить после того, как я написал сценарий для dashing. Теперь, всякий раз, когда я врезаюсь в стены, мой персонаж прилипает к этой стене. Если я бросаюсь к крыше, то я могу, например, ходить по крыше. Кроме того, когда я выполняю тире рядом со стеной / на полу, оно никогда не прекращается после одного нажатия. Любая помощь будет оценена, спасибо. Приведенный ниже код является сценарием dashing, при необходимости я могу опубликовать набор переменных и мой скрипт контроллера символов тоже.

 void Start()
    {
        _rigidbody = GetComponent<Rigidbody2D>();

        dashTime = baseDashTime;
    }

    void Update()
    {
        isGrounded = Physics2D.OverlapCircle(feet.position, checkRadius, checkGround);

        if(isGrounded == true)
        {
            dashTime = baseDashTime;
        }
        if (direction == 0)
        {
            if (Input.GetKey(KeyCode.W) amp;amp; (Input.GetKeyDown(KeyCode.LeftShift)))
            {
                direction = 1;
            }
            else if (Input.GetKey(KeyCode.A) amp;amp; (Input.GetKeyDown(KeyCode.LeftShift)))
            {
                direction = 2;
            }
            else if (Input.GetKey(KeyCode.S) amp;amp; (Input.GetKeyDown(KeyCode.LeftShift)))
            {
                direction = 3;
            }
            else if (Input.GetKey(KeyCode.D) amp;amp; (Input.GetKeyDown(KeyCode.LeftShift)))
            {
                direction = 4;
            }
        }
        else
        {
            if (dashTime <= 0)
            {
                direction = 0;
                _rigidbody.velocity = Vector2.zero;
            }
            else
            {
                dashTime -= Time.deltaTime;
                if (direction == 1)
                {
                    _rigidbody.velocity = Vector2.up * dashSpeed;
                }
                else if (direction == 2)
                {
                    _rigidbody.velocity = Vector2.left * dashSpeed;
                }
                else if (direction == 3)
                {
                    _rigidbody.velocity = Vector2.down * dashSpeed;
                }
                else if (direction == 4)
                {
                    _rigidbody.velocity = Vector2.right * dashSpeed;
                }
            }
        }
    }
  

Ответ №1:

В вашем коде у вас есть это утверждение в функции update. Когда вы бросаетесь на землю, я предполагаю, что isGrounded останется верным, поэтому игрок будет продолжать бросаться вечно. Вероятно, из-за этого игрок застревает.

  if(isGrounded == true)
    {
        dashTime = baseDashTime;
    }
  

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

1. Да, похоже, что это так, так как я могу увеличить время восстановления моего dash? Я написал это, чтобы убедиться, что люди сначала не смогут использовать dash unlimited.

2. Вы могли бы поместить dashTime = baseDashTime; в if(dashTime < 0) . Это приведет к сбросу времени после того, как игрок закончит бросок. Если вы хотите, чтобы игрок делал рывок только по земле, вы можете поместить isGrounded в if(direction ==0)

3. Спасибо за ваш комментарий. У меня некоторое время не было подключения к Интернету, поэтому не смог ответить, извините. Теперь символ бесконечно тире :’). Я попытался реализовать счетчик, и теперь я вообще не могу тире и прыгать. Это код. Забавно, что в этом скрипте даже не реализованы прыжки. (Я не могу опубликовать это здесь, поэтому я опубликую это как другой ответ.)

4. Я просмотрел ваш скрипт и нашел несколько ошибок. Во-первых, ваш while(dashCounter > 0) { dashCounter -= Time.deltaTime; direction = 0; _rigidbody.velocity = Vector2.zero; } почти всегда будет выполняться так, как будто по завершении счетчик сбрасывается после одной итерации цикла if else. Сбросьте счетчик штрихов в инструкции `else if(dashCounter ==0). Примечание: ваш персонаж не может двигаться / прыгать / тире, поскольку ваш цикл while всегда устанавливает скорость игрока равной 0