Interacción del jugador y entrada de controles en Unreal Engine

Capítulo 6

Tiempo estimado de lectura: 8 minutos

+ Ejercicio

Objetivo del capítulo

En este capítulo vas a configurar entradas (Inputs) de tipo Acción y Eje, enlazarlas en el Blueprint de tu Character (o Pawn), implementar movimiento/cámara/salto y construir una interacción contextual con una tecla. La práctica completa se basa en un Line Trace desde la cámara para detectar objetos interactuables, dar feedback visual y ejecutar una acción al presionar Interact, contemplando casos como “no hay nada”, distancia máxima y bloqueo de interacción durante acciones/animaciones.

1) Configurar Inputs: Acciones y Ejes

1.1 Crear Action Mappings

Usa Project Settings > Input para definir acciones discretas (presionar/soltar). Crea:

  • Jump (Space Bar o Gamepad Face Button Bottom)
  • Interact (E o Gamepad Face Button Right)

1.2 Crear Axis Mappings

Los ejes representan valores continuos (por ejemplo, -1 a 1). Crea:

  • MoveForward: W = +1, S = -1 (o Left Stick Y)
  • MoveRight: D = +1, A = -1 (o Left Stick X)
  • Turn: Mouse X (o Right Stick X)
  • LookUp: Mouse Y (o Right Stick Y)

Consejo: si el eje vertical del mouse te queda invertido, invierte el signo en el mapeo (por ejemplo, Mouse Y = -1) o multiplica por -1 en Blueprint.

2) Enlazar Inputs en el Blueprint del Character

2.1 Preparar componentes típicos (Character)

En un Character es común tener:

Continúa en nuestra aplicación.
  • Escuche el audio con la pantalla apagada.
  • Obtenga un certificado al finalizar.
  • ¡Más de 5000 cursos para que explores!
O continúa leyendo más abajo...
Download App

Descargar la aplicación

  • CapsuleComponent (colisión)
  • CharacterMovement (movimiento y salto)
  • SpringArm (brazo de cámara)
  • Camera

Si tu proyecto ya tiene un Character base (por ejemplo, Third Person), reutilízalo. Si no, crea un Blueprint basado en Character y añade SpringArm + Camera.

2.2 Movimiento con Add Movement Input

En el Event Graph del Character, agrega los eventos de eje:

  • InputAxis MoveForward
  • InputAxis MoveRight

Implementación recomendada (movimiento relativo a la cámara):

  • Obtén la rotación de control: Get Control Rotation
  • Construye una rotación solo con Yaw (para ignorar pitch/roll): usa Break Rotator y luego Make Rotator con Pitch=0, Roll=0, Yaw=Yaw
  • Obtén vectores: Get Forward Vector y Get Right Vector de esa rotación
  • Llama a Add Movement Input con el vector correspondiente y Axis Value
// Pseudoflujo Blueprint (MoveForward): ControlRot -> YawOnlyRot -> ForwardVector -> AddMovementInput(ForwardVector, AxisValue)

Repite para MoveRight usando RightVector.

2.3 Cámara: Turn y LookUp

Para rotación de cámara/control:

  • InputAxis TurnAdd Controller Yaw Input (Value = Axis Value * Sensibilidad)
  • InputAxis LookUpAdd Controller Pitch Input

La sensibilidad puede ser una variable MouseSensitivity (float) para ajustar sin tocar el mapeo.

2.4 Salto (si aplica)

En un Character:

  • InputAction Jump (Pressed)Jump
  • InputAction Jump (Released)Stop Jumping

Si estás usando un Pawn sin CharacterMovement, el salto requerirá lógica propia (impulso/physics). En este capítulo asumimos Character para mantener el foco en interacción.

3) Interacción contextual: diseño del sistema

3.1 Qué significa “interacción contextual”

Es una interacción que depende de lo que el jugador esté mirando/apuntando. La tecla Interact no hace “algo fijo”, sino que intenta interactuar con el objeto detectado (si existe y está dentro de rango).

3.2 Contrato de interacción: Blueprint Interface

Para evitar acoplar tu Character a clases específicas, crea una Blueprint Interface llamada BPI_Interactable con:

  • Función Interact (Input: Interactor de tipo Actor)
  • Función GetInteractText (Output: Text)
  • Función SetHighlighted (Input: bHighlighted bool) para feedback

Así, cualquier actor interactuable implementa esa interfaz y el Character solo “pregunta” y “llama”.

4) Práctica completa: Line Trace desde la cámara

4.1 Variables necesarias en el Character

VariableTipoUso
InteractDistanceFloatDistancia máxima del trace (por ejemplo 300–500)
CurrentInteractableActor (Object Reference)Actor actualmente detectado (si implementa la interfaz)
bCanInteractBoolBloqueo global de interacción (animaciones/acciones)
bIsBusyBoolEstado “ocupado” (ej. abriendo puerta, usando objeto)
InteractMessageTextTexto a mostrar (opcional si usas UI)

bCanInteract puede iniciar en true. InteractDistance por defecto 400.

4.2 Preparar el canal de colisión (recomendado)

Para que el trace sea limpio, crea un Trace Channel dedicado:

  • Project Settings > Collision > New Trace Channel: InteractTrace (Default Response: Ignore)

Luego, en los objetos interactuables, configura su colisión para bloquear ese canal (Block) en el componente que quieras detectar (StaticMesh, etc.).

4.3 Función en Character: DetectInteractable()

Crea una función DetectInteractable que se ejecute de forma periódica (por ejemplo en Event Tick o con un Timer cada 0.05–0.1s). Con Timer reduces costo y es suficiente para feedback.

Pasos dentro de DetectInteractable:

  • Obtén la cámara: Get FollowCamera (o tu componente cámara)
  • Start = GetWorldLocation de la cámara
  • Forward = GetForwardVector de la cámara
  • End = Start + Forward * InteractDistance
  • LineTraceByChannel (Channel: InteractTrace)
  • Activa Draw Debug Type como For Duration mientras pruebas

Luego procesa el Hit Result:

  • Si Blocking Hit es false: no hay nada detectado
  • Si hay hit: toma Hit Actor y verifica si implementa BPI_Interactable con Does Implement Interface

4.4 Manejo de “nada detectado” y limpieza de highlight

Necesitas des-resaltar el interactuable anterior cuando cambias de objetivo o cuando ya no hay hit.

Lógica recomendada:

  • Guarda una referencia previa: PreviousInteractable = CurrentInteractable
  • Calcula el nuevo candidato (o null)
  • Si PreviousInteractable != NewInteractable:
  • Si PreviousInteractable es válido: llama SetHighlighted(false) (mensaje de interfaz)
  • Asigna CurrentInteractable = NewInteractable
  • Si CurrentInteractable es válido: llama SetHighlighted(true) y pide GetInteractText para UI
  • Si CurrentInteractable es null: limpia el mensaje/indicador
// Pseudoflujo: New = (HitActor implements BPI_Interactable) ? HitActor : None

4.5 Feedback al jugador (dos opciones)

Opción A: Outline/Highlight (visual)

Implementación típica en el actor interactuable:

  • En el StaticMesh del interactuable, habilita Render CustomDepth Pass cuando esté resaltado
  • En SetHighlighted(bHighlighted) (en el actor), activa/desactiva Set Render CustomDepth

Esto suele combinarse con un Post Process que dibuja outline usando CustomDepth. Si ya tienes ese postproceso en el proyecto, solo necesitas activar CustomDepth en el mesh.

Opción B: Mensaje en pantalla (UI simple)

Si tienes un Widget HUD, muestra un texto como “Presiona E para interactuar” o el texto devuelto por GetInteractText. Desde el Character, al detectar un interactuable válido, actualiza el texto; si no hay, lo ocultas.

5) Ejecutar la interacción al presionar Interact

5.1 InputAction Interact

En el Character:

  • InputAction Interact (Pressed)

Antes de interactuar, valida:

  • bCanInteract debe ser true
  • bIsBusy debe ser false (o tu lógica equivalente)
  • CurrentInteractable debe ser válido

Si todo es válido:

  • Llama a Interact (mensaje de interfaz) sobre CurrentInteractable, pasando Self como Interactor

Si no hay interactuable:

  • No hagas nada o reproduce un sonido “error”/“no válido” (opcional)

5.2 Bloqueo de interacción durante acciones/animaciones

Hay dos lugares típicos para bloquear:

  • En el Character: al iniciar una acción, setea bIsBusy = true y/o bCanInteract = false. Al terminar, vuelve a habilitar.
  • En el interactuable: el actor puede ignorar Interact si está en uso (por ejemplo, una puerta ya en animación).

Ejemplo práctico (bloqueo temporal desde el Character):

  • Al presionar Interact y antes de llamar a la interfaz: setea bIsBusy = true
  • Tras completar la acción, libera con un Timer o con un evento de animación (Anim Notify) que llame a una función SetBusy(false)

Si tu interacción dispara un Montage, un patrón común es: Play Anim Montage y al finalizar (o con Notify) reactivar bIsBusy.

6) Implementar un actor interactuable de ejemplo

6.1 BP_InteractableButton (ejemplo)

Crea un Blueprint Actor BP_InteractableButton con un StaticMesh (un botón, palanca o cubo). Implementa BPI_Interactable.

6.2 Implementación de la interfaz

  • GetInteractText: devuelve "Interactuar" o "Activar"
  • SetHighlighted: activa/desactiva CustomDepth en el mesh
  • Interact(Interactor): ejecuta una acción visible, por ejemplo:
  • Cambiar material/color del mesh
  • Reproducir un sonido
  • Activar una luz (si el actor tiene un PointLight)
// Ejemplo de Interact: ToggleLight = !ToggleLight; PointLight->SetVisibility(ToggleLight)

Si quieres evitar spam, el actor puede tener bInUse y rechazar interacciones mientras está activo.

7) Manejo de casos y robustez

7.1 Distancia máxima

La distancia máxima ya queda controlada por InteractDistance al calcular End. Asegúrate de que el feedback (highlight/mensaje) solo se active cuando el actor está dentro del trace.

7.2 Nada detectado

Cuando LineTraceByChannel no golpea nada:

  • Desactiva highlight del CurrentInteractable anterior
  • Setea CurrentInteractable = None
  • Oculta el mensaje/indicador

7.3 Detecta pero no es interactuable

Si el trace golpea un actor que no implementa la interfaz:

  • Trátalo como “nada detectado” para interacción
  • Opcional: puedes seguir mostrando un crosshair normal, pero no el mensaje de interacción

7.4 Bloqueo durante animaciones/acciones

Además de bIsBusy, considera bloquear también el feedback para evitar “parpadeos” mientras el jugador está en una animación:

  • Si bIsBusy es true: puedes omitir DetectInteractable o forzar CurrentInteractable = None y limpiar UI

7.5 Evitar re-llamadas constantes a SetHighlighted

Solo llama SetHighlighted cuando cambie el objetivo (comparando referencia previa vs nueva). Esto evita trabajo extra y comportamientos visuales inconsistentes.

8) Guía paso a paso (resumen de implementación)

  1. Inputs: crea Jump, Interact, MoveForward, MoveRight, Turn, LookUp en Project Settings.

  2. Character: enlaza ejes a AddMovementInput (relativo a yaw de control) y cámara a AddControllerYaw/PitchInput. Enlaza Jump a Jump/StopJumping.

  3. Interfaz: crea BPI_Interactable con Interact, GetInteractText, SetHighlighted.

  4. Canal de trace: crea InteractTrace y configura interactuables para bloquearlo.

  5. Detección: en Character, crea DetectInteractable (Timer recomendado) que haga LineTraceByChannel desde la cámara hasta InteractDistance.

  6. Selección: si el HitActor implementa la interfaz, setea CurrentInteractable; si no, limpia. Maneja cambio de objetivo para activar/desactivar highlight y actualizar texto.

  7. Interact: en InputAction Interact, valida bCanInteract, bIsBusy y CurrentInteractable. Llama Interact por interfaz.

  8. Bloqueos: al iniciar una interacción que dispare animación/acción, setea bIsBusy y libera al finalizar (Timer o Anim Notify). Opcional: pausa la detección mientras esté ocupado.

Ahora responde el ejercicio sobre el contenido:

Al presionar la acción Interact en el Character, ¿qué conjunto de validaciones asegura que la interacción solo ocurra cuando corresponde?

¡Tienes razón! Felicitaciones, ahora pasa a la página siguiente.

¡Tú error! Inténtalo de nuevo.

Antes de interactuar se valida un bloqueo global (bCanInteract), el estado de ocupación (bIsBusy) y que exista un objetivo actual (CurrentInteractable). Solo entonces se llama Interact mediante la interfaz.

Siguiente capítulo

Colisiones, triggers y eventos de superposición para mecánicas

Arrow Right Icon
Portada de libro electrónico gratuitaUnreal Engine para Principiantes: Fundamentos de Blueprints y Lógica de Gameplay
55%

Unreal Engine para Principiantes: Fundamentos de Blueprints y Lógica de Gameplay

Nuevo curso

11 páginas

Descarga la aplicación para obtener una certificación gratuita y escuchar cursos en segundo plano, incluso con la pantalla apagada.