Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Problema con OnMouseDown()

Iniciado por Tizon, Noviembre 13, 2016, 03:28:29 PM

Tema anterior - Siguiente tema
Hola a todos.
 
Llevo un buen rato con un problema muy tonto y no me salgo. He revisado el foro y la documentación oficial y no consigo salirme. Seguramente me estoy dejando una chorrada pero el caso es que no consigo encontrarla.
 
Me explico. Se trata simplemente de que dentro del Canvas, creo un panel y dentro de este panel diversos paneles más. La idea es que los paneles actúen casi como botones. Llevan un texto que va variando dinámicamente según las circunstancias del juego, etc. El caso es que los paneles hijos, no me detectan el mouse. Ni el evento OnMouseDawn, como tampoco el OnMouseEnter, etc...
 
He revisado que esté dentro del Layer UI, que entiendo que no ignora RayCast, a la desesperada le he metido un BoxCollider, he metido debug para verificar que simplemente no entra en las funciones y que no se trata de un código mal hecho, etc...
 
Pero haga lo que haga, simplemente, no me detecta el Mouse, como si lo ignorara por algún motivo y ya no sé que más hacer. He de añadirle algún componente para que lo detecte? La idea de que un panel de la Ui detecte el mouse es una animalada como concepto?
 
Seguramente es que de tanto pelearme con el tema ya estoy espeso, y será una chorrada, pero ni modo. Si alguien puede darme una idea de por dónde tirar lo agradecería, por qué estoy clavado con este tema.
 
Muchas gracias a todos.

Hola @Tizon lo que tu buscas es tratar al canvas como si fuese un gameobject, y no se hace asi.
 
Necesitas usar UnityEngine.EventSystems.
 
Te pongo un codigo como ejemplo; No se si es 100% correcto :)
 

    using UnityEngine;
     using UnityEngine.EventSystems; // Esta es la libreria para llamar a eventos del canvas
     
     public class MouseEvents : MonoBehaviour
         , IPointerClickHandler
         , IDragHandler
         , IPointerEnterHandler
         , IPointerExitHandler // Estos son los controladores, hay muchos mas
     
     {
         SpriteRenderer sr;
         Color color = Color.red;
     
         void Awake()
         {
             sr = GetComponent<SpriteRenderer>();
         }
     
         void Update()
         {
             if (sr)
                 sr.color = Vector4.MoveTowards(sprite.color, target, Time.deltaTime * 10);
         }
     
         public void OnPointerClick(PointerEventData eventData)
         {
             print("Click!");
             color = Color.blue;
         }
     
         public void OnDrag(PointerEventData eventData)
         {
             print("Arrastrado!");
             color = Color.magenta;
         }
     
         public void OnPointerEnter(PointerEventData eventData)
         {
             color = Color.green;
         }
     
         public void OnPointerExit(PointerEventData eventData)
         {
             color = Color.red;
         }
     }

 
Espero que sea lo que buscas, de todas formas te pongo el link de EventSystems (Documentacion Oficial)
 
API: https://docs.unity3d.com/ScriptReference/EventSystems.EventSystem.html
 
Manual: https://docs.unity3d.com/Manual/EventSystem.html

····>Desarrollando un videojuegos online-arcade para Android.


····>Programador en:C,C#,VB.net,PHP,HTML5,SQL,JS,Ruby.


····>Trabajando en: Desarrollo de paginas web y bushistudios.


                    ๑۩۞۩๑_(▀▄)KINGTRASE()_๑۩۞۩๑ 



Noviembre 19, 2016, 05:00:51 PM #2 Ultima modificación: Noviembre 19, 2016, 05:02:55 PM por Tizon
Ok. Entiendo. Entonces es un error de concepto, creí que el Canvas si era un GameObject y por lo tanto podía aplicar todas sus funcionalidades. Gracias por sacarme del error entonces. Me hubiera seguido estampando sin remedio.
 
Creo que a grandes rasgos comprendo el código, aunque excede un poco mis conocimientos actuales de Unity. Una buena oportunidad para investigar y poner codos y aprender una nueva parte, así que ahora mismo me pongo.
 
Nuevamente muchas gracias, @kingtrase.
 

Etiquetas: