Unità: ordina nel livello Z per gli oggetti


11

Scusate se il titolo non è esattamente la mia domanda, non so davvero come descriverlo.

Ho un'immagine per il mio piano città e un'immagine (stessa dimensione) per tutte le pareti o gli alberi che il giocatore dovrebbe essere nascosto dietro, se gli passa dietro. Il mio risultato non è nemmeno così brutto:

Il problema è che se il giocatore cammina davanti al muro, svanisce, perché il layerorder del muro è al di sopra dell'ordine del giocatore:

inserisci qui la descrizione dell'immagine

C'è un modo piuttosto semplice per risolvere questo problema o devo aggiungere tutti quegli oggetti manualmente e collegarli ad alcuni script?

Risposte:


17

Per ottenere questo effetto:

Crea due livelli di ordinamento : Terra e Oggetti .

Chiedi agli sprite di strada, erba e percorso di utilizzare lo strato Terra.

Chiedi al tuo personaggio, alle pareti e agli sprite di casa di usare il livello Oggetti.

Gli sprite sul livello Oggetti vorranno che il loro punto di rotazione della modalità Sprite sia in basso a sinistra, in basso o in basso a destra. Puoi scegliere questo selezionando uno Sprite nella scheda Progetto e scegliere il punto di articolazione nella scheda Ispettore per regolare le impostazioni di importazione dello sprite .

Impostazioni di importazione Sprite

Per gli sprite di terra, non dovrai preoccuparti di cambiare il loro ordine.

Per gli oggetti, tuttavia, è possibile modificare l' ordine di ordinamento del loro Sprite Renderer o modificarne il transform.position.zvalore. Consiglierei di cambiare la trasformazione, poiché i galleggianti saranno probabilmente più facili da guardare e regolare mentre sposti il ​​tuo personaggio, mentre cambiare l'ordine di classificazione potrebbe non sembrare così preciso in determinate situazioni, a seconda delle misure e delle dimensioni dei tuoi oggetti nella scena.

In entrambi i casi, sarà necessario del codice.

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

}

In entrambi i modi, in pratica stai dicendo allo sprite di avere il suo indice Z corrispondente alla sua posizione Y.

Se colleghi questo script a un oggetto statico (come un muro), ti consigliamo di deselezionare il componente in Inspector in modo che il suo Updatemetodo non venga chiamato ogni frame; il suo Awakemetodo chiamerà SetPositionuna volta ed è tutto ciò di cui hai bisogno.

Ma per il tuo personaggio, lascia il componente spuntato in modo che Updatechiamerà SetPositionogni fotogramma, il che cambierà l'ordine Z del personaggio mentre ti muovi. E mentre ti muovi, fintanto che ogni sprite sul livello Oggetti utilizza un punto di rotazione Inferiore, cambiando l'indice Z mentre ti sposti assicurerai che il tuo personaggio appaia davanti o dietro altri oggetti in modo appropriato.

A seconda della configurazione della fotocamera, potrebbe essere necessario moltiplicare la nuova posizione Z -1se le cose sembrano all'indietro.

Se vuoi regolare l'indice Z mentre modifichi la scena, dai un'occhiata a ExecuteInEditMode .


Sono abbastanza sicuro che se il componente è deselezionato Start () non funzionerà. Awake () viene eseguito su un componente inattivo, ma start no.
Uri Popov,

Appena verificato; hai ragione. Ho aggiornato l'esempio da usare Awakeinvece. Grazie
Chris McFarland il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.