Unity - Порядок в слое Z для объектов

11

Извините, если название не совсем соответствует моему вопросу, я не знаю, как его описать.

У меня есть изображение для моего городского этажа и изображение (того же размера) для всех стен или деревьев, за которыми игрок должен быть спрятан, если он пройдет мимо него. Мой результат даже не выглядит так плохо:

Проблема в том, что если игрок идет впереди стены, он исчезает, потому что порядок слоев стены выше порядка игрока:

введите описание изображения здесь

Есть ли довольно простой способ исправить это, или мне нужно добавить все эти объекты вручную и подключить их к некоторым сценариям?

Ян Х.
источник

Ответы:

17

Для достижения этого эффекта:

Создайте два слоя сортировки : Земля и Объекты .

Пусть ваши спрайты дороги, травы и пути используют слой Ground.

Пусть ваш персонаж, стены и спрайты дома используют слой объектов.

Спрайты на вашем слое объектов захотят, чтобы их точка поворота в режиме спрайта была либо внизу слева, либо внизу, либо справа внизу. Вы можете выбрать это, выбрав «Спрайт» на вкладке «Проект», и выберите опорную точку на вкладке «Инспектор», чтобы настроить параметры импорта спрайта .

Настройки импорта спрайта

Для наземных спрайтов вам не придется беспокоиться об изменении их порядка.

Однако для объектов вы можете либо изменить порядок сортировки их Sprite Renderer , либо изменить их transform.position.zзначение. Я бы порекомендовал изменить преобразование, так как при перемещении вашего персонажа, вероятно, будет проще наблюдать и корректировать поплавки, в то время как изменение порядка сортировки в некоторых ситуациях может выглядеть не так точно, в зависимости от размеров и размеров ваших объектов. в сцене.

В любом случае понадобится некоторый код.

public class SpritePositionSetter : MonoBehaviour {

    void Awake () {
        SetPosition();
    }

    void Update () {
        SetPosition();
    }

    void SetPosition () {
        // If you want to change the transform, use this
        Vector3 newPosition = transform.position;
        newPosition.z = transform.position.y;
        transform.position = newPosition;

        // Or if you want to change the SpriteRenderer's sorting order, use this
        GetComponent<SpriteRenderer>().sortingOrder = (int)transform.position.y;
    }

}

В любом случае, вы в основном говорите спрайту, чтобы его индекс Z совпадал с позицией Y.

Если вы присоедините этот скрипт к статическому объекту (например, к стене), вам нужно убрать галочку с компонента в Инспекторе, чтобы его Updateметод вызывался не в каждом кадре; его Awakeметод будет вызываться SetPositionодин раз, и это все, что вам нужно.

Но для вашего персонажа оставьте компонент отмеченным, чтобы Updateон вызывал SetPositionкаждый кадр, что изменит Z-порядок персонажа при перемещении. И по мере того, как вы двигаетесь, пока каждый спрайт на слое Objects использует нижнюю опорную точку, изменение Z-индекса при перемещении будет гарантировать, что ваш персонаж появится перед или позади других объектов соответствующим образом.

В зависимости от настроек вашей камеры, вам может потребоваться умножить новое положение Z на, -1если все кажется обратным.

Если вы хотите изменить индекс Z при редактировании сцены, проверьте ExecuteInEditMode .

Крис Макфарланд
источник
Я уверен, что если компонент не отмечен, Start () не будет работать. Awake () работает на неактивном компоненте, но не запускается.
Ури Попов
Только что проверил; ты прав. Я обновил пример для использования Awakeвместо. Спасибо
Крис МакФарланд