Descripción del problema
Se ha creado un Canvas con uno o más botones para realizar una acción, al correr el juego no funcionan los botones cuando los pulsamos.
Esto es algo que me ha pasado en varias ocasiones y puede deberse a varias razones.
Vamos a asumir que tienes un GameObject con el Script con la función del botón definida como pública, lo has asignado al componente Button del Canvas y seleccionado la función apropiada. Si no has hecho esto y necesitas ayuda, te invito a leer este artículo sobre cómo usar botones del Canvas.
En el siguiente vídeo muestro una forma rápida de testear si funcionan los botones del Canvas y cuatro razones por las cuales los botones podrían no funcionar en Unity y cómo solucionarlas
Posible Solución 1: No hay EventSystem
Cuando creamos un Canvas automáticamente se crea un GameObject llamado “EventSystem”, como se observa en la figura 1, este GameObject tiene asociada algunas componentes que se encargan de manejar los eventos de entrada.
Si accidentalmente eliminamos el GameObject EventSystem, no se detectan las entradas del mouse y no funcionan los botones del Canvas.
Para solucionar esto podemos crear un segundo Canvas para que aparezca el GameObject EventSystem y luego eliminar ese segundo Canvas.
Posible Solución 2: Botón configurado como no interactivo
El componente Button tiene un booleano para inhabilitarlo, como se ve en la figura 3 la casilla “Interactable”.
Posible Solución 3: Botón no es un RayCast target
El botón tiene asignado un componente Image para la imagen de fondo y además un componente Text para el texto del botón.
Ambos componentes tienen una casilla con el nombre “Raycast Target”, que lo que hace es habilitar el componente para que pueda ser detectado por un trazado de rayos, el proceso por el cual se detecta que se ha pulsado algún elemento del Canvas.
En las figuras 3 y 4 vemos las casillas “Raycast Target”. En un botón si todas las casillas Raycast Target están desmarcadas, no se podrá detectar cuando se haga clic sobre esos elementos.
Para solucionar este problema, asegurarse que al menos una casilla Raycast Target se encuentre habilitada