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.

Download for macOSDownload for Windows

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.9

Verified 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.