Интерполировать столкновение объектов застрял


Я работаю над очень простым тестом в Unity 2D.проблема, с которой я сталкиваюсь, заключается в том, что когда мой спрайт сталкивается с Землей, он постоянно проверяет событие, почти слишком часто, поэтому спрайт остается в подвешенном состоянии. У него нет шанса оторваться от Земли, так как к тому времени, когда он делает это, чек говорит ему развернуться, в результате чего он быстро поднимается и опускается. Как показано в приведенном ниже клипе:

Https://m.youtube.com/watch?v=gPmmLjGe9iQ

Чего я хочу, так это когда контакт установлен. спрайт должен изменить направление своей оси Y. Пожалуйста, смотрите мой код ниже.

void Update () {
    hitWall = Physics2D.OverlapCircle(wallCheckUp.position, wallCheckRadius, whatIsWall);
    if (hitWall)
    {
        moveUp = !moveUp;
    }

    if (moveUp)
    {
        transform.localScale = new Vector3(-1f, 1f, 1f);
        GetComponent<Rigidbody2D>().velocity = new Vector2(speed, GetComponent<Rigidbody2D>().velocity.x);
    }
    else
    {
        transform.localScale = new Vector3(1f, 1f, 1f);
        GetComponent<Rigidbody2D>().velocity = new Vector2(-speed, GetComponent<Rigidbody2D>().velocity.x);
    }
}

Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

Править

Чтобы сделать то, что у меня есть, более ясным, пожалуйста, смотрите мои настройки спрайтов.

Введите описание изображения здесь

1 3

1 ответ:

OverlapCircle проверяет наличие любого перекрытия, поэтому, если между ним и объектом есть перекрытие, оно будет истинным, таким образом, выполняется оператор if для каждого кадра, который является истинным. Попробуйте использовать метод OnCollisonEnter2D или OnTriggerEnter2D (просто замените имя метода):

void OnCollisionEnter2D(Collision2D coll)
{
    moveUp = !moveUp;
    if (moveUp)
    {
        transform.localScale = new Vector3(-1f, 1f, 1f);
        GetComponent<Rigidbody2D>().velocity = new Vector2(speed,  GetComponent<Rigidbody2D>().velocity.y);
    }
    else
    {
        transform.localScale = new Vector3(1f, 1f, 1f);
        GetComponent<Rigidbody2D>().velocity = new Vector2(-speed, GetComponent<Rigidbody2D>().velocity.y);
    }
}

Также убедитесь, что каждый объект имеет Collider2D в инспекторе.

Еще одна вещь. При инициализации Vector2 порядок аргументов равен x, y. я заметил, что в вашем коде вы были использование GetComponent ().скорость.x (горизонтальный) в аргументе для y (вертикальный) компонент. Если ваш спрайт движется вверх и вниз, то это может быть причиной вашей ошибки, так как его компонент y не изменяется (если у вас нет другого кода, который изменяет компонент x).

Итак, вы хотите изменить

new vector2(speed[-speed], GetComponent<Rigidbody2d>().velocity.x)

К

new vector2(GetComponent<Rigidbody2d>().velocity.x, speed[-speed])

Надеюсь, это помогло.