Unity 2D: Rigidbody2D.velocity не двигает персонажа - PullRequest
0 голосов
/ 11 апреля 2020

Я делал контроллер для 2D-плеера, и он работал до следующего дня после того, как я написал скрипт для следующей камеры, и теперь мой персонаж не может двигаться, но анимация все еще работает. Я попытался использовать AddForce () вместо изменения Rigidbody2D.velocity, но это тоже не сработало, и через 2 или 3 дня я все еще не мог найти решение. Вот код:

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




public class PlayerController : MonoBehaviour
{
    Rigidbody2D rb2d;
    Animator animator;
    SpriteRenderer spriteRenderer;
    float direction;

    public float speed;

    // Start is called before the first frame update
    void Start()
    {
        direction = Input.GetAxisRaw("Horizontal");
        animator = GetComponent<Animator>();
        rb2d=GetComponent<Rigidbody2D>();
        spriteRenderer = GetComponent<SpriteRenderer>();
    }

    void Update()
    {
        transform.position = new Vector3(Mathf.Clamp(transform.position.x, -199, 197), 
        transform.position.y, transform.position.z);

        if ((Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift)) && ((Input.GetKey("right") || Input.GetKey("d")) || Input.GetKey("left") || Input.GetKey("a")))
        {
            speed = 20f;
            run();
        }
        else if (!(Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift)) && (Input.GetKey("right") || Input.GetKey("d")))
        {
            speed = 10f;
            walk();
        }
        else if (!(Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift)) && (Input.GetKey("left") || Input.GetKey("a")))
        {
            speed = 10f;
            walk();
        }
        else
        {
            speed = 0f;
            animator.Play("Player_idle");
        }
    }  

    void walk()
    {
        if (speed > 0) {
            animator.Play("Player_walk_right");
        }
        else if (speed < 0)
        {
            animator.Play("Player_walk_left");
        }
        //rb2d.AddForce(new Vector2(speed * direction * Time.deltaTime, 0));
        rb2d.velocity = new Vector2(speed * direction * Time.deltaTime, rb2d.velocity.y);
        Debug.Log(rb2d.velocity);
    }

    void run()
    { 
        if (speed > 0)
        {
            animator.Play("Player_run_right");
        }

        else if (speed < 0)
        {
            animator.Play("Player_run_left");
        }

        //rb2d.AddForce(new Vector2(speed * direction * Time.deltaTime, 0));
        rb2d.velocity = new Vector2(speed * direction * Time.deltaTime, rb2d.velocity.y);
        Debug.Log(rb2d.velocity);
    }
}

Вот изображение инспектора

Если кто-то может помочь, это будет оценено .

1 Ответ

0 голосов
/ 11 апреля 2020

Если мы посмотрим на ваш код, оператор проблематики c должен быть здесь:

rb2d.velocity = new Vector2(speed * direction * Time.deltaTime, rb2d.velocity.y);

Одна из этих трех переменных должна быть равна нулю, чтобы вызвать вашу проблему.

Потенциальная проблема 1: direction

Вы, кажется, устанавливаете direction только один раз, в Start():

direction = Input.GetAxisRaw("Horizontal");

Возможно, вы не нажимаете какие-либо клавиши / не перемещаете джойстики в кадре, который сцена начинается. Это означает, что direction заканчивается 0 и больше никогда не изменяется.

Либо измените свою строку на

rb2d.velocity = new Vector2(speed * Time.deltaTime, rb2d.velocity.y);

(исключая direction), либо переместите оператор назначения направления в Update() метод.

Потенциальная проблема 2: Time.deltaTime

Как сказал @Daniel в комментариях, оператор Time.deltaTime может быть проблематичным c.

  1. Проверьте настройки вашего проекта / другие сценарии, чтобы убедиться, Time.timeScale не равно нулю.
  2. Вы можете удалить Time.deltaTime, если # 1 не работает, но я согласен с вами, что здесь должно быть утверждение, чтобы игра оставалась последовательной во всех частотах. Попробуйте изменить Update() на FixedUpdate(); если вы сделаете это, вам нужно будет использовать Time.fixedDeltaTime вместо.

Как отлаживать в будущем

Чтобы отладить эту проблему в будущем, попробуйте вставить точку останова в проблемной области. c линия и присоединение вашей IDE к Unity. Если вы наведите курсор на каждую из переменных, вы сможете увидеть, какая переменная равна нулю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...