Unity - гравитация не работает при открытии из другой сцены - PullRequest
1 голос
/ 17 апреля 2020

Я создаю простую мини-игру в единстве как отдельную сцену. Проблема в том, что гравитация на моем жестком теле работает совершенно нормально, когда я начинаю со сцены мини-игры, но когда я перехожу на сцену мини-игры из другой, гравитация перестает работать, и мой игрок может только go.

Вот что я пробовал:

  • Настройки 2D физики моего проекта в порядке (Гравитация: X = 0, Y = -9,81)
  • Настройка времени моего проекта все в порядке (Шкала времени: 1)
  • Персонаж My Player имеет Rigidbody2D, который имеет значение Dynami c, Имитация (true), Масштаб гравитации = 5, ТОЛЬКО вращение заморожено, и он никогда не спит.
  • Игрок также имеет коллайдер бокса и круга (оба 2D).
  • Все входы игрока читаются в Update (), а вся физика выполняется в FixedUpdate () (я использую скорость для переместить игрока).

У меня есть объект GameController, который переносится между сценами, но ни один из его сценариев не должен влиять на сцену (я могу предоставить части сценариев OnLevelWasLoaded () или любые другие другие части). * 101 7 *

Вот код в контроллере моего игрока:

void Start()
    {
        rb = GetComponent<Rigidbody2D>();
        box = GetComponent<BoxCollider2D>();
        _renderer = GetComponent<SpriteRenderer>();
        velVer = 30f;
        velHor = 10f;
    }

void Update()
    {
        moveHor = Input.GetAxisRaw("Horizontal");
        moveVer = Input.GetAxis("Vertical");
        buttonUp = Input.GetButtonUp("Vertical");
        _moveVector = new Vector2(moveHor, moveVer);
    }

    void FixedUpdate()
    {

        if (IsGrounded() && buttonUp)
            rb.velocity = new Vector2(velHor * _moveVector.x, velVer * _moveVector.y);
        if (_moveVector.x != 0 && _moveVector.y == 0)
            rb.velocity = new Vector2(velHor * _moveVector.x, rb.velocity.y);
    }

    private bool IsGrounded()
    {
        RaycastHit2D raycast = Physics2D.BoxCast(box.bounds.center, box.bounds.size, 0f, Vector2.down, 0.1f, layer);
        return raycast.collider != null;
    }

    private void OnTriggerEnter2D(Collider2D other)
    {
        if (other.tag.Equals("Heart"))
        {
            other.gameObject.SetActive(false);
        }
    }

Я прокомментировал любые ссылки на объект GameController из всех сценариев на мини-игровой сцене, поэтому GameController не должен иметь никаких удар по контроллеру мини-игровых персонажей.

Я в отчаянии, я искал в Интернете более 3 часов и не нашел ничего, что могло бы мне помочь (если я действительно пропустил решение, мои извинения). Я могу предоставить любую дополнительную информацию, которая может вам потребоваться.

РЕДАКТИРОВАТЬ: Здесь приведены изображения поведения персонажей, когда я начинаю игру со сцены мини-игры и когда я перехожу на сцену мини-игры из другой.

Работает (запускает мини-игру напрямую):

enter image description here

Не работает (перемещено в мини-игру из другой сцены):

enter image description here

Ответы [ 2 ]

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

Хорошо, я нашел проблему! Я думал, что проблема будет в ie внутри сценариев, которые находятся внутри моей сцены мини-игры, или в сценариях, перенесенных на сцену моим GameController, но это не имело место. Проблема заложена в сценарии, прикрепленном к объекту, расположенному в сцене, из которой я перешел в мини-игру.

Вот если неприятная строка:

Physics2D.gravity = Vector2.zero;

Поскольку моя игра 2D с помощью проекции Axonometri c (3/4) я установил гравитацию на Vector2.zero очень рано в разработке. Я заменил это, просто установив масштаб гравитации на 0.

rb.gravityScale = 0;

Несмотря на то, что сценарий с проблемной линией не перемещается на мою сцену мини-игры, он изменил настройку гравитации всего проекта. ОЧЕНЬ глупая ошибка, которую я, вероятно, нашел бы, но после многих часов постоянного развития мой мозг не функционировал слишком хорошо, и я решил опубликовать этот вопрос.

Спасибо за помощь, парни!

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

Проверьте три вещи: 1) Вы уверены, что вы не установили timeScale на 0 в любом другом сценарии? 2) У вашего игрока одинаковый масштаб на обоих уровнях? 3) Почему вы используете Physics2D.BoxCast в функции IsGounded? Я обычно использую Raycast2D для наземного процесса проверки.

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