Page 1 sur 1

Cliquer sur une image en ignorant la zone transparente

Publié : 24 Fév 2024 11:02
par Maud
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.

Re: Cliquer sur une image en ignorant la zone transparente

Publié : 24 Fév 2024 12:21
par jmhoubre
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 !");
                }
            }
        }
    }
}

Re: Cliquer sur une image en ignorant la zone transparente

Publié : 24 Fév 2024 14:41
par Max
Bonjour,

pour compléter la réponse, tu peux regarder aussi du coté de Image.alphaHitTestMinimumThreshold.
cela devrait je pense aussi solutionner ton soucis ;)