CharacterBody2D/3D di Godot 4 — Panduan Lengkap

1. Pengantar

Godot 4 memperkenalkan perubahan besar pada pergerakan karakter. Node lama KinematicBody2D dan KinematicBody3D diganti namanya menjadi CharacterBody2D dan CharacterBody3D, dan API move_and_slide() dirancang ulang sepenuhnya. Baik kamu bermigrasi dari Godot 3 maupun memulai dari awal — panduan ini membahas semua yang perlu kamu ketahui.

CharacterBody2D dan CharacterBody3D adalah physics body yang dirancang untuk karakter yang dikendalikan lewat kode. Berbeda dengan RigidBody, keduanya tidak bereaksi terhadap gaya secara otomatis — kamu mengendalikan pergerakannya sepenuhnya lewat script. Ini menjadikannya ideal untuk karakter pemain, NPC, dan apa pun yang membutuhkan gerakan yang presisi dan deterministik.

2. Apa yang Berubah dari Godot 3

Berikut adalah perubahan terpenting pada pergerakan karakter antara Godot 3 dan Godot 4:

Wawasan Penting

Di Godot 3, move_and_slide() mengembalikan kecepatan hasilnya. Di Godot 4, ia mengembalikan sebuah bool (apakah terjadi tabrakan), dan kecepatan diperbarui langsung pada properti velocity.

3. Controller Platformer 2D Dasar

Ini adalah controller platformer side-scrolling standar. Karakter dapat bergerak ke kiri/kanan dan melompat saat berada di tanah. Ini adalah template yang dihasilkan Godot ketika kamu membuat script CharacterBody2D baru.

GDScript — platformer_controller.gd
extends CharacterBody2D

const SPEED = 300.0
const JUMP_VELOCITY = -400.0

func _physics_process(delta: float) -> void:
    # Apply gravity when not on floor
    if not is_on_floor():
        velocity += get_gravity() * delta

    # Jump when on floor and jump pressed
    if Input.is_action_just_pressed("ui_accept") and is_on_floor():
        velocity.y = JUMP_VELOCITY

    # Horizontal movement
    var direction := Input.get_axis("ui_left", "ui_right")
    if direction:
        velocity.x = direction * SPEED
    else:
        velocity.x = move_toward(velocity.x, 0, SPEED)

    move_and_slide()

Penjelasan Baris demi Baris

Tips: Struktur Node yang Diperlukan

CharacterBody2D-mu membutuhkan setidaknya satu node anak CollisionShape2D dengan shape yang ditetapkan (mis. RectangleShape2D atau CapsuleShape2D). Tanpa itu, move_and_slide() tidak akan mendeteksi tabrakan apa pun.

4. Controller Top-Down 2D Dasar

Untuk game top-down (RPG, twin-stick shooter, dsb.), kamu bergerak ke keempat arah tanpa gravitasi. Kodenya lebih sederhana daripada platformer.

GDScript — topdown_controller.gd
extends CharacterBody2D

const SPEED = 200.0

func _physics_process(delta: float) -> void:
    var input_direction := Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
    velocity = input_direction * SPEED
    move_and_slide()

Cara Kerjanya

Menambahkan Akselerasi dan Gesekan

Untuk nuansa yang lebih halus dengan akselerasi dan perlambatan:

GDScript — topdown_smooth.gd
extends CharacterBody2D

const SPEED = 200.0
const ACCELERATION = 1200.0
const FRICTION = 1000.0

func _physics_process(delta: float) -> void:
    var input_direction := Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")

    if input_direction != Vector2.ZERO:
        velocity = velocity.move_toward(input_direction * SPEED, ACCELERATION * delta)
    else:
        velocity = velocity.move_toward(Vector2.ZERO, FRICTION * delta)

    move_and_slide()

5. Controller Third-Person 3D

Versi 3D mengikuti pola yang sama. Perbedaan utamanya adalah bekerja dengan Vector3 dan menggunakan transform.basis untuk mengubah input 2D menjadi gerakan di ruang dunia 3D.

GDScript — character_3d.gd
extends CharacterBody3D

const SPEED = 5.0
const JUMP_VELOCITY = 4.5

func _physics_process(delta: float) -> void:
    # Apply gravity
    if not is_on_floor():
        velocity += get_gravity() * delta

    # Jump
    if Input.is_action_just_pressed("ui_accept") and is_on_floor():
        velocity.y = JUMP_VELOCITY

    # Get input and convert to 3D direction
    var input_dir := Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
    var direction := (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()

    if direction:
        velocity.x = direction.x * SPEED
        velocity.z = direction.z * SPEED
    else:
        velocity.x = move_toward(velocity.x, 0, SPEED)
        velocity.z = move_toward(velocity.z, 0, SPEED)

    move_and_slide()

Perbedaan Utama dari 2D

Peringatan: get_gravity() membutuhkan Godot 4.4+

Metode get_gravity() ditambahkan di Godot 4.4. Untuk versi yang lebih lama, gunakan Vector2(0, ProjectSettings.get_setting("physics/2d/default_gravity")) untuk 2D atau Vector3(0, -ProjectSettings.get_setting("physics/3d/default_gravity"), 0) untuk 3D.

6. Referensi Properti Utama

Baik CharacterBody2D maupun CharacterBody3D berbagi properti-properti penting ini. Sesuaikan di Inspector atau lewat kode.

Properti Tipe Default Deskripsi
velocity Vector2 / Vector3 Vector2.ZERO Kecepatan karakter. Setel ini sebelum memanggil move_and_slide(). Setelah pemanggilan, ia diperbarui dengan kecepatan hasilnya.
floor_snap_length float 1.0 Menggantikan move_and_slide_with_snap(). Jarak untuk men-snap karakter ke lantai. Setel ke 0 untuk menonaktifkannya. Berguna untuk kemiringan dan tangga.
up_direction Vector2 / Vector3 Vector2.UP Menentukan arah mana yang dianggap "atas". Ini menentukan apa yang dihitung sebagai lantai, dinding, atau langit-langit. Default-nya adalah (0, -1) di 2D, (0, 1, 0) di 3D.
floor_stop_on_slope bool true Bila true, karakter tidak akan meluncur turun di kemiringan saat diam. Penting untuk platformer.
floor_max_angle float 0.785 (45°) Sudut kemiringan maksimum yang bisa dilalui, dalam radian. Permukaan yang lebih curam dari ini diperlakukan sebagai dinding. Gunakan deg_to_rad(60) untuk menyetel 60 derajat.
max_slides int 6 Jumlah maksimum iterasi tabrakan per pemanggilan move_and_slide(). Nilai lebih tinggi lebih akurat tetapi lebih lambat.
wall_min_slide_angle float 0.262 (15°) Sudut minimum untuk meluncur di dinding. Mencegah karakter tersangkut pada dinding yang nyaris sejajar.
platform_on_leave PlatformOnLeave ADD_VELOCITY Perilaku saat meninggalkan platform yang bergerak. ADD_VELOCITY mempertahankan momentum, ADD_UPWARD_VELOCITY hanya menambahkan komponen ke atas, DO_NOTHING mengabaikan kecepatan platform.
slide_on_ceiling bool true Bila true, meluncur di langit-langit diizinkan. Bila false, kecepatan horizontal dihentikan saat menyentuh langit-langit.

7. Deteksi Tabrakan setelah move_and_slide()

Setelah memanggil move_and_slide(), kamu dapat memeriksa tabrakan yang terjadi. Ini berguna untuk bereaksi terhadap tipe collider tertentu, memainkan efek suara saat mendarat, atau mengimplementasikan mekanik wall-jump.

GDScript — collision_detection.gd
func _physics_process(delta: float) -> void:
    # ... set velocity here ...
    move_and_slide()

    # Check all collisions from this frame
    for i in get_slide_collision_count():
        var collision := get_slide_collision(i)
        var collider := collision.get_collider()
        print("Collided with: ", collider.name)
        print("Normal: ", collision.get_normal())
        print("Position: ", collision.get_position())

    # Practical example: bounce off enemies
    for i in get_slide_collision_count():
        var collision := get_slide_collision(i)
        if collision.get_collider().is_in_group("enemies"):
            velocity = collision.get_normal() * 300
            break

Metode KinematicCollision yang Berguna

8. Contekan Migrasi

Referensi cepat untuk menulis ulang kode Godot 3 ke Godot 4:

Godot 3 Godot 4
KinematicBody2D CharacterBody2D
KinematicBody3D CharacterBody3D
velocity = move_and_slide(velocity, Vector2.UP) velocity = ...
move_and_slide()
move_and_slide_with_snap(vel, snap, up) floor_snap_length = 4.0
move_and_slide()
var vel = move_and_slide(...)
mengembalikan velocity
move_and_slide()
properti velocity diperbarui langsung
var gravity = ProjectSettings.get("physics/2d/default_gravity") get_gravity() (4.4+)
move_and_slide(..., up_direction, ...) up_direction = Vector2.UP (disetel sebagai properti)
move_and_slide(..., stop_on_slope, ...) floor_stop_on_slope = true (disetel sebagai properti)
Konverter Otomatis Godot

Ketika kamu membuka proyek Godot 3 di Godot 4, engine menawarkan untuk mengonversi proyekmu. Ia mengganti nama node dan mencoba memperbarui script, tetapi tidak selalu menangani pemanggilan move_and_slide() dengan benar. Kemungkinan besar kamu perlu memperbaiki kode pergerakanmu secara manual.

9. Kesalahan Umum

Kesalahan 1: Meneruskan argumen ke move_and_slide()

Salah
# ERROR: move_and_slide() takes no arguments in Godot 4
velocity = move_and_slide(velocity, Vector2.UP)
Benar
# Set velocity, then call move_and_slide() with no arguments
velocity.x = direction * SPEED
move_and_slide()

Kesalahan 2: Lupa menyetel velocity sebelum move_and_slide()

Salah — velocity tidak pernah disetel, jadi tidak ada yang bergerak
func _physics_process(delta: float) -> void:
    move_and_slide()  # velocity is Vector2.ZERO — nothing happens

Kesalahan 3: Menggunakan _process() alih-alih _physics_process()

move_and_slide() harus dipanggil di _physics_process(), yang berjalan pada laju tetap (60 Hz secara default). Menggunakan _process() mengaitkan fisika ke framerate render dan menyebabkan perilaku yang tidak konsisten.

Kesalahan 4: Tidak menyiapkan CollisionShape

Sebuah CharacterBody2D/CharacterBody3D tanpa anak CollisionShape akan menembus segalanya. Godot menampilkan ikon peringatan di editor bila collision shape hilang.

Kesalahan 5: Menimpa velocity.y dengan gravitasi di setiap frame

Salah — mereset velocity.y, sehingga lompatan tidak pernah berfungsi
# This overwrites any jump velocity!
velocity.y = gravity * delta  # should be +=, not =
Benar — mengakumulasi gravitasi
# Gravity accumulates over time
velocity += get_gravity() * delta

Kesalahan 6: Menerapkan gravitasi saat berada di tanah

Selalu bungkus gravitasi dengan if not is_on_floor(). Tanpa pemeriksaan ini, gravitasi terus terakumulasi selama berada di tanah. Ketika karakter berjalan turun dari tepi, ia akan jatuh dengan kecepatan ekstrem, alih-alih jatuh secara alami.

10. Menyiapkan Character Controller dengan AI

Ingin AI menyiapkan character controller-mu?

Dengan Godot MCP Pro, asisten AI dapat membuat node CharacterBody, mengonfigurasi properti fisika, menyiapkan collision shape, menulis script pergerakan, menjalankan game-mu, dan menguji pergerakannya — semuanya dari prompt bahasa alami.

add_node setup_physics_body setup_collision set_physics_layers create_script simulate_key play_scene capture_frames
Dapatkan Godot MCP Pro — $15