Перейти к содержимому

Управление

Controls создают для компонента собственные именованные действия вместо чтения жёстко заданной игровой кнопки. Компилятор записывает объявления в inputs.json, игра создаёт InputAction и позволяет игроку переназначать их в настройках модуля.

Управление доступно только на клиенте.

src/client/controls.ts
import {
Gamepad,
Keyboard,
defineControls,
} from "@killscript/sdk/client";
export const controls = defineControls("camera", {
toggle: Keyboard.F6,
boost: Keyboard.LeftShift,
controllerToggle: Gamepad.North,
});

Пространство имён создаёт действия вроде camera.toggle. Обычное имя не столкнётся с другим объявлением в том же модуле.

defineControls() должен инициализировать const на верхнем уровне, но может находиться в любом импортированном клиентском файле.

Используйте событие для однократной реакции и опрос состояния для поведения во время удержания:

controls.toggle.onPressed(() => {
cameraEnabled = !cameraEnabled;
});
const boostLoop = controls.boost.whilePressed(() => {
moveCamera(fastSpeed);
});
if (controls.boost.isPressed()) {
drawBoostIndicator();
}
МетодПоведение
onPressed(callback)Нативное событие performed; подходит для обработчика на всё время жизни модуля
onChanged(callback)Сообщает и о нажатии, и об отпускании
onReleased(callback)Сообщает только о переходе из нажатого состояния в отпущенное
whilePressed(callback)Выполняется каждый клиентский кадр во время удержания
isPressed()Безопасно читает текущее состояние
native()Возвращает исходный InputAction, если он доступен

Наблюдатели через опрос возвращают EventSubscription. Отмените его напрямую или добавьте в scope компонента, если наблюдатель должен исчезнуть при её выключении.

import { Keyboard, Mouse, control, defineControls } from "@killscript/sdk/client";
const actions = defineControls("movement", {
charge: control.hold(Keyboard.F, 0.4),
quickTap: control.tap(Keyboard.G, 0.2),
doubleTap: control.multiTap(Keyboard.W, 2, 0.3),
onRelease: control.onRelease(Keyboard.Space),
});

Эти helpers генерируют строки interactions для Unity Input System. Длительность задаётся в секундах. Передайте объект в control(...), если нужны processors, groups или собственная interaction. control.raw(...) дополнительно позволяет указать тип действия:

const look = defineControls("camera", {
delta: control.raw({
type: "PassThrough",
binding: { path: Mouse.Delta },
}),
});

Методы input принимают как созданные действия, так и нативные InputAction:

import { input } from "@killscript/sdk/client";
if (input.anyPressed([controls.toggle, controls.boost])) {
showInputIndicator();
}
const chord = input.onChord(
[controls.toggle, controls.boost],
resetCamera,
);
const enabledState = input.toggle(controls.toggle, false, (value) => {
value ? enableFeature() : disableFeature();
});
print(`Enabled: ${enabledState.value}`);
  • anyPressed() и allPressed() читают общее текущее состояние;
  • onAnyPressed() срабатывает при переходе группы от покоя к любому нажатию;
  • onChord() срабатывает, когда нажаты все переданные действия;
  • toggle() хранит boolean и меняет его при каждом событии нажатия.

toggle() создаёт временное состояние. Настройка в config.json от него не появляется.

Поле или метод ToggleStateПоведение
valueТекущее boolean-состояние
set(value)Заменяет состояние и вызывает обработчик
flip()Меняет состояние, вызывает обработчик и возвращает новое значение