Unidade - ordem na camada Z para objetos

11

Desculpe se o título não é exatamente o que minha pergunta é, eu realmente não sei como descrevê-lo.

Eu tenho uma imagem para o andar da minha cidade e uma imagem (do mesmo tamanho) para todas as paredes ou árvores que o jogador deveria estar escondido atrás, se ele passar por trás dela. Meu resultado nem parece tão ruim:

O problema é que, se o jogador anda na frente da parede, ele desaparece, porque a ordem da camada está acima da ordem do jogador:

insira a descrição da imagem aqui

Existe uma maneira bastante simples de corrigir isso ou preciso adicionar todos esses objetos manualmente e conectá-los a alguns scripts?

Ian H.
fonte

Respostas:

17

Para alcançar esse efeito:

Crie duas camadas de classificação : Terra e Objetos .

Faça com que seus sprites de estrada, grama e caminho usem a camada do solo.

Faça com que seu personagem, paredes e sprites da casa usem a camada Objetos.

Os sprites na camada Objetos desejam que o ponto de pivô do modo Sprite seja inferior esquerdo, inferior ou inferior direito. Você pode escolher isso selecionando um Sprite na guia Projeto e escolher o ponto de articulação na guia Inspetor para ajustar as configurações de importação do sprite .

Configurações de importação do Sprite

Para sprites de solo, você não precisa se preocupar em alterar a ordem deles.

Para objetos, no entanto, você pode alterar a ordem de classificação do Renderizador do Sprite ou alterar seu transform.position.zvalor. Eu recomendo alterar a transformação, pois os flutuadores provavelmente serão mais fáceis de ver e ajustar à medida que você move seu personagem, enquanto alterar a ordem de classificação pode não parecer tão preciso em determinadas situações, dependendo das medidas e tamanhos dos seus objetos em cena.

Nos dois casos, será necessário algum 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;
    }

}

De qualquer maneira, basicamente você está dizendo ao sprite para que seu índice Z corresponda à posição Y.

Se você anexar esse script a um objeto estático (como uma parede), desmarque o componente no Inspector para que seu Updatemétodo não seja chamado de todos os quadros; seu Awakemétodo chamará SetPositionuma vez e é tudo o que você precisa.

Mas para o seu personagem, deixe o componente marcado para que todos os quadros Updatesejam chamados SetPosition, o que mudará a ordem Z do personagem à medida que você se move. E à medida que você se move, desde que todos os sprites na camada Objetos estejam usando um ponto de articulação Inferior, a alteração do índice Z à medida que você se move garantirá que seu personagem apareça na frente ou atrás de outros objetos adequadamente.

Dependendo da configuração da câmera, talvez seja necessário multiplicar a nova posição Z -1se as coisas parecerem inversas.

Se você deseja ajustar o índice Z enquanto edita sua Cena, confira ExecuteInEditMode .

Chris McFarland
fonte
Tenho certeza de que, se o componente estiver desmarcado, Start () nem será executado. Awake () é executado em um componente inativo, mas o start não.
precisa saber é o seguinte
Apenas verificado; você está certo. Atualizei o exemplo para usar Awake. Obrigado
Chris McFarland