Input
Input lee las acciones de entrada del proyecto y el estado físico del mando de PlayStation. Usa nombres semánticos para poder cambiar las asignaciones de botones sin reescribir los scripts; reserva las constantes físicas para convenciones propias de la plataforma o diagnósticos.
Botones y acciones
function Update(gameObjectId, deltaTime)
if Input.GetButtonDown("Interact") then
Log.Print("Interact pressed")
end
if Input.GetButton(Input.R1) then
Transform.RotateY(gameObjectId, 60.0 * deltaTime)
end
end
| Método | Descripción |
|---|---|
Input.GetButton(buttonOrAction) | Indica si el botón se mantiene presionado. |
Input.GetButtonDown(buttonOrAction) | Verdadero en el cuadro en que se presiona. |
Input.GetButtonUp(buttonOrAction) | Verdadero en el cuadro en que se suelta. |
Las constantes físicas son Input.CROSS, Input.CIRCLE, Input.SQUARE, Input.TRIANGLE, D-pad Input.UP, Input.DOWN, Input.LEFT, Input.RIGHT, Input.START, Input.SELECT, Input.L1, Input.L2, Input.L3, Input.R1, Input.R2 y Input.R3.
Ejes
Input.GetAxis(stickOrAction, deadZone) devuelve dos números en -1.0..1.0:
local moveX, moveY = Input.GetAxis("Move")
local lookX, lookY = Input.GetAxis("Look")
-- Physical-stick access is also available.
local leftX, leftY = Input.GetAxis(Input.STICK_LEFT)
Usa Input.STICK_LEFT o Input.STICK_RIGHT para acceder directamente al stick físico.
La entrada del D-pad digital alimenta la ruta de movimiento cuando la asignación del proyecto lo permite. El stick derecho requiere un pad con capacidad analógica en modo analógico. Aplica una zona muerta apropiada para el proyecto antes de usar valores analógicos pequeños.
Zonas muertas en mandos físicos
Los sticks originales de PS1 no siempre regresan exactamente al centro nominal. Un mando que funciona bien en otros juegos puede mover la cámara si tu juego usa una zona muerta demasiado pequeña. Comprueba este comportamiento en la consola, además de hacerlo en el emulador.
Para los controladores nativos, ajusta PlayerInput > Dead Zone en el Inspector.
Los componentes nativos nuevos usan 0.35 como valor inicial. Last Exit usa
su propio controlador en Lua: ajusta la propiedad expuesta deadZone en el
LuaBehaviour del jugador. La plantilla usa 0.30 para movimiento y cámara.
Prueba 0.35 si el mando físico todavía provoca movimiento involuntario. Los proyectos existentes conservan sus valores:
actualizar el editor no reemplaza sus scripts ni la configuración de sus componentes.
En un controlador escrito en Lua puedes pasar una zona muerta opcional directamente:
local moveX, moveY = Input.GetAxis("Move", 0.35)
local lookX, lookY = Input.GetAxis("Look", 0.35)
El segundo argumento se limita al intervalo 0.0..0.95. Dentro de la zona muerta
se devuelve cero; al salir, el movimiento comienza suavemente y conserva la
velocidad máxima al llevar el stick hasta el extremo. En Play Mode, el movimiento
del mouse capturado no pasa por la zona muerta de los sticks. No apliques otra zona
muerta a estos valores filtrados. Si omites el argumento, recibes los valores
normalizados originales, sin filtrar.
Usa el menor valor que mantenga inmóviles al jugador y la cámara al soltar ambos sticks en los mandos con los que pruebes el juego. Después de cambiar los scripts o la configuración de la escena, vuelve a compilar con Build Disc Image (.bin + .cue); una imagen de disco ya generada conserva los valores anteriores.
Estado del dispositivo
| Método | Retorno | Descripción |
|---|---|---|
Input.IsConnected() | booleano | Informes de un dispositivo compatible en el puerto 1. |
Input.HasAnalog() | booleano | Informa de disponibilidad de stick analógico. |
Input.GetPadType() | entero | Devuelve el código de tipo de controlador. |
L3/R3 y la vibración dependen de la asignación del controlador y emulador conectados. Un juego debe permanecer operativo cuando la entrada analógica o la vibración no están disponibles.
Configura los ejes y botones semánticos en Project Settings > Input Action Map. La compilación PS1 preprocesa como máximo 32 registros de acción fijos y resuelve los nombres de acción sin asignación por cuadro.
Estado del componente PlayerInput
La tabla PlayerInput controla el componente PlayerInput creado en tiempo de ejecución. No reemplaza las consultas Input sin procesar.
| Método | Retorno | Descripción |
|---|---|---|
PlayerInput.SetEnabled(gameObjectId, enabled) | booleano | Habilita o deshabilita el movimiento nativo del jugador, el control de la cámara, la interacción y las indicaciones de interacción. Devuelve false para un GameObject no válido o uno sin PlayerInput. |
PlayerInput.IsEnabled(gameObjectId) | booleano o nil | Devuelve el estado del componente de tiempo de ejecución, o nil cuando PlayerInput está ausente. |
La desactivación de PlayerInput no desactiva el GameObject ni su LuaBehaviour. El script puede continuar leyendo Input para dirigir un menú modal, una opción de diálogo, un salto de escena u otro flujo personalizado. El estado de ejecución se restaura desde el componente de autoría cuando se inicia o recarga una escena.
Bloquear al personaje y la cámara durante un diálogo
Usa Player Input en el jugador como interruptor de controles. Sustituye
"Player" en estos ejemplos por el nombre exacto de ese GameObject. Mantén
activos los GameObjects del jugador, la cámara y el diálogo para que la escena
y el diálogo puedan seguir actualizándose.
Controladores nativos
Si usas First Person Controller o Third Person Controller nativos, desactiva PlayerInput al abrir el diálogo y actívalo después de cerrarlo:
-- When the dialogue opens:
PlayerInput.SetEnabled(GameObject.Find("Player"), false)
-- After the dialogue finishes closing:
PlayerInput.SetEnabled(GameObject.Find("Player"), true)
Esto detiene el movimiento nativo, el control de la cámara y la interacción. Las consultas directas a Input siguen disponibles, por lo que el diálogo puede leer botones para avanzar el texto o elegir una respuesta. Coloca estas llamadas en las funciones que abren y cierran tu diálogo; no ejecutes ambas seguidas en la misma función. Restaura los controles después de la animación de cierre para que el botón usado al cerrar no llegue al gameplay. Si otro sistema ya había desactivado los controles, restaura ese estado anterior en lugar de activarlos siempre.
Scripts de movimiento y cámara en Lua
Desactivar PlayerInput no detiene los scripts personalizados de Lua. Conserva un componente Player Input en el jugador y usa las mismas llamadas de apertura y cierre del ejemplo anterior. Después comprueba su estado antes de leer la entrada de movimiento o cámara, o de modificar las transformaciones. Un controlador en Lua no necesita Player Motor ni un controlador nativo para usar este interruptor.
Integra este patrón en cada script existente de movimiento o cámara: guarda
el ID del jugador en Start y añade la condición al principio de Update:
local player = -1
function Start(gameObjectId)
player = GameObject.Find("Player")
end
function Update(gameObjectId, deltaTime)
if PlayerInput.IsEnabled(player) == false then
return
end
-- Existing movement or camera code goes here.
end
Si un mismo script controla al personaje y la cámara, basta con una condición
antes de ambas operaciones. Si están en scripts distintos, añádela a los dos.
Aplica la misma condición en LateUpdate si también mueve o gira la cámara.
Integra los cambios en las funciones existentes en lugar de definir una segunda
función con el mismo nombre. El diálogo debe seguir ejecutando su propia
actualización.
PlayerInput.IsEnabled devuelve nil cuando falta el componente; si la
condición no tiene efecto, revisa el nombre del GameObject y su componente.
Esto bloquea los controles, sin pausar el mundo: la gravedad, las animaciones
y otros scripts pueden seguir ejecutándose. Abrir un canvas por sí solo no
bloquea al jugador ni los controles personalizados de la cámara.
Después de cambiar los scripts o componentes, vuelve a compilar con Build Disc Image (.bin + .cue) para probar el mismo comportamiento en PS1 o DuckStation.