IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Unity Discussion :

Question Layer et order in layer pour des Sprites


Sujet :

Unity

  1. #1
    Membre expérimenté Avatar de Tonton Nico
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 398
    Points : 1 320
    Points
    1 320
    Par défaut Question Layer et order in layer pour des Sprites
    Bonsoir les gens !

    Je viens de me prendre la tête pendant quelque temps sur un problème concernant les layer pour des spirites lambda que j'ai pris. Je vous résume la situation en gros :

    J'ai un premier sprite de gros parchemin avec un Box Collider2D avec un script attaché OnMouseEnter qui fait apparaitre le text d'ambiance
    J'ai un deuxième sprite de petit parchemin avec le ruban rouge avec aussi un Box Collider2D avec un script OnMouseDown pour débloquer le skill (dont l'image apparait sur le gros parchemin en fait)
    Enfin J'ai un dernier sprite de background sans collider ou script dessus (j'ai fait des screens sans le background pour mieux voir les collider qui se superposent donc)

    Cela donne:

    Nom : exemple_layer.png
Affichages : 2337
Taille : 241,2 Ko


    J'ai mis les 3 sprites dans le layer Default en modifiant le sorting order, en résumé : background layer X, gros parchemin X+1, petit parchemin X +2 donc pour que le petit parchemin soit au dessus du gros qui est au dessus du background), en pensant que cela suffirait à gérer les click/enter/exit/etc .... et bin non
    Même en faisant de la sorte en cliquant sur le petit parchemin et bin rien ne se passait alors que toute les conditions sont réunis... pire en lancant le jeu plusieurs fois à la suite et bin des fois cela fonctionnait et des autres fois non... comme si en fait c'était plutôt le premier sprite qui est chargé dans la mémoire qui a la priorité ou du genre

    J'ai regardé sur le net et surtout une vidéo d'unity3d.com sur les layers et cela parlait de créer des layers avec des noms différent (avec le dernier layer de la liste qui est au dessus des autres donc si j'ai bien compris)... et la encore ça ne veut rien savoir

    A noter que j'ai aussi à coté du petit parchemlin en temps normal un sprite de bouton "+" pour augmenter le level une fois acheter avec les mêmes layer/sorting order que le parchemin d'achat... et j'ai jamais eu de soucis je crois avec

    Bref pour en finir comme indiqué dans la vidéo et que j'ai vu sur un autre forum, j'ai réglé l'axe Z des sprites et cela à l'air de bien fonctionné mais j'aimerais comprendre si quelqu'un à une documentation/lien/ou une explication pourquoi le ording in layer ne fonctionne pas dans ce cas la (avec les scripts attaché surtout, sinon en terme d'image l'Order est bien respecté en terme de superposition d'image) ou ce que je fais de travers car j'ai une solution mais cela devrait fonctionner quand même avec les layers je pense !

    En espérant être clair ^^ , merci d'avance pour votre aide et vos éclaircissement
    Tonton Nico
    TontonNico

    On me dit souvent que je ressemble à Einstein... mais plutôt à Frank que Albert

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 958
    Points
    32 958
    Billets dans le blog
    4
    Par défaut
    Pour autant que je sache les layers dans Unity c'est du vent complet : ça sert uniquement à ranger tes objets.
    Ce qui t'intéresse pour ça c'est le z-order de chaque élément.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Salut,

    C'est les Tags qui n'ont pas d'impact.

    Déjà deux différence à faire,

    Layer => impact sur la physique (ProjectSetting/Physics), la navigation, l'affichage ou non par une caméra ...
    SortingLayer/OrderInLayer => impact le z-order de l'affichage

    Il faut bien différencier le rendu et la physique.
    Si l'image peut afficher un element A devant un élément B, ce n'est pas pour autant que le collider de A sera prioritaire sur le B.

    Ce qui ce passe dans ton cas, c'est que les deux colliders sont sur la même position en z, donc impossible de savoir lequel est devant, c'est, si puis-je dire, du z fighting de collider (ça peut marcher de temps en temps).

    Pourquoi ne pas utiliser les UI/Button ? Sans contrainte particulière, les objets en bas de la hiérarchie seront toujours prioritaires.

  4. #4
    Membre expérimenté Avatar de Tonton Nico
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 398
    Points : 1 320
    Points
    1 320
    Par défaut
    Bonjour à tous les deux


    Citation Envoyé par Bousk Voir le message
    Pour autant que je sache les layers dans Unity c'est du vent complet : ça sert uniquement à ranger tes objets.
    Ce qui t'intéresse pour ça c'est le z-order de chaque élément.
    Alors pour le Z-order je ne vois pas ce paramètre dans Unity
    Ca doit être les layers/order in layer/sorting order qui résume le Z-order j'imagine

    Citation Envoyé par PilloBuenaGente Voir le message

    Ce qui ce passe dans ton cas, c'est que les deux colliders sont sur la même position en z, donc impossible de savoir lequel est devant, c'est, si puis-je dire, du z fighting de collider (ça peut marcher de temps en temps).

    Pourquoi ne pas utiliser les UI/Button ? Sans contrainte particulière, les objets en bas de la hiérarchie seront toujours prioritaires.
    Le collider n'est pas lié au Layer Order de l'objet auquel il est rattaché c'est un peu bête je trouve
    Du coup on ne peut pas donner un ordre de priorité des colliders?ça serait bien utile ^^

    Oui j'ai utilisé l'axe Z au final tout simplement, pour le UI/button j'ai trouvé plus simple de balancer mes images comme ça sur le décor mais c'est une bonne idée, je vais tester pour voir ce qu'il est possible de faire (j'avais oublié qu'on peut mettre une sprite sur un Button directement yeah )

    Par contre je ne comprends pas ta dernier explications "Sans contrainte particulière, les objets en bas de la hiérarchie seront toujours prioritaires", tu veux dire quoi par la? que le UI est devant tout ?

    Merci pour votre aide en tout cas

    Tonton Nico
    TontonNico

    On me dit souvent que je ressemble à Einstein... mais plutôt à Frank que Albert

  5. #5
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Tonton Nico Voir le message
    Par contre je ne comprends pas ta dernier explications "Sans contrainte particulière, les objets en bas de la hiérarchie seront toujours prioritaires", tu veux dire quoi par la? que le UI est devant tout ?
    Pardon, de façon très simpliste, sur des canvas avec les paramètres par défault, un RectTransform se trouvant en dessous d'un autre dans l'inspecteur (qu'il soit enfant ou non) apparaîtra toujours devant, visuellement et physiquement.
    Tout ça pour dire que c'est assez facile et qu'il n'y a pas trop de question à ce poser en utilisant l'UI unity.


    (J'ai pas vraiment l'impression que ce soit plus clair... )

  6. #6
    Membre expérimenté Avatar de Tonton Nico
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 398
    Points : 1 320
    Points
    1 320
    Par défaut
    J'ai tester justement dans mon gameobjet de Skill de mettre le petit parchemin avant le grand parchemin ou de tenter des liens enfant/parent mais j'ai toujours eu le même résultat sur les colliders (sauf erreur de ma part)

    J'avoue ne pas comprendre comment tout cela fonctionne et au final le plus simple est vraiment de les séparer sur l'Axe Z et c'est réglé mais je trouve que ce n'est pas propre, je dois merder quelque part et louper le fonctionnement des layers/hiérarchie dans l'arbre de construction mais je n'arrive pas à voir ou


    Edit: je ferais une vidéo cela sera plus parlant
    TontonNico

    On me dit souvent que je ressemble à Einstein... mais plutôt à Frank que Albert

  7. #7
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    C'est juste que les colliders ne font pas partis du système d'UI.

    Donc soit tu utilise des colliders et donc faire attention à leur position en z.
    Soit tu utilise des boutons, et le système fonctionne comme expliqué au dessus.

  8. #8
    Membre expérimenté Avatar de Tonton Nico
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 398
    Points : 1 320
    Points
    1 320
    Par défaut
    Cela explique la chose
    J'ai fait quelques test et en effet dans mon cas pas de choix, il faut forcément utiliser l'axe Z pour faire deux colliders l'un dans l'autre que ce soit en bouton ou sprite, c'est plus clair pour moi merci à tous
    TontonNico

    On me dit souvent que je ressemble à Einstein... mais plutôt à Frank que Albert

  9. #9
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Il me semble, selon les screenshots, que tu utilises un Canvas ?!

    Pourquoi ne pas utiliser les composants Button et Image ? (sans collider !!!)
    Plus de soucis d'ordre, tu cliques ce que tu vois

    (Les interfaces de l'EventSystem permettent de récupérer des infos comme les survoles, les cliques, les drags et bien d'autres...)

  10. #10
    Membre expérimenté Avatar de Tonton Nico
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 398
    Points : 1 320
    Points
    1 320
    Par défaut
    J'ai vu l'Event System qui se rajoute automatiquement mais je ne maitrise pas du tout.
    Concernant le choix d'un canvas et de sprite c'est que j'utilise un OnMouseEnter, pour moi les boutons je n'utilises que le "On Click" event, on peut aussi le gérer avec l'event System si je comprends bien !
    Je vais regarder ça de plus près car dans l'avenir ça me sera surement très utile.


    Edit: je viens de refaire les tests avec mes deux boutons "B1" et "B2" que j'avais utilisé pour les colliders test ... VINDIOU y en a des infos en effet
    Nom : test_event.png
Affichages : 2081
Taille : 39,2 Ko

    Je me sens comme un homme des cavernes a qui l'on vient d'apporter le feu
    TontonNico

    On me dit souvent que je ressemble à Einstein... mais plutôt à Frank que Albert

  11. #11
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Tonton Nico Voir le message
    J'ai vu l'Event System qui se rajoute automatiquement mais je ne maitrise pas du tout.
    Je parlais aussi et surtout des interfaces à utiliser sur tes propres composants !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    using UnityEngine;
    using UnityEngine.EventSystems;
     
    public class OnMouseEnterUI : MonoBehaviour, IPointerEnterHandler
    {
    	public void OnPointerEnter(PointerEventData eventData)
    	{
    		Debug.Log("OnPointerEnter on " + name);
    	}
    }
    https://docs.unity3d.com/ScriptRefer...erHandler.html

  12. #12
    Membre expérimenté Avatar de Tonton Nico
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 398
    Points : 1 320
    Points
    1 320
    Par défaut
    Merci PilloBuenaGente pour cette info, je vais voir comment utiliser le code que tu as fournis !
    TontonNico

    On me dit souvent que je ressemble à Einstein... mais plutôt à Frank que Albert

  13. #13
    Membre expérimenté Avatar de Tonton Nico
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 398
    Points : 1 320
    Points
    1 320
    Par défaut
    Je viens de tester c'est pas mal du tout !

    J'ai voulu tester à faire la même chose quand on clique sur une UI - Image , je me suis baladé sur https://docs.unity3d.com/ScriptRefer...EventData.html

    J'ai vu donc ce qui m'intéresse: Nom : pointer1.png
Affichages : 2094
Taille : 3,3 Ko
    Première étape, en regardant ton code, je vois que tu appelles OnPointerEnter qui est bien dans la doc pour PointerEnter, du coup je tente de tenter de créer une void :
    Nom : pointer2.png
Affichages : 2040
Taille : 7,4 Ko

    Bon premier "échec": je ne vois pas ton OnPointerEnter mais je me dis que c'est comme un Void Start, une fois utilisé une fois il ne te le propose plus, du coup vu qu'il me propose rien d'autre et surtout pas mon OnPointerDown je me dis que j'ai loupé un truc
    Après avoir décortiqué plus en détail le code je vois que tu fais appel au IPointerEnterHandler qui dans la doc se rapporte... au PointerEventData ! super



    En cherchant sur le net et la doc je trouve facilement le IPointerDownHandler que j'ajoute et rien a faire il ne me propose pas le OnPointerEnter en automatique .... je vu un exemple sur le net avec le IPointerExitHandler en plus du Enter et cela fonctionne niquel... du coup moment d'horreur quand je réalise que unity ne le propose pas automatiquement mais que ça existe


    Bref je fais ma petite fonction et ça marche mais bon un peu déroutant tout ça !
    On trouve le IPointerDownHandler en faisant une recherche de "IPointer" dans la doc unity... c'est con quand même que depuis la page du PointerEventData on nous parle du "pointerEnter The object that received 'OnPointerEnter'" sans nous dire qu'il faut utiliser le "IPointerEnterHandler" ! c'est bête ça de filer les infos à moitiés





    Du coup cela soulève (encore et toujours avec moi) quelques questions

    1. Du coup j'ai compris à quoi sert le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PointerEventData eventData
    , on peut l'appeler dans la procédure par exemple pour récupérer le .position .. du coup on peut aussi appeler le .PointerEnter
    J'ai voulu tenter un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class OnMouseEnterUI : MonoBehaviour
    {
        public int COMPTEUR =0;
        public void Update(PointerEventData eventData)
        {
            if (eventData.pointerEnter)
            {
                COMPTEUR += 1;
            }
        }     
    }
    Pour pouvoir récupérer tous les event avec un if mais l'Update ne prend pas de paramètre
    Ce n'est pas possible de juste déclarer le PointerEventData eventData quelque part pour utiliser toutes les fonctions sans avoir à déclarer du coup un par un ceux dont on a besoin IPointerEnterHandler,IPointerEnterHandler?


    2. Pourquoi unity ne propose pas en automatique "OnPointerDown", "OnPointerEnter" quand on commence à écrire tout comme il propose "OnMouseDown", "OnMouseEnter" etc si tu commences a écrire Il y a une option quelque part à activer? c'est con car même en utilisant le UnityEngine.EventSystems et en déclarant utiliser le PointerEnterHandler, ça nous aide pas pour l'appeler

    Bonne soirée et merci d'avance pour ceux qui auront le courage de me lire
    TontonNico

    On me dit souvent que je ressemble à Einstein... mais plutôt à Frank que Albert

  14. #14
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Tonton Nico Voir le message
    Ce n'est pas possible de juste déclarer le PointerEventData eventData quelque part pour utiliser toutes les fonctions sans avoir à déclarer du coup un par un ceux dont on a besoin IPointerEnterHandler,IPointerEnterHandler?
    Nope, "PointerEventData eventData" est le paramètre commun des callbacks de l'EventSystems.
    En implémentant IPointerEnterHandler, au moment de la réception de l’événement de PointerEnter sur le composant (s'il est en mode "Raycast Target"), le système va appelé la méthode correspondante en lui envoyant le PointerEventData.

    Citation Envoyé par Tonton Nico Voir le message
    Pourquoi unity ne propose pas en automatique "OnPointerDown", "OnPointerEnter" quand on commence à écrire tout comme il propose "OnMouseDown", "OnMouseEnter" etc si tu commences a écrire Il y a une option quelque part à activer? c'est con car même en utilisant le UnityEngine.EventSystems et en déclarant utiliser le PointerEnterHandler, ça nous aide pas pour l'appeler
    Non pas d'auto-completion, mais si tu déclare l'interface, VisualStudio te propose d'implémenter la méthode lui même.

  15. #15
    Membre expérimenté Avatar de Tonton Nico
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 398
    Points : 1 320
    Points
    1 320
    Par défaut
    Arf mince bon tant pis ^^

    Je vais explorer un peu plus tout ça, ça peut surement être utile les "Drag" pour faire un jeu de carte à la Heartstone ou pouvoir déplacer des objets sur une map à la souris
    TontonNico

    On me dit souvent que je ressemble à Einstein... mais plutôt à Frank que Albert

Discussions similaires

  1. [SDL 2.0] Render, texture et transparence pour des layers
    Par YingYan dans le forum SDL
    Réponses: 1
    Dernier message: 14/11/2016, 17h01
  2. quelque petite question pour des windows messages
    Par julspower dans le forum C++
    Réponses: 3
    Dernier message: 02/12/2008, 18h54
  3. est que y a des réponses pour des questions
    Par DSabah dans le forum Sécurité
    Réponses: 2
    Dernier message: 30/05/2007, 15h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo