Einheit - Reihenfolge in Z-Ebene für Objekte

11

Entschuldigung, wenn der Titel nicht genau meine Frage ist, weiß ich nicht wirklich, wie ich ihn beschreiben soll.

Ich habe ein Bild für meine Stadtetage und ein Bild (gleiche Größe) für alle Wände oder Bäume, hinter denen der Spieler versteckt sein soll, wenn er dahinter vorbeigeht. Mein Ergebnis sieht gar nicht so schlecht aus:

Das Problem ist, dass der Spieler verschwindet, wenn er vor die Wand tritt, weil die Ebenenreihenfolge der Wand über der Reihenfolge des Spielers liegt:

Geben Sie hier die Bildbeschreibung ein

Gibt es eine ziemlich einfache Möglichkeit, dies zu beheben, oder muss ich alle diese Objekte manuell hinzufügen und sie mit einigen Skripten verbinden?

Ian H.
quelle

Antworten:

17

Um diesen Effekt zu erzielen:

Erstellen Sie zwei Sortierebenen : Boden und Objekte .

Lassen Sie Ihre Straßen-, Gras- und Pfad-Sprites die Bodenschicht verwenden.

Lassen Sie Ihren Charakter, Ihre Wände und Ihre Hausgeister die Ebene "Objekte" verwenden.

Sprites auf Ihrer Objektebene möchten, dass der Drehpunkt im Sprite-Modus entweder unten links, unten oder unten rechts ist. Sie können dies wählen , indem ein Sprite in Ihrer Registerkarte Projekt auswählen und den Drehpunkt in der Registerkarte Inspector wählen Sie den Sprite anzupassen Importeinstellungen .

Sprite-Importeinstellungen

Bei gemahlenen Sprites müssen Sie sich keine Gedanken über die Änderung ihrer Reihenfolge machen.

Für Objekte können Sie jedoch entweder die Sortierreihenfolge des Sprite-Renderers oder deren transform.position.zWert ändern . Ich würde empfehlen, die Transformation zu ändern, da die Floats wahrscheinlich einfacher zu betrachten und anzupassen sind, wenn Sie Ihren Charakter bewegen, während das Ändern der Sortierreihenfolge in bestimmten Situationen je nach Größe und Größe Ihrer Objekte möglicherweise nicht so genau aussieht in der Szene.

In beiden Fällen wird Code benötigt.

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 beiden Fällen weisen Sie das Sprite grundsätzlich an, dass sein Z-Index mit seiner Y-Position übereinstimmt.

Wenn Sie dieses Skript an ein statisches Objekt (wie eine Wand) anhängen, müssen Sie die Komponente im Inspektor deaktivieren, damit ihre UpdateMethode nicht bei jedem Frame aufgerufen wird. Die AwakeMethode wird SetPositioneinmal aufgerufen und das ist alles, was Sie brauchen.

Lassen Sie für Ihren Charakter die Komponente aktiviert, damit jeder Frame Updateaufgerufen SetPositionwird, wodurch sich die Z-Reihenfolge des Charakters ändert, wenn Sie sich bewegen. Und während Sie sich bewegen, solange jedes Sprite auf der Objektebene einen unteren Drehpunkt verwendet, wird durch Ändern des Z-Index während der Bewegung sichergestellt, dass Ihr Charakter angemessen vor oder hinter anderen Objekten angezeigt wird.

Abhängig von Ihrer Kameraeinstellung müssen Sie möglicherweise die neue Z-Position mit multiplizieren, -1wenn die Dinge rückwärts erscheinen.

Wenn Sie den Z-Index während der Bearbeitung Ihrer Szene anpassen möchten, lesen Sie ExecuteInEditMode .

Chris McFarland
quelle
Ich bin mir ziemlich sicher, dass Start () nicht ausgeführt wird, wenn die Komponente deaktiviert ist. Awake () wird auf einer inaktiven Komponente ausgeführt, start jedoch nicht.
Uri Popov
Gerade nachgeschaut; Du hast Recht. Ich habe das Beispiel aktualisiert, um es Awakestattdessen zu verwenden . Vielen Dank
Chris McFarland