Unity - Nesneler için Z katmanında sıralama


11

Maalesef, başlık tam olarak sorum olduğu şey değilse, nasıl tanımlayacağımı gerçekten bilmiyorum.

Şehir zeminim için bir görüntü ve oyuncunun arkasında saklanması gereken tüm duvarlar veya ağaçlar için bir görüntü (aynı boyutta) var. Sonucum o kadar da kötü görünmüyor:

Sorun şu ki, oyuncu duvarın önünden yürürse, ortadan kaybolur, çünkü duvarın düzenleyicisi oyuncunun sırasının üzerindedir:

resim açıklamasını buraya girin

Bunu düzeltmek için oldukça basit bir yol var mı, yoksa tüm bu nesneleri manuel olarak eklemek ve bunları bazı komut dosyalarına bağlamak zorunda mıyım?

Yanıtlar:


17

Bu etkiyi elde etmek için:

İki sıralama katmanı oluşturma : Zemin ve Nesneler .

Yol, çim ve yol spritelarınızın Zemin katmanını kullanmasını sağlayın.

Karakterinizin, duvarlarınızın ve ev spritelarınızın Nesneler katmanını kullanmasını sağlayın.

Nesneler katmanınızdaki sprite'lar Sprite Modu Pivot Noktasının Sol Alt, Alt veya Sağ Alt olmasını isteyecektir. Proje sekmenizde bir Sprite seçerek ve sprite'ın içe aktarma ayarlarını yapmak için Inspector sekmesinde pivot noktasını seçerek bunu seçebilirsiniz .

Sprite İçe Aktarma Ayarları

Zemin spriteları için, siparişlerini değiştirme konusunda endişelenmenize gerek kalmayacak.

Ancak nesneler için Sprite Renderer'larını değiştirebilirsiniz sıralama düzenini değiştirebilir veya transform.position.zdeğerlerini değiştirebilirsiniz . Dönüşümü değiştirmenizi tavsiye ederim, çünkü karakterinizi hareket ettirirken şamandıralara bakmak ve ayarlamak daha kolay olacaktır, oysa sıralama düzenini değiştirmek, nesnelerinizin ölçümlerine ve boyutlarına bağlı olarak belirli durumlarda kesin görünmeyebilir sahnede.

Her iki durumda da, bazı kodlar gerekli olacaktır.

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

}

Bunu yapmak için her iki durumda da, hareketli grafiğin Z dizininin Y konumuna uymasını söylersiniz.

Bu komut dosyasını statik bir nesneye (duvar gibi) eklerseniz, Updateyönteminin her kareye çağrılmaması için denetçideki bileşenin işaretini kaldırmak istersiniz ; onun Awakeyöntemini çağıracakSetPosition bir kez ve o size yeter.

Böylece Ama karakter için, işaretli bileşeni bırakın UpdatearayacakSetPosition her kareyi , bu da hareket ederken karakterin Z sırasını değiştirir. Siz ilerledikçe, Nesneler katmanındaki her hareketli grafik bir Alt pivot noktası kullandığı sürece, hareket ederken Z dizinini değiştirmek karakterinizin diğer nesnelerin önünde veya arkasında uygun şekilde görünmesini sağlar.

Kamera kurulumunuza bağlı olarak, yeni Z konumunu ile çarpmanız gerekebilir. -1 şeyler geriye dönük görünüyorsa .

Sahnenizi düzenlerken Z dizinini ayarlamak istiyorsanız, ExecuteInEditMode öğesine bakın .


Bileşen işaretli değilse Start () ne de çalışır eminim. Awake () etkin olmayan bir bileşende çalışır, ancak start çalışmaz.
Uri Popov

Yeni kontrol edildi; haklısın. Bunun Awakeyerine kullanılacak örneği güncelledim . Teşekkürler
Chris McFarland
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.