Unity - Ordre dans la couche Z pour les objets

11

Désolé si le titre n'est pas exactement ce que ma question est, je ne sais pas vraiment comment le décrire.

J'ai une image pour le sol de ma ville et une image (de même taille) pour tous les murs ou les arbres derrière lesquels le joueur est censé être caché, s'il passe derrière. Mon résultat n'est même pas si mauvais:

Le problème est que si le joueur marche devant le mur, il disparaît, car l'ordre des couches du mur est au-dessus de l'ordre du joueur:

entrez la description de l'image ici

Existe-t-il un moyen assez simple de résoudre ce problème, ou dois-je ajouter tous ces objets manuellement et les connecter à certains scripts?

Ian H.
la source

Réponses:

17

Pour obtenir cet effet:

Créez deux couches de tri : Sol et Objets .

Demandez à vos sprites de route, d'herbe et de chemin d'utiliser la couche Ground.

Demandez à votre personnage, à vos murs et à vos sprites maison d'utiliser le calque Objets.

Les sprites sur votre calque d'objets voudront que leur point de pivot en mode sprite soit en bas à gauche, en bas ou en bas à droite. Vous pouvez le choisir en sélectionnant une image-objet dans votre onglet Projet, puis en choisissant le point de pivot dans l'onglet Inspecteur pour ajuster les paramètres d'importation de l'image-objet .

Paramètres d'importation des sprites

Pour les sprites au sol, vous n'aurez pas à vous soucier de changer leur ordre.

Pour les objets, cependant, vous pouvez soit changer l' ordre de tri de leur Sprite Renderer , soit changer leur transform.position.zvaleur. Je recommanderais de changer la transformation, car les flotteurs seront probablement plus faciles à regarder et à ajuster lorsque vous déplacez votre personnage, tandis que changer l'ordre de tri peut ne pas sembler aussi précis dans certaines situations, selon les mesures et les tailles de vos objets dans la scène.

Dans les deux cas, un code sera nécessaire.

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

}

Dans les deux cas, vous dites au sprite que son index Z correspond à sa position Y.

Si vous attachez ce script à un objet statique (comme un mur), vous voudrez décocher le composant dans l'inspecteur afin que sa Updateméthode ne soit pas appelée à chaque image; sa Awakeméthode appellera SetPositionune fois et c'est tout ce dont vous avez besoin.

Mais pour votre personnage, laissez le composant coché afin que chaque image soit Updateappelée SetPosition, ce qui changera l'ordre Z du personnage lorsque vous vous déplacerez. Et lorsque vous vous déplacez, tant que chaque image-objet du calque Objets utilise un point de pivot inférieur, la modification de l'index Z lorsque vous vous déplacez garantira que votre personnage apparaît devant ou derrière d'autres objets de manière appropriée.

Selon la configuration de votre caméra, vous devrez peut-être multiplier la nouvelle position Z par -1si les choses semblent en arrière.

Si vous souhaitez ajuster l'index Z lors de la modification de votre scène, consultez ExecuteInEditMode .

Chris McFarland
la source
Je suis sûr que si le composant est décoché, Start () ne fonctionnera pas. Awake () s'exécute sur un composant inactif, mais start ne fonctionne pas.
Uri Popov
Je viens de vérifier; tu as raison. J'ai mis à jour l'exemple à utiliser à la Awakeplace. Merci
Chris McFarland