Єдність - Порядок в шарі Z для об'єктів


11

Вибачте, якщо заголовок не є точно моїм запитанням, я не знаю, як його описати.

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

Проблема полягає в тому, що якщо гравець проходить перед стіною, він зникає, тому що шаруватий стіни вище порядку гравця:

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

Чи є досить простий спосіб виправити це, чи я повинен додати всі ці об'єкти вручну та підключити їх до деяких сценаріїв?

Відповіді:


17

Для досягнення цього ефекту:

Створіть два сортувальні шари : Земля та Об'єкти .

Нехай ваші дороги, трава та шляхи використовують ґрунтовий шар.

Нехай ваш характер, стіни та будиночки спрайти використовують шар "Об'єкти".

У спрайтів на вашому шарі "Об'єкти" буде потрібно, щоб точка спряження режиму спрайту була "Знизу зліва", "Знизу" або "Знизу вправо". Ви можете вибрати це, вибравши спрайт на вкладці «Проект» та виберіть точку зведення на вкладці «Інспектор», щоб відрегулювати параметри імпорту спрайту .

Налаштування імпорту спрайтів

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

Однак для об'єктів ви можете або змінити порядок сортування 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 персонажа під час переміщення. І під час переміщення, поки кожен спрайт на шарі "Об'єкти" використовує нижню точку зведення, зміна індексу Z під час переміщення забезпечить, щоб ваш персонаж відображався перед або за іншими об'єктами належним чином.

Залежно від налаштування камери, вам може знадобитися помножити нову позицію Z на те, -1якщо все здається зворотним.

Якщо ви хочете скорегувати індекс Z під час редагування сцени, перевірте ExecuteInEditMode .


Я майже впевнений, що якщо компонент буде відмічений, Start () не запуститься. Awake () працює на неактивному компоненті, але запуск не виконує.
Урі Попов

Щойно перевірено; ти прав. Я оновив приклад для використання Awakeнатомість. Спасибі
Кріс Макфарланд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.