0
votes

Comment détecter quel gameObject est cliqué

Je veux savoir quel gameObject est cliqué avec la souris sur un projet 2D

i utilisé xxx

mais il ne va jamais dans la seconde si l'état

Edit: Je travaille sur un seul script et accédez à tous les gamebject à partir de là à l'aide de GameObject.FindgameObjectwithTag () et, si je comprends, c'est pourquoi le code de collisionneur dans le script principal n'a pas déclenché. J'ai ajouté une capture d'écran mon code est à GameObject Entrez la description de l'image ici


9 commentaires

Dessinez donc le rayon en utilisant les outils de débogage et voyez où se passe votre ligne de rayons


@Bugfinder j'ai fait. Que ce soit un bouton ou une image Impossible d'obtenir des informations sur le jeu cliqué sur le jeu de frappe


Avez-vous mis un collisionneur sur votre objet de jeu ??


Hit! = null sera toujours true car il s'agit d'un struct . Donc, il semble hit.collider n'est jamais vrai .. Vous n'avez probablement pas de collisionneur sur l'objet que vous essayez de cliquer sur


@Eomer votre édition ne vous explique rien ... en utilisant gameObject.findgameObjectwithtag () est totalement indépendant et n'a rien à voir avec votre physics2d.raycast ... Si vous pense que c'est essentiel, veuillez ajouter le script complet de comment et où vous utilisez vos trucs exactement


@derhugo Ce que j'essayais d'expliquer est que je n'ai pas écrit de code pour chaque objet de jeu. J'ai un seul script Whick contient tout le code


@Eomer C'est bon ... et toujours tous vos objets individuels auront besoin de composants de collisionnier qui leur sont attachés, sinon la Raycast ne peut rien frapper ...


@derhugo j'ai des composants de collisionnier auquel GameObject j'ai besoin de savoir s'il est cliqué sur


Collident 2D Composants? Pourriez-vous nous montrer une capture d'écran peut-être?


3 Réponses :


0
votes

Lorsque vous utilisez un rayony, vous devez définir un collisionneur sur votre Sprite xxx

Ceci fonctionne pour moi dans l'unité 5.6

< un href = "https://i.stack.imgur.com/tkbay.png" rel = "nofollow noreferrer"> Entrez la description de l'image ici

Note: "gaucherclick" est juste une "gameObject" rien d'autre, je l'ai appelé comme ceci pour une meilleure identification :) < / p>


édité

i Testez cette méthode pour le bouton UI mais cela ne fonctionne pas; J'ai donc utilisé une approche différente. Pour le bouton UI, vous pouvez ajouter un auditeur comme celui-ci: xxx


6 commentaires

Merci mais je dois écrire ce code dans le script de gameObjects. Mais je travaille sur un seul script qui est dans un objet vide avec la même hiérarchie de la caméra et ne peut pas accéder à la collision à partir de là. Si j'écris votre script à GameObject lui-même, comment le script principal peut-il savoir?


@Eomer vous savez ce que sont les collidents, n'est-ce pas? S'il n'y a pas de collider2d composant sur votre objet, alors physics2d.raycast ne peut jamais frapper quoi que ce soit. Votre script "savoir" parce que hit.collider sera défini sur l'objet que vous avez réellement frappé .. ce qui n'est actuellement pas


@ Shamshirsaz.navid j'ai édité votre code alors il est préférable de comprendre pour OP ce qui a été changé


J'ai un composant Collider2D mais mon script n'est pas dans GameObject lui-même. J'ai ajouté un objet vide qui a un script dedans et faites tout mon code à partir de là et ajouté votre code là-bas. dans la méthode de mise à jour si je mettez un point d'arrêt dans INPUT.GETMOUSEBUTTONDOWN (0), il s'arrête lorsque je clique sur GameObject mais NOTHINGS arrive après cela


@Eomer, je pense que ce n'est pas important où votre script est :) J'ai utilisé ceci dans la méthode de mise à jour - et j'utilise un seul script également


@Eomer Essayez de faire un nouveau projet UNITY2D vide et de le tester là-bas. Juste pour une meilleure compréhension du problème.



0
votes

3 commentaires

Il serait plus propre et légèrement plus performant car il n'y a pas de méthodes de mise à jour multiples () pour itérer chaque image. Quelque chose à garder à l'esprit si vous avez des dizaines ou des centaines d'objets cliquables. Oui, mais il est possible que OP ne soit que le rayon unique dans un seul composant qui serait aussi propre et efficace;)


Merci mais je dois écrire ce code dans le script de gameObjects. Mais je travaille sur un seul script qui est dans un objet vide avec la même hiérarchie de la caméra et ne peut pas accéder à la collision à partir de là. Si j'écris votre script à GameObject lui-même, comment le script principal peut-il savoir?


@eomer ah, je vois. Dans ce cas, vous devrez être suivant: 1) Créer et attribuer une référence au script principal manuellement via l'inspecteur de chaque gameObject, 2) rendez le script principal globalement visible (statique / singleton / emplacement de service), ou 3) Introduire l'abonnement / déclenchement de l'événement système. Ces systèmes pourraient certainement être bénéfiques dans d'autres modules de jeu, mais à vous de décider si vous souhaitez introduire de nouveaux systèmes complexes dans votre projet ou non. Si vous souhaitez une logique simple sur le collisionneur, cliquez sur une meilleure solution à la version Raycast.



1
votes

Cette méthode fonctionne parfaitement sur les applications de bureau et mobiles:

  1. Ajoutez un composant de collisionneur à chaque objet que vous souhaitez détecter son événement de clic.
  2. Ajouter un script à votre projet (Nommez-le MyObject.cs ). Ce script doit mettre en œuvre l'interface ipointerdownhandler et sa méthode. Et ce script doit ajouter le Physics2DrayCaster à la caméra. Tout le corps de ce script pourrait être comme ceci: XXX

  3. Ajoute le script MyObject.cs à chaque objet que vous souhaitez détecter Cliquez dessus. Après cela, lorsque vous cliquez sur ces objets, leur nom s'affiche sur la console.

  4. Assurez-vous que Events System existe dans la hiérarchie de votre projet. Sinon, ajoutez-le en clique avec le bouton droit de la souris.

    p.s. Le script MyObject.cs a maintenant ipointerdownhandler . Cela détecte Cliquez dès que vous touchez les objets. Vous pouvez également utiliser ipointeruphandler et idraghandler à des fins différentes!

    et désolé pour mon mauvais anglais.


3 commentaires

J'ai fait tout sauf surpoinderdown n'a pas déclenché


Ne sais pas pourquoi mais je ne suis pas le seul à avoir des problèmes ne peut pas travailler les gestionnaires


Je suis presque sûr de travailler pour moi. Récemment je l'ai vérifié à nouveau et c'est OK. Veuillez le tester sur une nouvelle gamebject dans votre projet et faire exactement les 4 parties.