Unity: OnCollisionEnter срабатывает только при новой записи, но не при новой записи для другого объекта с тем же именем - PullRequest
0 голосов
/ 07 февраля 2019

Я строю платформер с появлением ящиков.Коробка отображается как только игрок попадает в нее.Это работает очень хорошо, например так:

public class AppearingBoxes : MonoBehaviour
{
    public GameObject Block, RageFace;

    bool showBlock = false;

    void Start()
    {
        showBlock = false;
    }


    void OnCollisionEnter(Collision2D col)
    {
        if (col.gameObject.name == "Birdy") 
        {
            showBlock = true;
        }
    }

    void FixedUpdate()
    {
        Block.GetComponent<Renderer>().enabled = showBlock;
        RageFace.GetComponent<Renderer>().enabled = showBlock;
    }
}

Этот скрипт прикреплен ко всем этим блокам.Каждый блок представляет собой отдельный блок, но все с тем же сценарием, свойствами и именем:

enter image description here

Но здесь возникает проблема.Только первый HIT запускает окно.Как вы можете себе представить, игрок прыгает поверх этих невидимых ящиков и затем запускает тот, который ударил.Игрок теперь перемещается вперед над другими невидимыми ящиками и вводит туда хитбоксы.Однако они не появляются.Я полагаю, что это связано с тем, что игрок все еще находится в «том же» хранилище, хотя это другой сборный объект.Если я прыгаю на невидимую платформу и падаю к ней (я ушел, а затем снова нажал на спусковой крючок), ящик, на котором я приземляюсь, сразу же появляется, как и должен.

Итак, что я могу сделать, чтобы окно появилось, как только игрок коснулся его, даже если он не покинул поле попадания коробки раньше?

Спасибо!:)

Ответы [ 4 ]

0 голосов
/ 09 февраля 2019

Он не упал, потому что коллайдер - это не триггер, вот и все.

0 голосов
/ 07 февраля 2019

В вашем коде проблема.Я не знаю, пропустили ли вы это или это опечатка, но вы не можете использовать OnCollisionEnter с параметром Collision2D.Ваша игра запустится, но должно появиться сообщение об ошибке:

Script error: OnCollisionEnter
This message parameter has to be of type: Collision
The message will be ignored.

Используйте OnCollisionEnter2D вместо

 void OnCollisionEnter2D(Collision2D col)
{
    if (col.gameObject.name == "Birdy") 
    {
        showBlock = true;
    }
}
0 голосов
/ 08 февраля 2019

Всем, я нашел "обходной путь". Он, правда, не объясняет проблему, но уже работает ...

Что я сделал, так это немного увеличил размер BoxCollider для каждой коробки,Как на 3 пикселя больше, чем фактическая коробка, на которой стоит игрок.Это решило проблему, но заставляет меня задуматься: если бы игрок не «действительно» столкнулся с коллайдером, он бы провалился.Но он этого не сделал.Теперь коллайдеры немного больше и все срабатывает просто идеально.Может быть, ошибка в двигателе?

Спасибо за вашу помощь

0 голосов
/ 07 февраля 2019
  • Попробуйте изменить коллайдеры блоков на isTrigger и использовать вместо OnTriggerEnter2D

  • Или, может быть, это потому, что вы используете OnCollisionEnter вместо OnCollisionEnter2D?

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