Noticias

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

Saber quien llama a una función: ¿Posible?

Iniciado por Caronte3D, Octubre 31, 2017, 10:22:34 PM

Tema anterior - Siguiente tema
Hola.
 
A ver si se me entiende...
 
Tengo un slider que llama a una funcion de mi script en el evento onValueChanged.
 
Y esta es mi pregunta: ¿Es posible desde esta funcion saber cual slider la está llamando? algo así como en otros lenguages se usa SENDER para saber quien llama a un boton o lo que sea?
 
Por supuesto me refiero a saber cual slider hace la llamada automaticamente, sin tener ninguna referencia puesta a mano.
 
No sé si me explico
 
 

pasas el sender por una variable global, no es lo mas lindo pero va a funcionar a menos que tengas las llamadas en hilos...

Hola, probá con esto, leyendo tu pregunta lo investigué y recuerdo que antes lo usé para algo:
 
"EventSystem.current.currentSelectedGameObject"
 
Te debería dar el gameObject deñl ultimo objeto que formó parte del evento, de ahí si fuera un hijo podés tomar su index y determinar cual de los sliders fue movido.

Cita de: lightbug date=1509497980Hola, probá con esto, leyendo tu pregunta lo investigué y recuerdo que antes lo usé para algo:
   
   
      "EventSystem.current.currentSelectedGameObject"
   
   
      Te debería dar el gameObject deñl ultimo objeto que formó parte del evento, de ahí si fuera un hijo podés tomar su index y determinar cual de los sliders fue movido.
   


Eso devuelve el objecto seleccionado en el sistema de navegación de los menús, entiendo que no servirá de mucho por que si está seleccionado lo que estás buscando quiere decir que lo estás tocando tu en la ventana del juego y por tanto estás desencadenando tu la acción.
 
@Caronte3D Puedes crear un Debug.LogError() dentro de la función, cuando aparezca el Error en la consola podrás ver la ruta desde donde se ha llamado. Una vez lo tengas y hayas solucionado el bug borras el LogError para que no aparezca de nuevo.
 
Saludos

¡Gracias a todos!
 
La solución de lightbug es lo más parecido a lo que buscaba 

Cita de: TheBullet date=1509529835Eso devuelve el objecto seleccionado en el sistema de navegación de los menús, entiendo que no servirá de mucho por que si está seleccionado lo que estás buscando quiere decir que lo estás tocando tu en la ventana del juego y por tanto estás desencadenando tu la acción.
   


La verdad es que no tenía muy en claro que hacía, pero en teoría si seleccionas un slider formaría parte del sistema de los eventos, y segun dice la doc:
 
"The GameObject currently considered active by the EventSystem. "
 
 

Cita de: lightbug date=1509558477La verdad es que no tenía muy en claro que hacía, pero en teoría si seleccionas un slider formaría parte del sistema de los eventos, y segun dice la doc:
   
   
      "The GameObject currently considered active by the EventSystem. "
   
   
       
   


Si pones la opción Navigation a None en el slide ya no serviría.
 
Eso simplemente señala el objeto que se considera seleccionado en el sistema de navegación de los menús. Puede estar seleccionado bien porque navegas hasta el con el teclado o un mando o porque clickas en el elemento (cuando se hace click en objetos que admiten navegación se seleccionan). A donde quiero llegar es que es una tontería buscar el objeto que llama a OnValueChanged usando ese método porque forzosamente es el objeto con el que estás interactuando en la partida (ya que este será el objeto seleccionado), y por tanto ya sabes que objeto es con antelación. A parte de lo dicho, si bloqueas la navegación en el slide esto te devolvería un null o el último objeto seleccionado (que no sería el slide y por tanto no te estaría dando la respuesta a lo que buscas).
 
Este método que has puesto es útil para guardar la posición donde estaba la selección en los menús. Por ejemplo, antes de abrir una nueva ventana puedes guardar el elemento que está seleccionado para que cuando salgas de esta ventana el sistema vuelva a seleccionar ese elemento en vez de seleccionar el primero de una lista, haciendo la navegación mucho más fluida y natural. Pero no sirve para debug en ningún caso.

Noviembre 02, 2017, 12:24:49 AM #7 Ultima modificación: Noviembre 02, 2017, 12:25:31 AM por lightbug
Cita de: TheBullet date=1509563461Si pones la opción Navigation a None en el slide ya no serviría.
   
   
      Eso simplemente señala el objeto que se considera seleccionado en el sistema de navegación de los menús. Puede estar seleccionado bien porque navegas hasta el con el teclado o un mando o porque clickas en el elemento (cuando se hace click en objetos que admiten navegación se seleccionan). A parte de lo dicho, si bloqueas la navegación en el slide esto te devolvería un null o el último objeto seleccionado (que no sería el slide y por tanto no te estaría dando la respuesta a lo que buscas).
   


Exacto, por eso la doc dice " considered active by the EventSystem ". Si le quitas el navigation y no tenes un cursor no podrías seleccionarlo nunca (en teoría, hablo del sistema de navegación) -> entonces nunca podrías modificarlo -> por eso nunca dispararías un evento (o no tendría sentido estar escuchando a dicho evento), ->osea, el sistema de eventos no lo consideraría un "evento válido". Fijate que se dispara igual el evento, esté o no en el sistema de navegación, por eso pasa más por el lado de cuan integrado esté uno como desarrollador al sistema este. Aunque no le veo sentido sacarlos del navigation. Si por X razón queres "sacarlos" del navigation (no se por que, pero bueno, es válido, supongo), ponelos en explicit y quedan dentro del sistema, pero no influyen (WASD)
 
Cita de: TheBullet date=1509563461A donde quiero llegar es que es una tontería buscar el objeto que llama a OnValueChanged usando ese método porque forzosamente es el objeto con el que estás interactuando en la partida (ya que este será el objeto seleccionado), y por tanto ya sabes que objeto es con antelación.
   


Si, entiendo lo que querés decir, yo en principio no uso este método ya que tenés que identificar el gameObject, de ahí el childIndex o comparar entre gameObjects para saber cual de los slider corresponde a que variable a modificar (por ej). Cuando desde el mismo Objeto/Evento podrías:
 


  •    Usar el graphics raycast que te proporciona la UI y detectarlo (creo que el navigation no importa) y de ahí pasarlo.


  •    Pasar por el mismo evento un identificador


  •    Usar un script que subscriba el evento al sistema (clase derivada de EventTrigger) y que lo haga pasando el childIndex, por ej, a modo de ID (automático)...


...por nombrar algunas.
 
Yo a la hora de actualizar un valor-slider (si fuera lo que el autor del hilo tenía pensado hacer) no uso esto, todo más sencillo, si tengo n sliders hijos de un objeto con X script (por ej), en el momento en que se da un evento de slider llamo al script X y le digo que actualice todo y listo, todo más lindo + todo más simple.

Cita de: lightbug date=1509578689Exacto, por eso la doc dice " considered active by the EventSystem ". Si le quitas el navigation y no tenes un cursor no podrías seleccionarlo nunca (en teoría, hablo del sistema de navegación) -> entonces nunca podrías modificarlo -> por eso nunca dispararías un evento (o no tendría sentido estar escuchando a dicho evento), ->osea, el sistema de eventos no lo consideraría un "evento válido". Fijate que se dispara igual el evento, esté o no en el sistema de navegación, por eso pasa más por el lado de cuan integrado esté uno como desarrollador al sistema este. Aunque no le veo sentido sacarlos del navigation. Si por X razón queres "sacarlos" del navigation (no se por que, pero bueno, es válido, supongo), ponelos en explicit y quedan dentro del sistema, pero no influyen (WASD)
   


Bueno, en determinados casos la navegación no sirve para nada, por ejemplo en un juego de móvil o un juego de pc que se juega con ratón. No se lo que consume la navegación en un móvil, pero en automático se que se actualiza en tiempo real (si mueves un objeto y lo pones encima de otro la navegación se actualiza al momento), esto algo debe consumir y quizás en móvil vale la pena quitarlo si hay muchos elementos ya que no tiene utilidad alguna.


Aunque es mejor usar una imagen con fill, un slide puede ser modificado sin tener la navegación activada y sin ser interactable. Por ejemplo, para mostrar estadísticas de un RPG (por inventarme algo), podrías subir de nivel mediante un botón o simplemente por aumentar la XP durante el juego y que los slides que muestran los atributos se actualizarán por código, eso llamaría a OnValueChanged, pero el método de buscar el seleccionado no daría ese slide como respuesta.
 
Total, a lo que me refiero es que ese método no sirve para saber cual es el último elemento de la UI que ha llamado a una acción ya que el elemento puede llamar una función sin ser considerado "active" por el sistema de EventSystem. Recuerda que "active" en este caso quiere decir seleccionado por la navegación, es donde estaría el cursor (lo digo porque la palabra active está mal elegida para mi gusto y puede llevar a confusiones).

Cita de: gZone date=1509622886...se le estará pasando la referencia al gameObject del slider que hace la llamada.
   


Vaya! fijate que lo haqbía pensado y no lo hice porque no sabia como pasar tambien el valor del slider. Jajaja que atontao estoy, SI TENGO EL GAMEOBJECT, YA LO TENGO TODO
 
Gracias!

Cita de: gZone date=1509647265 
   
   
       
   
   
      Para pasar solo el slider usa como parámetro de entrada en la función a llamar un parámetro de tipo Slider.
   
   
      Ejemplo:
   
   

public void detectame (Slider slider) {
print ("cambia " + slider.value );
}

   
      Al agregar la función al On Value Changed aparecerá el campo de la variable, pincha arriba en el slider y arrástralo a dicho campo.
   


Sí, eso ya lo tenia claro, gracias again ;)

Etiquetas: