General

June 22, 2026 ยท View on GitHub

A simple and complete third person controller asset, made in Godot 4.

preview.png

General

This asset is a heavely modified fork of Gtibo's Godot-Plush-Character project (https://github.com/gtibo/Godot-Plush-Character).

It provides a simple, fully commented, finite state machine based controller, camera, as well as a properties HUD.

A test map is provided to test the controller.

A cute 3D character model made by Gtibo is also provided, fully animated (he use an animation tree powered by a state machine as well), plus movement sounds and particles effects.

The controller use a finite state machine, designed to be easely editable, allowing to easily add, remove and modify behaviours and actions.

Each state has his own script, allowing to easely filter and manage the communication between each state.

He is also very customizable, with all movement parameters, camera settings, and keybindings being exposed as export variables in the inspector for easy customization.

The asset is 100% written in GDScript, with the snake case convention.

Compatibility

  • Godot 4.4 - 4.7: Fully supported.
  • Godot 4.0 - 4.3: Should work, but you will need to delete the .uid files.

Features

Movement

  • Finite state machine based controller
  • Smooth acceleration and deceleration
  • Slope and hill traversal
  • Walking
  • Running (continuous hold or toggle)
  • Jumping (configurable multi-jump)
  • Jump buffering
  • Coyote time
  • Air control (customizable via curves)

Camera

  • Default/Free camera
  • Aim/Shooter/Above shoulder camera (with left and right sides)
  • Camera zoom

Model

  • Model orientation (camera independant, or camera follower)

UI

  • Properties HUD

Misc

  • Input action checker

Purpose

I saw the Godot plush project bu Gtibo about 1,5 weeks, and i told to myself "hey, that would be a great start point for a third person controller !"

And so, here we go !

Installation / Quickstart

Step 1: Add the asset to your project

Download or clone this repository and copy the addons/ folder into your Godot project's root directory.

Step 2(optional): Set up input actions

The controller requires 12 input actions to be defined in your project's Input Map. If they are not binded, the default keybindings will be used. Go to Project > Project Settings > Input Map and create each of the following actions, then bind them to your preferred keys/buttons.

By default, the key actions are defined as "play_char_{action_name}_action". Do not change this name unless you have configured your own key bindings.

To change the keybinds in the scripts, i have set up one that center all the inputs needed, so you won't have to go in differents files each time you want to modify something. The script is called "input_management_component_script", it is located in the player character scene.

Input Action NamePurposeDefault key
play_char_move_forward_actionMove forwardW, Up
play_char_move_backward_actionMove backwardS, Down
play_char_move_left_actionStrafe leftA, Left
play_char_move_right_actionStrafe rightD, Right
play_char_run_actionRun / sprintShift
play_char_jump_actionJumpSpace
play_char_mouse_mode_actionToggle mouse captureCtrl
play_char_aim_cam_actionCamera aimRight mouse button
play_char_aim_cam_side_actionCamera aim sideG
play_char_cam_zoom_in_actionCamera zoom inMouse wheel up, V
play_char_cam_zoom_out_actionCamera zoom outMouse wheel down, B
play_char_change_cam_collision_actionChange camera collision modeT

Step 3(optional): Set up collisions

Collisions masks and layers are already set up in the scenes, but for more clarity you can name them in the "3D Physics" section of your Godot projet settings window, as following :

  • 1 : world
  • 2 : player_character

State machine overview

The controller uses 5 states, each in its own script:

StateDescription
IdleNo movement input. Handles jump buffering and coyote time transitions.
WalkStandard movement at base walk speed.
RunFaster movement. Supports continuous hold or toggle mode.
JumpActive jump with air control.
InAirAirborne without jumping (e.g., walked off an edge). Manages coyote time, jump buffering, and double jumps.

Issues and contributions

  • Bug reports: Open an issue in the Issues section.
  • Feature requests: Post in the Discussions section.
  • Pull requests: Submit improvements in the Pull Requests section.

Credits

Donations

If you like my assets, and want to support my work : https://ko-fi.com/jeheno