2017-02-08 34 views
3

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

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); 
    } 
} 

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

EDIT

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

enter image description here

+0

Неудивительно, что вы совершенно неправильно используете «Жесткое тело» (установка «скорость» вручную), проверьте документы о том, как правильно его использовать. – Aybe

+0

Сделаю, я все еще учусь. Я получил основу этого из онлайн-учебника, но это было для левого и правого движения, и я изменил его, чтобы попробовать и получить то, что мне нужно. – Phil3992

+0

В основном вы должны использовать только методы 'Add * (Vector3)' 'Rigidbody', назначьте« PhysicalMaterial »с нужной букетом, а затем настройте это на свои нужды. – Aybe

ответ

1

OverlapCircle проверка для любого перекрытия, так что, если до тех пор, пока существует перекрытие между ним и объектом, это будет справедливо, таким образом, работает ваше, если заявление для каждого кадра, что это правда. Попробуйте использовать метод 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(). Speed.x (horizontal) в аргументе для y (вертикального) компонента. Если ваш спрайт перемещается вверх и вниз, это может быть причиной вашей ошибки, так как его y-компонент не изменяется (если у вас нет другого кода, который изменяет компонент x).

Так что вы хотите изменить

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

к

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

Надеется, что это помогло.

+0

изменить: исправил код, как я случайно положил в дополнительную закрытую скобку –

+0

А, извините, тогда. Я попытаюсь найти другое решение. Один вопрос, однако, является ли спрайт движущимся вверх или вниз или влево и вправо? –