---
key: lesson/input-and-feedback
type: lesson
id: input-and-feedback
lang: ru
title: Ввод и обратная связь
summary: >-
  Превращаем нажатия в игровые намерения и показываем игроку, какое действие
  принято, отклонено или выполнено.
updatedAt: '2026-10-20'
status: active
url: 'https://gamemechanics.pro/ru/lessons/input-and-feedback/'
jsonUrl: 'https://gamemechanics.pro/api/v1/knowledge/ru/lesson/input-and-feedback.json'
markdownUrl: 'https://gamemechanics.pro/content/knowledge/ru/lesson/input-and-feedback.md'
aliases: []
tags:
  - input
  - feedback
  - accessibility
sourceIds:
  - source-663cb05191120f23
sources:
  - id: source-663cb05191120f23
    title: 'Godot: Using InputEvent'
    url: 'https://docs.godotengine.org/en/stable/tutorials/inputs/inputevent.html'
    verifiedAt: null
relations:
  - type: requires
    direction: outgoing
    label: Перед началом
    key: lesson/game-loop
    title: Игровой цикл и время
    url: 'https://gamemechanics.pro/ru/lessons/game-loop/'
    jsonUrl: 'https://gamemechanics.pro/api/v1/knowledge/ru/lesson/game-loop.json'
    markdownUrl: 'https://gamemechanics.pro/content/knowledge/ru/lesson/game-loop.md'
  - type: requires
    direction: incoming
    label: Продолжить изучение
    key: lesson/state-machines
    title: Состояния и переходы
    url: 'https://gamemechanics.pro/ru/lessons/state-machines/'
    jsonUrl: 'https://gamemechanics.pro/api/v1/knowledge/ru/lesson/state-machines.json'
    markdownUrl: 'https://gamemechanics.pro/content/knowledge/ru/lesson/state-machines.md'
  - type: requires
    direction: incoming
    label: Продолжить изучение
    key: lesson/game-feel
    title: 'Game feel: читаемое действие'
    url: 'https://gamemechanics.pro/ru/lessons/game-feel/'
    jsonUrl: 'https://gamemechanics.pro/api/v1/knowledge/ru/lesson/game-feel.json'
    markdownUrl: 'https://gamemechanics.pro/content/knowledge/ru/lesson/game-feel.md'
  - type: requires
    direction: incoming
    label: Продолжить изучение
    key: lesson/teaching-a-mechanic
    title: Обучение одной механике через уровень
    url: 'https://gamemechanics.pro/ru/lessons/teaching-a-mechanic/'
    jsonUrl: >-
      https://gamemechanics.pro/api/v1/knowledge/ru/lesson/teaching-a-mechanic.json
    markdownUrl: >-
      https://gamemechanics.pro/content/knowledge/ru/lesson/teaching-a-mechanic.md
  - type: requires
    direction: incoming
    label: Продолжить изучение
    key: lesson/game-accessibility
    title: Базовая доступность игровой сессии
    url: 'https://gamemechanics.pro/ru/lessons/game-accessibility/'
    jsonUrl: >-
      https://gamemechanics.pro/api/v1/knowledge/ru/lesson/game-accessibility.json
    markdownUrl: >-
      https://gamemechanics.pro/content/knowledge/ru/lesson/game-accessibility.md
  - type: explains
    direction: outgoing
    label: Применение принципа
    key: mechanic/voice-audio--family-01
    title: Прямые голосовые команды
    url: 'https://gamemechanics.pro/ru/knowledge/mechanic/voice-audio--family-01/'
    jsonUrl: >-
      https://gamemechanics.pro/api/v1/knowledge/ru/mechanic/voice-audio--family-01.json
    markdownUrl: >-
      https://gamemechanics.pro/content/knowledge/ru/mechanic/voice-audio--family-01.md
  - type: explains
    direction: outgoing
    label: Применение принципа
    key: mechanic/point-and-click--family-43
    title: Способы ввода и выбора действия
    url: >-
      https://gamemechanics.pro/ru/knowledge/mechanic/point-and-click--family-43/
    jsonUrl: >-
      https://gamemechanics.pro/api/v1/knowledge/ru/mechanic/point-and-click--family-43.json
    markdownUrl: >-
      https://gamemechanics.pro/content/knowledge/ru/mechanic/point-and-click--family-43.md
  - type: contains
    direction: incoming
    label: Учебные маршруты
    key: path/first-prototype
    title: Первый проверяемый прототип
    url: 'https://gamemechanics.pro/ru/learn/first-prototype/'
    jsonUrl: 'https://gamemechanics.pro/api/v1/knowledge/ru/path/first-prototype.json'
    markdownUrl: 'https://gamemechanics.pro/content/knowledge/ru/path/first-prototype.md'
  - type: requires
    direction: incoming
    label: Продолжить изучение
    key: path/level-design
    title: Левел-дизайн
    url: 'https://gamemechanics.pro/ru/learn/level-design/'
    jsonUrl: 'https://gamemechanics.pro/api/v1/knowledge/ru/path/level-design.json'
    markdownUrl: 'https://gamemechanics.pro/content/knowledge/ru/path/level-design.md'
  - type: uses
    direction: outgoing
    label: Источники в подборке
    key: resource/godot-input
    title: 'Godot: обработка ввода'
    url: 'https://gamemechanics.pro/ru/resources/#resource-godot-input'
    jsonUrl: 'https://gamemechanics.pro/api/v1/knowledge/ru/resource/godot-input.json'
    markdownUrl: 'https://gamemechanics.pro/content/knowledge/ru/resource/godot-input.md'
placements: []
supersededBy: []
attributes:
  category: foundations
  level: beginner
  minutes: 6
endsAt: null
provenance: >-
  Авторский материал gamemechanics.pro. Учебные примеры требуют проверки в своём
  проекте.
license: CC-BY-4.0
codeLicense: MIT
attribution: gamemechanics.pro contributors
---
# Ввод и обратная связь

id: input-and-feedback
type: lesson
key: lesson/input-and-feedback
lang: ru
status: active
url: https://gamemechanics.pro/ru/lessons/input-and-feedback/

Превращаем нажатия в игровые намерения и показываем игроку, какое действие принято, отклонено или выполнено.

## Что нужно знать

Урок подходит для первого управляемого прототипа. Нужны обработчик ввода и одно действие, например взаимодействие с дверью. Цель: игрок понимает результат нажатия, а игровой код не зависит от конкретной клавиши.

## Принцип

Разделите физический сигнал, игровое намерение и результат. Клавиша E или кнопка геймпада порождает `interact`. Игровая логика решает, можно ли открыть дверь. Интерфейс сообщает, что произошло. Такой путь проще проверять, чем обработчик клавиши, который сразу двигает дверь, воспроизводит звук и меняет инвентарь.

Система действий позволяет назначать несколько устройств на одно намерение. В Godot эту роль выполняет InputMap; порядок обработки событий также позволяет интерфейсу перехватывать ввод до игрового мира. См. [Using InputEvent](https://docs.godotengine.org/en/stable/tutorials/inputs/inputevent.html).

Для движения обычно важно удержание. Для переключения меню или использования предмета нужен фронт нажатия, то есть переход из состояния «не нажато» в «нажато». Если выполнять переключение каждый кадр удержания, одно нажатие будет многократно открывать и закрывать меню.

<span id="пример-закрытая-дверь"></span>

## Практический пример

### Закрытая дверь

Определим три результата: дверь открылась, нужен ключ, игрок слишком далеко. Логика возвращает результат, а слой представления выбирает подходящий текст, звук или анимацию.

```text
tryInteract(player, door):
    if distance(player, door) > interactRange:
        return outOfRange
    if door.locked and not player.hasKey:
        return needsKey
    door.open = true
    return opened

onActionPressed(interact):
    result = tryInteract(player, selectedDoor)
    presentInteractionResult(result)
```

В учебной сцене разместите две двери: одну рядом, вторую вне радиуса. Сначала проверьте принятие намерения без эффектов, затем добавьте короткую подпись причины отказа. Не запускайте анимацию успешного открытия до решения игровой логики.

Если в сцене несколько дверей, явно определите выбор цели: ближайшая доступная, объект под прицелом или выделенный объект. Покажите выбранную дверь до нажатия. Это помогает отличить ошибку выбора цели от ошибки проверки ключа.

## Частые ошибки

Один и тот же ввод не должен одновременно нажимать кнопку меню и стрелять в мире. Закрытие окна не должно оставлять движение навсегда включённым. При потере фокуса предусмотрите очистку удерживаемых действий: событие отпускания может прийти не туда, где его ожидают.

Не сообщайте об отказе только красным цветом или только тихим звуком. В примере добавьте текст причины и различимое состояние двери. Для часто повторяющегося отказа ограничьте частоту сигналов, иначе каждое удержание превратится в поток звуков.

Не добавляйте буфер ввода автоматически ко всем действиям. Отложенный прыжок иногда помогает управлению, а отложенное подтверждение покупки или выхода может быть неожиданным. Срок жизни намерения должен быть частью правила конкретного действия.

## Проверка результата

- Клавиатура и геймпад вызывают одно игровое действие.
- Удержание кнопки не повторяет одиночное действие каждый кадр.
- Меню получает ввод без одновременного действия в мире.
- После потери и возврата фокуса движение не застревает.
- Причина отказа понятна без различения цвета и без звука.
- Выбранная цель видна до подтверждения.

## Задание для ИИ-агента

> Раздели ввод, проверку взаимодействия и представление результата для двери. Сохрани существующие привязки управления. Определи поведение удержания, интерфейса и потери фокуса. Добавь проверки трёх исходов и объясни, как игрок узнаёт причину отказа. Не добавляй задержку или буферизацию без отдельного правила.

## Связанные материалы

- Перед началом: [Игровой цикл и время](https://gamemechanics.pro/ru/lessons/game-loop/) (key: lesson/game-loop)
- Продолжить изучение: [Состояния и переходы](https://gamemechanics.pro/ru/lessons/state-machines/) (key: lesson/state-machines)
- Продолжить изучение: [Game feel: читаемое действие](https://gamemechanics.pro/ru/lessons/game-feel/) (key: lesson/game-feel)
- Продолжить изучение: [Обучение одной механике через уровень](https://gamemechanics.pro/ru/lessons/teaching-a-mechanic/) (key: lesson/teaching-a-mechanic)
- Продолжить изучение: [Базовая доступность игровой сессии](https://gamemechanics.pro/ru/lessons/game-accessibility/) (key: lesson/game-accessibility)
- Применение принципа: [Прямые голосовые команды](https://gamemechanics.pro/ru/knowledge/mechanic/voice-audio--family-01/) (key: mechanic/voice-audio--family-01)
- Применение принципа: [Способы ввода и выбора действия](https://gamemechanics.pro/ru/knowledge/mechanic/point-and-click--family-43/) (key: mechanic/point-and-click--family-43)
- Учебные маршруты: [Первый проверяемый прототип](https://gamemechanics.pro/ru/learn/first-prototype/) (key: path/first-prototype)
- Продолжить изучение: [Левел-дизайн](https://gamemechanics.pro/ru/learn/level-design/) (key: path/level-design)
- Источники в подборке: [Godot: обработка ввода](https://gamemechanics.pro/ru/resources/#resource-godot-input) (key: resource/godot-input)

## Источники и происхождение

Авторский материал gamemechanics.pro. Учебные примеры требуют проверки в своём проекте.

- [Godot: Using InputEvent](https://docs.godotengine.org/en/stable/tutorials/inputs/inputevent.html) (id: source-663cb05191120f23)

CC-BY-4.0 · gamemechanics.pro contributors
