Noticias

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

Problema con Script de Botones UI

Iniciado por Joksan, Junio 26, 2018, 06:44:35 AM

Tema anterior - Siguiente tema
Hola tengo una duda sobre el script de los botones en c# y es que entiendo bien que se agrega una funcion al boton al darse click por ejemplo
 

public Button Shootbtn;
Button btn = Shootbtn.GetComponent<Button>();
        btn.onClick.AddListener(Update);

 
Pero lo que quiero hacer es decirle al boton que si se da click y una variable sea falsa en el boton haga tal cosa como:
 

if (Shootbtn.onClick && !Arma)
{
  //codigo de acciones
}

 
lo que pasa es que no puedo agregar el .onClick en mi funcion Update y queria saber si tengo que hacer diferentes funciones para cuando se clickea el boton o como decirle al boton que si se clickea y una variable es falsa se haga una accion

Hola! Efectivamente le pasas una función al botón, esta función la puedes crear tú y dentro de la función puede haber lo que quieras, ejemplo:
 

public Button btn;
void Start ()
{
btn.OnClick.AddListener(MiFuncion);
}
void MiFuncion()
{
if(!arma)
{
...
}
}

 
Como la función es llamada solo cuando el botón es pulsado y en ese momento puedes mirar si la variable arma es true o false.

Muchas gracias esque en mi juego el script que tengo esta agregado el imput.GetButton("Fire1") y lo que quise hacer es en vez de que sea con el fire1 sea con un botón y todo el código esta en el update.

Pues en ese caso lo que haría yo es crear una variable bool y al pulsar le asignas true, la cuestión es que tienes que controlar cuando se vuelva false. Ejemplo:
 

bool botonPulsado = false;
public Button btn;
void Start ()
{
btn.OnClick.AddListener(MiFuncion);
}
void MiFuncion()
{
botonPulsado = !botonPulsado;   //Opción A
botonPulsado = true;      //Opción B
}
void Update ()
{
if((Input || botonPulsado) && !arma)
{
...
botonPulsado = false;      //Opción B
}
}

 
De esta manera cada vez que pulses el botón la variable botonPulsado cambiará al otro estado, pero tal vez no es lo que necesites.
 
Otra opción es cambiar la variable una vez ha entrado en la condición.

De hecho creo que si es lo que necesito jaja porque ahurita todo bien con agregarle la funcion update al boton pero ahora el problema es que mi arma se dispara sola aunque no haya clickeado el boton por eso le quiero agregar como un if para que diga que si se pulsa el boton dispare y si en cambio no tiene balas que recargue
 

else if (MiturnoPlayer.Equals(TManager.tmanager.Turno) && TiempoDisparo >= _velocidad && RandomDisp == 0 && !_animArma.IsPlaying("Poner bala") && !_animArma.IsPlaying("Recargar") && Balas >= 1)
        {          
         
            //Codigo de lo que se tiene que hacer si se presiona el boton pero si tiene balas el arma
            _animArma.Play("Disparar", PlayMode.StopAll);
            Camera.main.GetComponent<AudioSource>().PlayOneShot(sonidoDisparo, 0.3f);
            Balas -= 1;
            TiempoDisparo = 0;
            TManager.tmanager.Turno += 1;
            Invoke("TiempoCanvas" ,2f);
            Shootbtn.gameObject.SetActive(true);
        }
 
else if (MiturnoPlayer.Equals(TManager.tmanager.Turno) && TiempoDisparo >= _velocidad && RandomDisp == 0 && !_animArma.IsPlaying("Poner bala") && !_animArma.IsPlaying("Recargar") && Balas >= 1)
        {          
         
            //Codigo de lo que se tiene que hacer si se clickea el boton y no tiene balas el arma
                _animArma.Play("Disparar", PlayMode.StopAll);
                Camera.main.GetComponent<AudioSource>().PlayOneShot(sonidoDisparo, 0.3f);
                Balas -= 1;
                TiempoDisparo = 0;
                TManager.tmanager.Turno += 1;
                Invoke("TiempoCanvas" ,2f);
                Shootbtn.gameObject.SetActive(true);
        }

 
Eso es lo que se ejecuta solo sin que se presione el boton como algo automatico
 
 
 
Voy a probar lo que tu dices y tratar de implementarlo a la forma que quiero espero que funcione gracias

Junio 26, 2018, 10:49:47 PM #5 Ultima modificación: Junio 26, 2018, 10:57:10 PM por Joksan
Cita de: juanma_teso date=1530029614 
   


 
 
Perdon ya lo arregle tenia que utilizar un tipo contador pero muchas gracias por tu ayuda me sirvio

Junio 26, 2018, 11:02:46 PM #6 Ultima modificación: Junio 26, 2018, 11:05:04 PM por lightbug
probablemente "Update" no sea una linda opción para usar de callback, tu clase deriva de monobehaviour?
 
 
 
Cita de: Joksan date=1529988275Pero lo que quiero hacer es decirle al boton que si se da click y una variable sea falsa en el boton haga tal cosa como:
   
   

if (Shootbtn.onClick && !Arma)
{
  //codigo de acciones
}

   
      lo que pasa es que no puedo agregar el .onClick en mi funcion Update y queria saber si tengo que hacer diferentes funciones para cuando se clickea el boton o como decirle al boton que si se clickea y una variable es falsa se haga una accion
   


Mmm no se si estas queriendo hacer lo que pienso con ese "if" aunque quizás lo hayas puesto de forma ilustrativa, así que por las dudas, la idea de crear un evento (un UnityEvent en este caso) y usar un listener de dicho evento es eliminar todo "if" (por así decirlo) de la ecuación, imaginate dos escenarios:
 


  1.    Ya llegamos?(if) ... no , y ahora?(if) No , ahora?(if) no , la llegamos?(if) mmm no , .... llegamos?(if) Si  Ok (Realizar acción)


  2.    Avisame cuando lleguemos?(setear listener del evento llegar)   .... zzzz ....zzz ....  ....zzz ....    LLegamos! Ok (Realizar acción)


(el 2 es mucho más sensato, el 1 sirve más para una comedia)
 
Así funcionan todos tus eventos en general, (incluso los delegates events también), entonces vos podés especificar como dice @juanma_teso tu método, pero también podés pasarle un argumento si quisieras.
 
 
 
Cita de: Joksan date=1530027985Muchas gracias esque en mi juego el script que tengo esta agregado el imput.GetButton("Fire1") y lo que quise hacer es en vez de que sea con el fire1 sea con un botón y todo el código esta en el update.
   


PEnsalo así, disparar en que consiste a nivel gameplay? instanciar algo, activar algo, crear y testear un ray?, bueno lo que sea que vaya lo ponés dentro del callback y todo lo instantaneo va ahí. La idea del bool está bien. aunque si vas a actualizar un valor, luego en update hacer algo en base a dicho valor y luego resetear el valor es casi lo mismo que hacerlo directamente una vez en "MiFuncion" (en este caso). Si por cualquier cosa necesitás si o si mantener la vieja estructura (con Input) bueno, no te queda otra que hacer eso.
 
 
 
Cita de: Joksan date=1530030205De hecho creo que si es lo que necesito jaja porque ahurita todo bien con agregarle la funcion update al boton pero ahora el problema es que mi arma se dispara sola aunque no haya clickeado el boton por eso le quiero agregar como un if para que diga que si se pulsa el boton dispare y si en cambio no tiene balas que recargue
   


chequea lo del "Update" de arriba, quizás metiste de callback el Update y no importa, update es update, es un mensaje que se dispara cuadro a cuadro (por eso arriba pregunte si era un monobehaviour). Si vas a llamar a una callback que se dedica a gestionar el proceso del Disparo, llamarla Update es meeeeeeeeeee ...
 
y bueno del ultimo código, aunque el problema pase por otro lado esos condicionales huelen a peligro, pensa que estás chequeando "si el manager es X , si el tiempo de disparo es mayor a una velocidad (totalmente ilógico, puede funcionar pero queda raro) si el random da tanto, si las animaciones no se están reproduciendo y sin tenés balas "... osea creo e faltó chequear por la resolución de pantalla nada más . Te recomiendo implementar estados y separar más las cosas, por ej disparar no debería depender de una animación.
 
Saludos
 
 

Lo se jaja ese era el error muchas gracias

Etiquetas: