Интерполировать столкновение объектов застрял
Я работаю над очень простым тестом в 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 ответ:
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])
Надеюсь, это помогло.