Unity - Order in Z layer untuk objek

11

Maaf jika judulnya tidak persis seperti pertanyaan saya, saya tidak benar-benar tahu bagaimana menjelaskannya.

Saya memiliki gambar untuk lantai kota saya dan gambar (ukuran yang sama) untuk semua dinding atau pohon yang seharusnya disembunyikan oleh pemain, jika ia berjalan melewatinya. Hasil saya bahkan tidak terlihat buruk:

Masalahnya adalah bahwa jika pemain berjalan di depan dinding, ia lenyap, karena lapisan dinding di atas urutan pemain:

masukkan deskripsi gambar di sini

Apakah ada cara yang agak sederhana untuk memperbaikinya, atau apakah saya harus menambahkan semua objek secara manual dan menghubungkannya ke beberapa skrip?

Ian H.
sumber

Jawaban:

17

Untuk mencapai efek ini:

Buat dua lapisan penyortiran : Tanah dan Objek .

Buat sprite jalan, rumput, dan jalur Anda menggunakan lapisan Ground.

Buat karakter, dinding, dan sprite rumah Anda menggunakan lapisan Objects.

Sprite pada layer Objects Anda ingin Spiv Mode Pivot Point mereka berada di Kiri Bawah, Bawah, atau Kanan Bawah. Anda dapat memilih ini dengan memilih Sprite di dalam tab Project Anda, dan pilih pivot point di tab Inspector untuk menyesuaikan pengaturan impor sprite .

Pengaturan Impor Sprite

Untuk sprite tanah, Anda tidak perlu khawatir mengubah pesanan.

Namun untuk objek, Anda dapat mengubah urutan penyortiran Sprite Renderer mereka , atau mengubah transform.position.znilainya. Saya akan merekomendasikan mengubah transformasi, karena mengapung mungkin akan lebih mudah untuk dilihat dan disesuaikan saat Anda memindahkan karakter Anda, sedangkan mengubah urutan penyortiran mungkin tidak terlihat akurat dalam situasi tertentu, tergantung pada pengukuran dan ukuran objek Anda di tempat kejadian.

Dalam kedua kasus, beberapa kode akan diperlukan.

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

}

Untuk kedua cara melakukan ini, Anda pada dasarnya memberitahu sprite agar indeks Z-nya cocok dengan posisi Y-nya.

Jika Anda melampirkan skrip ini ke objek statis (seperti dinding), Anda akan ingin melepaskan komponen di Inspektur sehingga Update metodenya tidak disebut setiap frame; -nya Awakemetode akan memanggil SetPositionsekali dan itu semua yang Anda butuhkan.

Tetapi untuk karakter Anda, biarkan komponen terus dicentang Update akan memanggil SetPositionsetiap frame, yang akan mengubah urutan Z karakter saat Anda bergerak. Dan saat Anda bergerak, selama setiap sprite pada layer Objects menggunakan titik pivot Bawah, mengubah indeks Z saat Anda bergerak akan memastikan karakter Anda muncul di depan atau di belakang objek lain dengan tepat.

Tergantung pada pengaturan kamera Anda, Anda mungkin perlu melipatgandakan posisi Z baru dengan -1jika semuanya tampak mundur.

Jika Anda ingin menyesuaikan indeks Z saat mengedit adegan Anda, periksa ExecuteInEditMode .

Chris McFarland
sumber
Saya cukup yakin bahwa jika komponen Start yang belum dipilih () tidak akan berjalan. Sedar () berjalan pada komponen yang tidak aktif, tetapi mulai tidak.
Uri Popov
Baru diperiksa; kamu benar. Saya telah memperbarui contoh untuk digunakan Awakesebagai gantinya. Terima kasih
Chris McFarland