Блочная вертикальная изометрия, обработка z-слоя во время перехода? - PullRequest
0 голосов
/ 05 марта 2019

tl; dr кубоподобные 2d изометрические спрайты, один из которых движется вертикально относительно столбца других, смежно и параллельно, разрушает мою координату xy-output-z (используется для определения перекрытия), поскольку спрайты столбца имеют различные значения z, в то время как движущийся спрайт имеет непрерывное движение по оси y, в результате чего либо / и другое, и непрерывное перемещение по оси z приводят к тому, что падающий объект скрывается за объектами столбца, которые он должен скрывать, или наоборот.

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

Он полностью состоит из 2D спрайтов (по одному на блок) и выглядит примерно так:

Screenshot

Теперь, это означает, что любое вертикальное движение (например, подъем по лестнице или падение шахты, как то, что было бы там без лестницы) заставляет lil'birdie пересекать стену и касаться ее.

Теперь, чтобы справиться с перекрытием блоков, я использую ось Z. Я определяю z-координаты как z = -x-y, что означает, что блок выше или справа (или оба) другого будет помещен перед указанным блоком. Имеет смысл до сих пор.

Но когда мне нужно двигаться, как описано выше, я оказываюсь в неловкой ситуации: птичка должна менять свои z-координаты при перемещении, в какой-то момент по ходу движения, потому что ее x- и y-координаты также меняются , Но у блока, который был смежен с птичкой, есть свой собственный z, и у блока, который должен быть смежным, тоже есть, и, поскольку движение Берди является постепенным (с использованием твинеров), будет момент, когда он находится между «этажами» и, таким образом, смежен с обоими. , Поэтому, если я сделаю z-переход гладким, его z-координаты окажутся в конфликте с одним из двух смежных блоков, таким образом на мгновение прячась за блоком, который должен быть позади Берди (или напротив).

Я могу сделать переход мгновенным и спешить или задерживать его в зависимости от того, двигаюсь ли я вверх или вниз, но в этом есть проблема: в зависимости от того, находится ли стена справа или слева от меня, вверх / вниз - порыв / отношение задержки меняется на обратное, и, конечно, если у меня есть стена с каждой стороны, даже адаптация к той стороне, у которой стена, не будет работать.

Я могу определить z как -x * 2 -y, усиливая влияние того, в каком столбце я нахожусь, поэтому y-изменения незначительны по сравнению с фиксированным x, и, следовательно, не вызывают проблем, но тогда проблема переносится вместо горизонтального движения.

Так как мне с этим справиться?

Фактический код обработки вертикального движения на лестнице приведен ниже. Другие функции вертикального перемещения построены примерно так же:

public void PlayerClimb(Vector3 start, Vector3 end, GameObject player)
{
    player.transform.DOLocalMoveY(end.y, Mathf.Abs(end.y - start.y) * moveTimeFactor).OnComplete(VoteResumeInput).SetEase(Ease.Linear);
    if (end.y - start.y < 0) //< or > breaks either left side or right side, pick your poison. At least < doesn't break ladders in your own column
    {
        player.transform.DOLocalMoveZ(end.z /*+ 0.001f*/, 0.0001f).SetEase(Ease.Linear);
    }
    else
    {
        player.transform.DOLocalMoveZ(end.z /*+ 0.001f*/, 0.0001f).SetDelay(Mathf.Abs(end.y - start.y) * moveTimeFactor).SetEase(Ease.Linear);
    }
}
...