Почему персонаж не передвигается в 2D?

Почему персонаж не движется в 2D-пространстве? Вот код: <br/> using System.Collections; <br/> using System.Collections.Generic; <br/> using UnityEngine; <br/> <br/> public class PlayerController : MonoBehaviour <br/> { <br/> public float speed; <br/> public float jumpForce; <br/> private float moveInput; <br/> <br/> private Rigidbody2D rb; <br/> private void start() <br/> { <br/> rb = GetComponent(); <br/> } <br/> private void FixedUpdate() <br/> { <br/> moveInput = Input.GetAxis("Horizontal"); <br/> rb.linearVelocity = new Vector2(moveInput * speed,rb.linearVelocity.y); <br/> } <br/> }
  • 11 января 2025 г. 20:24
Ответы на вопрос 2
В вашем коде есть несколько потенциальных проблем, которые могут мешать правильному движению персонажа в 2D-пространстве. Вот основные моменты, на которые стоит обратить внимание:

1. **Регистры имен методов**: В Unity метод `Start` должен быть написан с большой буквы `S`. В вашем коде он написан как `start()`, что неверно. Поэтому метод `Start` не вызывается и инициализация `Rigidbody2D` не происходит. Ваш код должен выглядеть так:

    ```csharp
    private void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }
    ```

2. **Получение компонента Rigidbody2D**: Убедитесь, что компонент `Rigidbody2D` добавлен к объекту, к которому прикреплён ваш скрипт, иначе `rb` будет равно `null`.

3. **Использование Velocity**: Вместо `rb.linearVelocity` в Unity лучше использовать свойство `velocity`. Также стоит убедиться, что вы задаете скорость движения в пределах физического поведения игры. Вот пример исправленного кода:

    ```csharp
    private void FixedUpdate()
    {
        moveInput = Input.GetAxis("Horizontal");
        rb.velocity = new Vector2(moveInput * speed, rb.velocity.y);
    }
    ```

4. **Скорость**: Проверьте, что переменная `speed` имеет положительное значение, иначе персонаж не будет двигаться.

5. **Настройки флага движения в Editor**: Убедитесь, что в вашем проекте нет других компонентов (например, скриптов), которые могут мешать физике Rigidbody2D, или которые останавливают движение (например, нажатые кнопки и т.п.).

6. **Проверка переменной moveInput**: Вы можете использовать `Debug.Log(moveInput)` для проверки, правильно ли считываются входные данные и будет ли персонаж двигаться.

Вот итоговый пример кода с учётом всех внесённых изменений:

```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public float speed;
    public float jumpForce;
    private float moveInput;

    private Rigidbody2D rb;

    private void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    private void FixedUpdate()
    {
        moveInput = Input.GetAxis("Horizontal");
        rb.velocity = new Vector2(moveInput * speed, rb.velocity.y);
    }
}
```

Попробуйте внести эти изменения и проверьте, заработает ли движение персонажа.
rb = GetComponent(); 
какой?
moveInput = Input.GetAxis("Horizontal");
считываем инпут в update
https://docs.unity3d.com/6000.1/Documentation/Scri...
Похожие вопросы