Jedność - porządek w warstwie Z dla obiektów

11

Przepraszam, jeśli tytuł nie jest dokładnie moim pytaniem, tak naprawdę nie wiem, jak go opisać.

Mam obraz mojej podłogi miasta i obraz (tego samego rozmiaru) dla wszystkich ścian lub drzew, za którymi gracz powinien się ukryć, jeśli przejdzie obok niego. Mój wynik nawet nie wygląda tak źle:

Problem polega na tym, że jeśli gracz idzie przed ścianą, znika, ponieważ warstwa na ścianie jest wyższa niż kolejność gracza:

wprowadź opis zdjęcia tutaj

Czy istnieje dość prosty sposób, aby to naprawić, czy też muszę ręcznie dodać wszystkie te obiekty i połączyć je z niektórymi skryptami?

Ian H.
źródło

Odpowiedzi:

17

Aby osiągnąć ten efekt:

Utwórz dwie warstwy sortowania : Grunt i Obiekty .

Niech duszki z drogi, trawy i ścieżki korzystają z warstwy gruntu.

Niech twoja postać, ściany i duszki domowe korzystają z warstwy Przedmioty.

Duszki na twojej warstwie obiektów będą chciały, aby ich punkt obrotu w trybie duszka znajdował się albo u dołu po lewej, u dołu lub u dołu po prawej. Możesz to wybrać, wybierając duszka na karcie Projekt i wybierz punkt obrotu na karcie Inspektor, aby dostosować ustawienia importu duszka .

Ustawienia importu ikonek

W przypadku duszek naziemnych nie musisz się martwić o zmianę ich kolejności.

W przypadku obiektów możesz jednak zmienić kolejność sortowania ich Renderera lub zmienić ich transform.position.zwartość. Polecam zmianę transformacji, ponieważ pływaki będą prawdopodobnie łatwiejsze do oglądania i dostosowywania podczas przesuwania postaci, podczas gdy zmiana kolejności sortowania może nie wyglądać tak precyzyjnie w niektórych sytuacjach, w zależności od wymiarów i rozmiarów twoich obiektów na scenie.

W obu przypadkach potrzebny będzie jakiś kod.

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;
    }

}

Dla każdego z tych sposobów w zasadzie mówisz duszka, aby jego indeks Z pasował do pozycji Y.

Jeśli podłączysz ten skrypt do obiektu statycznego (takiego jak ściana), będziesz chciał odznaczyć komponent w Inspektorze, aby jego Updatemetoda nie była nazywana każdą ramką; jego Awakemetoda zadzwoni SetPositionraz i to wszystko, czego potrzebujesz.

Ale dla swojej postaci pozostaw zaznaczony element, Updateaby wywoływał SetPositionkażdą ramkę, co zmieni kolejność Z postaci podczas poruszania się. I kiedy się poruszasz, tak długo, jak każda duszka na warstwie obiektów używa dolnego punktu obrotu, zmiana indeksu Z podczas ruchu zapewni, że twoja postać pojawi się odpowiednio przed innymi obiektami lub za nimi.

W zależności od konfiguracji aparatu może być konieczne pomnożenie nowej pozycji Z przez, -1jeśli wszystko wydaje się odwrócone.

Jeśli chcesz dostosować indeks Z podczas edycji sceny, sprawdź ExecuteInEditMode .

Chris McFarland
źródło
Jestem prawie pewien, że jeśli element nie jest zaznaczony, Start () nie uruchomi się. Awake () działa na nieaktywnym składniku, ale start nie.
Uri Popov
Właśnie sprawdzone; masz rację. Zaktualizowałem przykład, aby go użyć Awake. Dzięki
Chris McFarland,