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:
- Escuche el audio con la pantalla apagada.
- Obtenga un certificado al finalizar.
- ¡Más de 5000 cursos para que explores!
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 MoveForwardInputAxis 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 Rotatory luegoMake Rotatorcon Pitch=0, Roll=0, Yaw=Yaw - Obtén vectores:
Get Forward VectoryGet Right Vectorde esa rotación - Llama a
Add Movement Inputcon el vector correspondiente yAxis 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 Turn→Add Controller Yaw Input(Value = Axis Value * Sensibilidad)InputAxis LookUp→Add 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)→JumpInputAction 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:Interactorde tipoActor) - Función
GetInteractText(Output:Text) - Función
SetHighlighted(Input:bHighlightedbool) 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
| Variable | Tipo | Uso |
|---|---|---|
InteractDistance | Float | Distancia máxima del trace (por ejemplo 300–500) |
CurrentInteractable | Actor (Object Reference) | Actor actualmente detectado (si implementa la interfaz) |
bCanInteract | Bool | Bloqueo global de interacción (animaciones/acciones) |
bIsBusy | Bool | Estado “ocupado” (ej. abriendo puerta, usando objeto) |
InteractMessage | Text | Texto 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=GetWorldLocationde la cámaraForward=GetForwardVectorde la cámaraEnd= Start + Forward *InteractDistanceLineTraceByChannel(Channel:InteractTrace)- Activa
Draw Debug TypecomoFor Durationmientras pruebas
Luego procesa el Hit Result:
- Si
Blocking Hites false: no hay nada detectado - Si hay hit: toma
Hit Actory verifica si implementaBPI_InteractableconDoes 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
PreviousInteractablees válido: llamaSetHighlighted(false)(mensaje de interfaz) - Asigna
CurrentInteractable=NewInteractable - Si
CurrentInteractablees válido: llamaSetHighlighted(true)y pideGetInteractTextpara UI - Si
CurrentInteractablees null: limpia el mensaje/indicador
// Pseudoflujo: New = (HitActor implements BPI_Interactable) ? HitActor : None4.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 Passcuando esté resaltado - En
SetHighlighted(bHighlighted)(en el actor), activa/desactivaSet 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:
bCanInteractdebe ser truebIsBusydebe ser false (o tu lógica equivalente)CurrentInteractabledebe ser válido
Si todo es válido:
- Llama a
Interact(mensaje de interfaz) sobreCurrentInteractable, pasandoSelfcomoInteractor
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 = truey/obCanInteract = false. Al terminar, vuelve a habilitar. - En el interactuable: el actor puede ignorar
Interactsi 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 meshInteract(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
CurrentInteractableanterior - 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
bIsBusyes true: puedes omitirDetectInteractableo forzarCurrentInteractable = Noney 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)
Inputs: crea
Jump,Interact,MoveForward,MoveRight,Turn,LookUpen Project Settings.Character: enlaza ejes a
AddMovementInput(relativo a yaw de control) y cámara aAddControllerYaw/PitchInput. EnlazaJumpaJump/StopJumping.Interfaz: crea
BPI_InteractableconInteract,GetInteractText,SetHighlighted.Canal de trace: crea
InteractTracey configura interactuables para bloquearlo.Detección: en Character, crea
DetectInteractable(Timer recomendado) que hagaLineTraceByChanneldesde la cámara hastaInteractDistance.Selección: si el HitActor implementa la interfaz, setea
CurrentInteractable; si no, limpia. Maneja cambio de objetivo para activar/desactivar highlight y actualizar texto.Interact: en
InputAction Interact, validabCanInteract,bIsBusyyCurrentInteractable. LlamaInteractpor interfaz.Bloqueos: al iniciar una interacción que dispare animación/acción, setea
bIsBusyy libera al finalizar (Timer o Anim Notify). Opcional: pausa la detección mientras esté ocupado.