Unidad: orden en la capa Z para objetos

11

Lo siento si el título no es exactamente cuál es mi pregunta, realmente no sé cómo describirlo.

Tengo una imagen para el piso de mi ciudad y una imagen (del mismo tamaño) para todas las paredes o árboles detrás de los cuales se supone que el jugador debe estar escondido, si pasa detrás de él. Mi resultado ni siquiera se ve tan mal:

El problema es que si el jugador camina enfrente de la pared, desaparece, porque el orden de capas de la pared está por encima del orden del jugador:

ingrese la descripción de la imagen aquí

¿Hay una manera bastante simple de solucionar esto, o tengo que agregar todos esos objetos manualmente y conectarlos a algunos scripts?

Ian H.
fuente

Respuestas:

17

Para lograr este efecto:

Crea dos capas de clasificación : Suelo y Objetos .

Haga que sus sprites de camino, hierba y sendero usen la capa Ground.

Haga que su personaje, paredes y sprites de la casa usen la capa Objetos.

Los sprites en la capa de Objetos querrán que su Punto de pivote del modo Sprite sea Inferior izquierdo, Inferior o Inferior derecho. Puede elegir esto seleccionando un Sprite dentro de la pestaña Proyecto, y elija el punto de pivote en la pestaña Inspector para ajustar la configuración de importación del sprite .

Configuración de importación de Sprite

Para los sprites terrestres, no tendrá que preocuparse por cambiar su orden.

Sin embargo, para los objetos, puede cambiar el orden de clasificación de su Sprite Renderer o cambiar su transform.position.zvalor. Recomiendo cambiar la transformación, ya que los flotadores probablemente serán más fáciles de ver y ajustar a medida que mueves tu personaje, mientras que cambiar el orden de clasificación puede no parecer tan preciso en ciertas situaciones, dependiendo de las medidas y tamaños de tus objetos en la escena.

En cualquier caso, se necesitará algún código.

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

}

Para cualquier forma de hacer esto, básicamente le estás diciendo al sprite que haga que su índice Z coincida con su posición Y.

Si adjunta este script a un objeto estático (como un muro), desmarque el componente en el Inspector para que su Updatemétodo no se llame cada cuadro; su Awakemétodo llamará SetPositionuna vez y eso es todo lo que necesita.

Pero para tu personaje, deja el componente marcado para que Updatellame a SetPositioncada cuadro, lo que cambiará el orden Z del personaje a medida que te mueves. Y a medida que te mueves, siempre que cada sprite de la capa Objetos use un punto de pivote Inferior, cambiar el índice Z a medida que te mueves asegurará que tu personaje aparezca delante o detrás de otros objetos adecuadamente.

Dependiendo de la configuración de su cámara, es posible que deba multiplicar la nueva posición Z por -1si las cosas parecen estar al revés.

Si desea ajustar el índice Z mientras edita su escena, consulte ExecuteInEditMode .

Chris McFarland
fuente
Estoy bastante seguro de que si el componente no está marcado, Start () no se ejecutará. Awake () se ejecuta en un componente inactivo, pero start no.
Uri Popov
Acabo de revisarlo; Estás en lo correcto. He actualizado el ejemplo para usar Awakeen su lugar. Gracias
Chris McFarland