Skip to main content

gizmo_physics_core/components/
character.rs

1use gizmo_math::Vec3;
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
5pub struct CharacterController {
6    pub speed: f32,
7    pub jump_speed: f32,
8    pub gravity: f32,
9    pub max_slope_angle: f32, // in radians
10    pub slope_slide_speed: f32,
11    pub step_height: f32,
12
13    #[serde(skip)]
14    pub is_grounded: bool,
15
16    pub target_velocity: Vec3, // Desired movement from input
17
18    pub coyote_time: f32,
19    #[serde(skip)]
20    pub coyote_timer: f32,
21
22    pub jump_buffer_time: f32,
23    #[serde(skip)]
24    pub jump_buffer_timer: f32,
25}
26
27impl Default for CharacterController {
28    fn default() -> Self {
29        Self {
30            speed: 5.0,
31            jump_speed: 5.0,
32            gravity: 9.81,
33            max_slope_angle: 45.0_f32.to_radians(),
34            slope_slide_speed: 10.0,
35            step_height: 0.3,
36            is_grounded: false,
37            target_velocity: Vec3::ZERO,
38            coyote_time: 0.1,
39            coyote_timer: 0.0,
40            jump_buffer_time: 0.1,
41            jump_buffer_timer: 0.0,
42        }
43    }
44}
45
46gizmo_core::impl_component!(CharacterController);