подсказчик: Как вы можете написать сценарий контроллера от первого лица в GDscript и применить его к узлу KinematicBody при использовании Godot Engine 3.x и что эквивалентно узлу KinematicBody в Godot Engine 4.x и как работает вид от первого лица скрипт контроллера нужно изменить для работы в Godot Engine 4.x?
помощник: В Godot Engine 3.x вы можете написать скрипт контроллера от первого лица в GDscript, создав новый скрипт и прикрепив его к узлу KinematicBody. Вот пример базового скрипта контроллера от первого лица:
```csharp
расширяет KinematicBody

переменная скорость = 5
переменная чувствительность_мыши = 0,1
вар прыжки = ложь
переменная скорость_прыжка = 10
переменная гравитация = -20
переменная высота_прыжка = 1,5
переменная jump_sustain = 0,1

функция _input (событие):
    если событие InputEventMouseMotion:
        вращение_градусы.у -= event.relative.x * чувствительность_мыши
        вращение_градусы.x = зажим(rotation_grades.x + event.relative.y * mouse_sensitivity, -90, 90)
    
    если событие InputEventKey и event.pressed и event.scancode == KEY_W:
        переменная скорость = скорость * Vector3 (0, 0, 1)
        скорость = скорость. вращается (Vector3 (0, 1, 0), -rotation.y)
        move_and_slide (скорость)
        
    если событие InputEventKey и event.pressed и event.scancode == KEY_S:
        переменная скорость = скорость * Vector3 (0, 0, -1)
        скорость = скорость. вращается (Vector3 (0, 1, 0), -rotation.y)
        move_and_slide (скорость)
        
    если событие InputEventKey и event.pressed и event.scancode == KEY_A:
        переменная скорость = скорость * Vector3 (-1, 0, 0)
        скорость = скорость. вращается (Vector3 (0, 1, 0), -rotation.y)
        move_and_slide (скорость)
        
    если событие InputEventKey и event.pressed и event.scancode == KEY_D:
        переменная скорость = скорость * Vector3 (1, 0, 0)
        скорость = скорость. вращается (Vector3 (0, 1, 0), -rotation.y)
        move_and_slide (скорость)
        
    если событие InputEventKey и event.pressed и event.scancode == KEY_SPACE и не прыгает:
        прыжки = правда
        переменная скорость = Vector3 (0, jump_speed, 0)
        move_and_slide (скорость)
        
функция _physics_process(дельта):
    если прыгать:
        скорость var = move_and_slide(Vector3(0, гравитация * дельта, 0))
        если скорость.y < 0:
            прыжки = ложь
```

В Godot Engine 4.x эквивалентом узла KinematicBody является узел CharacterController. Чтобы использовать этот узел, вам нужно будет изменить свой скрипт, чтобы он наследовал от класса CharacterController. Кроме того, обработка ввода и управление движением будут другими, так как узел CharacterController использует другой API. Вот пример того, как скрипт контроллера от первого лица будет выглядеть в Godot Engine 4.x:
```
расширяет CharacterController

переменная скорость = 5
переменная чувствительность_мыши = 0,1
вар прыжки = ложь
переменная скорость_прыжка = 10
переменная гравитация = -20
переменная высота_прыжка = 1,5
переменная jump_sustain = 0,1

функция _input (событие):
    если событие InputEventMouseMotion:
        вращение_градусы.у -= event.relative.x * чувствительность_мыши
        вращение_градусы.x = зажим(rotation_grades.x + event.relative.y * mouse_sensitivity, -90, 90)

    если событие InputEventKey и event.pressed и event.scancode == KEY_W:
        переменная скорость = скорость * Vector3 (0, 0, 1)
        скорость = скорость. вращается (Vector3 (0, 1, 0), -rotation.y)
        двигаться (скорость)
    
    если событие InputEventKey и event.pressed и event.scancode == KEY_S:
        переменная скорость = скорость * Vector3 (0, 0, -1)
        скорость = скорость. вращается (Vector3 (0, 1, 0), -rotation.y)
        двигаться (скорость)
    
    если событие InputEventKey и event.pressed и event.scancode == KEY_A:
        переменная скорость = скорость * Vector3 (-1, 0, 0)
        скорость = скорость. вращается (Vector3 (0, 1, 0), -rotation.y)
        двигаться (скорость)
    
    если событие InputEventKey и event.pressed и event.scancode == KEY_D:
        переменная скорость = скорость * Vector3 (1, 0, 0)
        скорость = скорость. вращается (Vector3 (0, 1, 0), -rotation.y)
        двигаться (скорость)
    
    если событие InputEventKey и event.pressed и event.scancode == KEY_SPACE и не прыгает:
        прыжки = правда
        переменная скорость = Vector3 (0, jump_speed, 0)
        скорость = скорость. вращается (Vector3 (0, 1, 0), -rotation.y)
        двигаться (скорость)
    
функция _physics_process(дельта):
    если прыгать:
        переменная скорость = движение (Vector3 (0, гравитация * дельта, 0))
    если скорость.y < 0:
        прыжки = ложь
```

Примечание. Метод «move» заменяет метод «move_and_slide» из Godot Engine 3.x и использует API CharacterController для управления движением.
подсказчик: Не могли бы вы объяснить функцию _physics_process?
Функция _physics_process — это специальная функция в движке Godot, которая вызывается один раз за кадр, при этом дельта-значение указывает время, прошедшее с момента последнего вызова. Его цель - обрабатывать физические расчеты для объекта в сцене.

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

Затем он проверяет, меньше ли новый компонент y скорости, чем 0. Если это так, он устанавливает для прыжка значение false, что может указывать на то, что объект приземлился на землю после прыжка.
Функция _physics_process выполняется во время такта физики, который работает с фиксированной частотой, отдельной от функции _process, которая запускает каждый кадр.
Некоторые операции можно безопасно выполнять только во время вызова `_physics_process`, например, запрос `PhysicsDirectSpaceState` или `Physics2DDirectSpaceState`.