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.Всякий раз, когда я меняю слой платформы, он теряет свои свойства без трения.
Правка, поэтому я провел дополнительное тестирование и обнаружил, что любой слой изменяется на любом объекте (включая игрока) независимо от результатов цветав этой "застрявшей" ошибке