Buttons for mobile phones

Botones para teléfonos móviles

Hola a todos, estoy intentando añadir una función a los botones que trae Unreal por defecto para móviles. Quiero que el botón derecho además de girar a derecha e izquierda el personaje también pueda disparar o agacharse si se mantiene pulsado el botón. La idea es que al clicar 2 veces seguidas en el boton el personaje cambie de accion, por ejemplo que desenfunde una pistola y camine con la pistola en la mano. He seguido un tutorial que me podria valer, en el ejemplo usa el nodo InputActionJum donde el personaje salta si pulsa la barra espaciadora y si la mantiene salta mas alto pero para lo que necesito no funciona, ya que es para movil y necesito que en vez de la barra espaciadora sea el boton de girar a derecha e izquierda de la pantalla. He probado con el game pad InputAxisTurn Right/left pero funciona como si fuera un event tick y no me sirve. No se si alguien me puede ayudar. Gracias.

Para explicarlo mejor, podría decir que me valdría también si cada vez que toco el botón suma un número.

Yo de ti editaría tu texto para escribirlo en español. Este subforo es " Español (Spanish)". Si escribes en inglés, publícalo en los foros en donde se escribe en inglés. Suele haber muchísima más gente y recibirás antes una respuesta con la solución a tu duda.

Si estás intentando hacer algo con un Axis, lo que vas a obtener es eso: Un evento que salta en cada fotograma con el valor de ese Axis.

Te daré tres opciones que se me ocurren:

Si lo que quieres es que ocurra un evento cuando estás pulsando derecha o izquierda durante un periodo de tiempo concreto, podrías poner en ese evento del Axis una comprobación para ver si está por encima (o igual) de un valor concreto (para saber que está pulsado, por ejemplo 0.7) y si lo está, inicias un timer que ejecute un evento (con lo que quieras que ocurra al mantenerlo pulsado) al pasar X segundos o el tiempo que quieras que haya que tenerlo pulsado (guardando la referencia al timer que has puesto y que obtienes como salida en el nodo en el que lo inicias). Si en algún momento, el valor del Axis está por debajo de ese valor límite (0.7), miras si tienes la referencia al timer (IsValid) y si lo está, lo cancelas para que ya no se ejecute en caso de seguir activado (porque el usuario ha dejado de pulsar ese Axis en ese lado (lado positivo). Harías lo mismo para el lado negativo en caso de querer realizar otra acción al mantener pulsado el otro lado del eje. (Ten en cuenta que en el lado negativo para que se considere pulsado, el valor debería ser menor a -0.7)

También lo puedes hacer sin timers en el Tick. Haces una variable contador (float) para cada dirección del Axis que cuente cuanto tiempo lleva ese Axis valiendo más que un valor concreto (por ejemplo 0.7 para el axis positivo, y -0.7 para el negativo). Tan fácil como añadir el DeltaTime a cada contador en cada fotograma que se considere el eje pulsado (el positivo, cuando es mayor a 0.7 y el negativo, cuando es menor a -0.7). Y poner el contador correspondiente a 0 cuando se supone que el usuario no está pulsándolo (cuando el valor del axis es menor a 0.7 en la dirección positiva del axis y mayor a -0.7 en la dirección negativa). Después añadir el DeltaTime cuando se considera pulsado, compruebas si has llegado a cierto tiempo concreto y si has llegado, ejecutas la acción que quieras que ocurra y vuelves a poner ese contador a cero para que empiece de nuevo a contar el tiempo que está el botón pulsado.

La última es la recomendable, que es utilizar el Enhanced Input.

Creas un InputAction (AxisDerechaIzquierda)para detectar las pulsaciones del Axis (positivo y negativo):
image

Luego otro InputAction (Pulsado) para que salte cuando se mantiene una tecla pulsada por cierto tiempo. En el ejemplo que pongo, de un segundo:
image

Mapeas las teclas en un MappingContext:

Luego en el GameMode o en el LevelBlueprint o donde quieras inicializar el juego, activas ese MappingContext y accedes a los eventos AxisDerechaIzquierda, que te dará el valor del axis (para controlar al personaje) y el evento Pulsado que saltará cuando se mantiene pulsada las teclas que se mapearon para ese axis. Como es un Axis, puedes aprovechar para hacer una acción u otra dependiendo del signo del Action Value que recibes en el evento.

1 Like

Mil gracias Juande por tu mega explicación. No me desenvuelvo muy bien en los foros, lo editare para ponerlo en español e intentare seguir los pasos que me comentas que creo que me va a ayudar a conseguir lo que quiero. Cualquier cosa lo iré poniendo por aquí. De nuevo mil gracias.

1 Like

He probado todas las opciones y no consigo adaptarlo a lo que quiero hacer, he conseguido que al mover el eje me devuelva un valor y con esto me serviría, pero mi objetivo no es este realmente sino que el jugador solo tenga que presionar el botón del eje (sin moverlo) para obtener ese valor. De esta manera al clicar 2 veces seguidas podría asignar ese valor que me devuelve para cambiar el arma del jugador.

¿Qué es lo que quieres? ¿Que ocurra una acción al mantener el botón pulsado?

¿O que haga algo cuando se hace una doble pulsación seguida?

Viendo que no vas muy suelto con la programación, te recomiendo mirarte tutoriales sobre el Enhanced Input de Unreal Engine, te viene con muchos Triggers predefinidos para conseguir todo eso que quieres conseguir. Así, no tienes que programar esa lógica “a mano”.

Puedes mirarte la documentación traducida con IA al español:

O, como parece que manejas el inglés, diréctamente en inglés:

En Youtube tienes muchos vídeos que explican cómo utilizar el Enhanced Input (en inglés): https://youtu.be/TslJjSh2Hog?si=thbfrHAxBTBeT3Xm&t=894 (Momento 14m15s)
En este explican el Trigger que te interesa, que es el “Combo” (Momento 1m49s). Ahí puedes indicar una secuencia de teclas que el usuario debe pulsar una detrás de otra. En tu caso, será la misma:
https://youtu.be/kXaI3qblpMo?si=ZwjYve9DVAqKF1x9&t=109

En Youtube también hay vídeos en español que explican cómo utilizar el Enhanced Input:

También explico en español cómo utilizar de forma básica el Enhanced Input en este curso de Unreal Engine que hice hace unos meses y publiqué aquí:

Pero la parte del Enhanced Input está diseminada a lo largo del mismo. :frowning:

1 Like

De nuevo gracias, por tus esplendidas respuestas. De programación es verdad que solo con blueprints y bastante justo. Se nota no? :person_facepalming: voy poco a poco. Voy a echarle un vistazo a lo que comentas de los Enhanced Input a ver si por ahí lo consigo. La verdad es que pensé que iba a ser mas fácil. Mi objetivo es que con el mismo botón (el que controla los ejes ) pueda utilizarlo para mas acciones y no tener que añadir otro botón externo, ya que en el móvil ocupa mucho espacio y esteticamente no me gusta como queda. La idea es que cuando de 2 toques al botón el personaje pueda lanzar una patada (que se quede preparado para lanzar la patada) y si le doy 3 toques que pueda cargar el arma ( igualmente que se quede preparado para disparar con el arma) y ambas que se puedan disparar pulsando el otro botón del eje. Esta es principalmente la idea que quiero. Bueno, mil gracias de verdad, como te he dicho antes. Cualquier cosa lo seguiré poniendo por aquí.

Ya contarás tus progresos por aquí… Puede que al principio parezca lioso, pero el Enhanced Input es muy sencillo una vez lo entiendes bien.

Los InputAction definen el “tipo de dato” que obtienes de una interacción concreta del usuario con el sistema. “Digital (bool)” para pulsación de un botón, “Axis 1D (float)” para recibir un sólo axis, etc. Así que debes crear un InputAction para cada acción que realice el jugador.

Los Input Mapping Context es donde asignas las teclas que activan cada acción, así como las reglas para que estas se activen. Aquí tendrás InputActions que se activan con las mismas teclas/botones, pero con distintas reglas (Triggers). Para obtener los valores negativos, además deberás añadir el modificador “Negate” a la tecla asignada al InputAction que deberá generar un valor negativo (por ejemplo, la flecha izquierda; siendo la flecha derecha un valor positivo).

En cuanto veas unos cuantos ejemplos, lo entenderás en seguida. Y sobre programación… irás mejorando según vayas ganando experiencia.