Платформы Unity теряют свои свойства без трения после динамического изменения слоя - PullRequest
0 голосов
/ 28 марта 2019

TL; DR внизу!

Итак, я создал простую игру-головоломку с простой механикой.Две основные механики:

  • , если у игрока нейтральный цвет (скажем, белый), он / она приобретает цвет любых цветных объектов, с которыми сталкивается
  • когда игрок сталкивается с платформой, он меняет цвет в соответствии с цветом игрока.

Это изменение цвета осуществляется путем изменения спрайта и слоя.Я использовал слои для хранения текущего цвета всех игровых объектов, чтобы использовать Матрицу столкновения слоев (объекты могут сталкиваться только с объектами того же цвета, т.е. если игрок синего цвета, он / она не может сталкиваться с красной платформой).Все платформы (как вертикальные, так и горизонтальные) имеют компонент Platform Effector 2D для использования свойства «сторон без трения».

Стороны без трения работают идеально, пока игрок имеет нейтральный цвет.Как только игрок приобретает цвет, любая платформа, к которой он / она касается, просто теряет свои стороны без трения и получает классическую ошибку «липких сторон», где, если вы постоянно удерживаете клавишу со стрелкой в ​​направлении платформы, вы просто застряли там, не падая,Я понятия не имею, почему это происходит, и я попытался / проверил все, что я могу придумать, чтобы попытаться исправить это безрезультатно.Спасибо за любую помощь, спасибо!

Вот код, который я получил для игрока, чтобы обновить цвет / спрайт: (Слои 8, 9, 10 - Нейтральный, Синий и Красный соответственно, и я использовал OnCollisionStayа также потому, что игрок может нажать кнопку, чтобы сбросить текущий цвет, и если игрок находится на платформе, когда отбрасывается цвет, ему следует взять его снова без повторного столкновения)

    void OnCollisionEnter2D(Collision2D collision) {
            float positionY = transform.position.y;
            float collisionPosY = collision.GetContact(0).point.y;
            int layer = collision.gameObject.layer;

            // Color Update
            if (collision.gameObject.layer == 9) {
                GetComponent<SpriteRenderer>().sprite = blue;
                gameObject.layer = 9;
            } else if (collision.gameObject.layer == 10) {
                GetComponent<SpriteRenderer>().sprite = red;
                gameObject.layer = 10;
            }
        }

        void OnCollisionStay2D(Collision2D collision) {
            // Continuous Color Update
            if (collision.gameObject.layer == 9) {
                GetComponent<SpriteRenderer>().sprite = blue;
            } else if (collision.gameObject.layer == 10) {
                GetComponent<SpriteRenderer>().sprite = red;
            }
        }

ИВот код для платформ:

    void OnCollisionEnter2D(Collision2D collider) {
            // only change color if neutral
            if (gameObject.layer == 8) {
                if (collider.gameObject.layer == 9) {
                    GetComponent<SpriteRenderer>().sprite = blue;
                    gameObject.layer = 9;

                } else if (collider.gameObject.layer == 10) {
                    GetComponent<SpriteRenderer>().sprite = red;
                    gameObject.layer = 10;
                } 
            }
        }

Вот список всех вещей, которые я проверял, чтобы найти ошибку:

  • , если изменение спрайта игрока повлияло на игрокаобнаружение столкновений
  • , если удаление OnCollisionStay решит проблему
  • , если удаление / изменение дуги / смещения вращения эффектора платформы решит проблему
  • , если платформы или игрокизменение цвета повлияло на свойство трения

. Из моих испытаний, а также отдельных тестов по этой проблеме я обнаружил, что ошибка возникает только тогда, когдаКаждый из объектов в столкновении имеет значение слоя, которое НЕ является нейтральным, поэтому либо синий, либо красный

TL; DR:

Я хочу, чтобы платформы были боковыми без трения, поэтому яиспользую платформу Effector2D.Всякий раз, когда я меняю слой платформы, он теряет свои свойства без трения.

Правка, поэтому я провел дополнительное тестирование и обнаружил, что любой слой изменяется на любом объекте (включая игрока) независимо от результатов цветав этой "застрявшей" ошибке

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