Cliquer sur une image en ignorant la zone transparente

Questions techniques liées à l’utilisation d'Unity (et n'entrant pas dans le cadre d'une des sections suivantes)
Maud
Messages : 28
Inscription : 05 Fév 2020 14:30

Cliquer sur une image en ignorant la zone transparente

Message par Maud » 24 Fév 2024 11:02

Bonjour, je souhaite lancer des événements quand on clique sur une image mais en ignorant les parties transparentes de l'image.
L'image est placée dans un Canvas, mais je n'arrive à rien.
Soit le clic n'est pas reconnu, soit il est reconnu sur l'image entière zone transparente comprise.

Y-a-t-il une solution ?
Merci beaucoup pour vos réponses.

Avatar de l’utilisateur
jmhoubre
Messages : 859
Inscription : 05 Oct 2019 22:05

Re: Cliquer sur une image en ignorant la zone transparente

Message par jmhoubre » 24 Fév 2024 12:21

La question est intéressante. J'ai essayé avec un mask, mais j'avoue méconnaître ce composant. Après quelques essais infructueux, j'ai posé la question à ChatGPT :
Utiliser un Collider 2D : assurez-vous que votre GameObject contenant l'image a un composant Collider 2D. Vous pouvez utiliser un Box Collider 2D ou un Polygon Collider 2D selon la forme de votre image.

Utiliser un Raycast : utilisez un raycast pour détecter le clic sur l'image. Vous pouvez utiliser la fonction Physics2D.Raycast pour cela.

Vérifier la transparence : lorsque le rayon touche le Collider, vérifiez la couleur du pixel correspondant dans la texture de l'image pour déterminer s'il est transparent ou non.
Exemple de code :
using UnityEngine;

Code : Tout sélectionner

public class ClicImage : MonoBehaviour
{
    void Update()
    {
        // Vérifier si le bouton de la souris est enfoncé
        if (Input.GetMouseButtonDown(0))
        {
            // Convertir la position de la souris en Ray
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit2D hit = Physics2D.Raycast(ray.origin, ray.direction);

            // Si le rayon touche un Collider 2D
            if (hit.collider != null)
            {
                // Obtenir la texture de l'image
                Texture2D texture = hit.collider.gameObject.GetComponent<SpriteRenderer>().sprite.texture;

                // Convertir la position du rayon en coordonnées de texture
                Vector2 pixelUV = hit.textureCoord;

                // Convertir les coordonnées de texture en coordonnées de pixel
                int x = (int)(pixelUV.x * texture.width);
                int y = (int)(pixelUV.y * texture.height);

                // Obtenir la couleur du pixel correspondant
                Color pixelColor = texture.GetPixel(x, y);

                // Vérifier la transparence du pixel
                if (pixelColor.a > 0.1f) // ajustez ce seuil selon vos besoins
                {
                    // Le clic a été effectué sur une partie non transparente de l'image
                    // Mettez ici le code pour gérer l'événement de clic
                    Debug.Log("Clic sur une partie non transparente de l'image !");
                }
            }
        }
    }
}

Avatar de l’utilisateur
Max
Messages : 8772
Inscription : 30 Juil 2011 13:57
Contact :

Re: Cliquer sur une image en ignorant la zone transparente

Message par Max » 24 Fév 2024 14:41

Bonjour,

pour compléter la réponse, tu peux regarder aussi du coté de Image.alphaHitTestMinimumThreshold.
cela devrait je pense aussi solutionner ton soucis ;)
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Répondre

Revenir vers « Unity le logiciel »