KinematicBody in Godot 4: it is CharacterBody3D now
By Eduardo Orellana · Updated
KinematicBody is called CharacterBody3D in Godot 4, and move_and_slide() now moves the body by its velocity property instead of taking arguments. In a Godot 4 project, extends KinematicBody fails to parse with Could not find base class "KinematicBody".
AppImage, x86_64. Ubuntu 22.04, Debian 12, Fedora 39 or newer.
Intel or AMD Chromebook, with Linux turned on.
What Godot is checking
GDScript resolves the class after extends when the script loads. KinematicBody is not a class in Godot 4, so the script fails to parse and nothing in it runs.
The converter carries KinematicBody to CharacterBody3D. move_and_slide(velocity, Vector3.UP) becomes: set velocity, set up_direction once, then call move_and_slide() with no arguments. is_on_floor() still reports the ground after the call.
More on this: The best AI for GDScript: what good output looks like
Reproduce it
A Godot 3 script that extends KinematicBody, in a Godot 4 project. The scene is one Node carrying it.
extends KinematicBody
func _ready():
print("ready")
What Godot 4.7.2 prints
Godot Engine v4.7.2.stable.mono.official.ed1daf0bf - https://godotengine.org
SCRIPT ERROR: Parse Error: Could not find base class "KinematicBody".
at: GDScript::reload (res://answers/kinematicbody-in-godot-4/repro.gd:1)
ERROR: Failed to load script "res://answers/kinematicbody-in-godot-4/repro.gd" with error "Parse error".
at: load (modules/gdscript/gdscript_resource_format.cpp:46)Fix it
A CharacterBody3D falling with gravity, moved by its velocity property.
extends CharacterBody3D
var frames := 0
func _physics_process(delta: float) -> void:
velocity.y -= 9.8 * delta
move_and_slide()
frames += 1
if frames == 30:
print(get_class(), " fell to y ", snappedf(position.y, 0.01), ", velocity ", snappedf(velocity.y, 0.01))
set_physics_process(false)
What the fixed script prints
Godot Engine v4.7.2.stable.mono.official.ed1daf0bf - https://godotengine.org
CharacterBody3D fell to y -1.27, velocity -4.9Verified on Godot 4.7.2
Both scripts on this page were run headless on Godot 4.7.2 (4.7.2.stable.mono.official.ed1daf0bf) on 18 October 2026, and the output above is what Godot printed, unedited.
Where the check lives in Godot's source: [renames_map_3_to_4.cpp line 1533, KinematicBody to CharacterBody3D](https://github.com/godotengine/godot/blob/4.7.2-stable/editor/project_upgrade/renames_map_3_to_4.cpp#L1533), [CharacterBody3D class reference](https://github.com/godotengine/godot/blob/4.7.2-stable/doc/classes/CharacterBody3D.xml).
Questions
- Where did the up direction argument go?
- It is the up_direction property, Vector3.UP by default, so most games never set it.
- How do I stop sliding down slopes?
- floor_stop_on_slope is a property now, on by default.
Related
- KinematicBody2D in Godot 4: it is CharacterBody2D now
- Spatial in Godot 4: it is Node3D now, and translation is position
- Every verified Godot 4 answer
- How to get collisions after move_and_slide() in Godot 4
- Function "…()" not found in base self in Godot 4
- Reference in Godot 4: it is RefCounted now
- The best AI for GDScript: what good output looks like
- Path in Godot 4: it is Path3D now
Flockbay's agent reads Godot's debugger output and fixes errors like this one in your project, on the official Godot.
Download Flockbay free