From 8640e29b4ed7acfce8b434e6d90eacd1a93d53ee Mon Sep 17 00:00:00 2001 From: MikolajG Date: Thu, 21 Mar 2024 15:52:59 +0100 Subject: [PATCH] add (not working) ground check --- Cargo.toml | 2 +- shell.nix | 1 + src/charcacter_controller.rs | 42 ++++++++++++++++++++++++++++++++---- src/main.rs | 4 +++- 4 files changed, 43 insertions(+), 6 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 599e44b..8b0fa93 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,6 +15,6 @@ opt-level = 3 [dependencies] -bevy = "0.13.1" +bevy = { version = "0.13.1"} bevy_editor_pls = "0.8.1" bevy_xpbd_3d = {git = "https://git.opencodebox.com/MikolajG/bevy_xpbd", branch = "reflect-serialize"} diff --git a/shell.nix b/shell.nix index 1b853f0..b02745e 100644 --- a/shell.nix +++ b/shell.nix @@ -8,6 +8,7 @@ mkShell rec { pkg-config ]; buildInputs = [ + mold clang # To compile using mold linker udev alsa-lib vulkan-loader xorg.libX11 xorg.libXcursor xorg.libXi xorg.libXrandr # To use the x11 feature libxkbcommon wayland # To use the wayland feature diff --git a/src/charcacter_controller.rs b/src/charcacter_controller.rs index 91990a2..8f35280 100644 --- a/src/charcacter_controller.rs +++ b/src/charcacter_controller.rs @@ -47,6 +47,7 @@ pub struct CharacterController{ pub movement_acceleration: Scalar, pub movement_dampening_factor: Scalar, pub jump_impulse: Scalar, + pub max_slope_angle: Scalar, } impl Default for CharacterController { @@ -55,6 +56,7 @@ impl Default for CharacterController { movement_acceleration: 30.0, movement_dampening_factor: 0.95, jump_impulse: 7.0, + max_slope_angle: (30.0 as Scalar).to_radians(), } } } @@ -64,15 +66,26 @@ pub struct CharacterControllerBundle{ character_controller: CharacterController, rigid_body: RigidBody, collider: Collider, + ground_caster: ShapeCaster, locked_axis: LockedAxes, } impl CharacterControllerBundle { pub fn new(controller_collider: Collider, controller: CharacterController) -> Self { + let mut caster_shape = controller_collider.clone(); + caster_shape.set_scale(Vector::ONE * 0.99, 10); + + Self{ character_controller: controller, rigid_body: RigidBody::Dynamic, collider: controller_collider, + ground_caster: ShapeCaster::new( + caster_shape, + Vector::ZERO, + Quaternion::default(), + Direction3d::NEG_Y, + ), locked_axis: LockedAxes::ROTATION_LOCKED, } } @@ -80,20 +93,41 @@ impl CharacterControllerBundle { impl Default for CharacterControllerBundle { fn default() -> Self { + let collider = Collider::capsule(1.0, 0.5); + let mut caster_shape = collider.clone(); + caster_shape.set_scale(Vector::ONE * 0.99, 10); CharacterControllerBundle{ character_controller: CharacterController::default(), rigid_body: RigidBody::Dynamic, - collider: Collider::capsule(1.0, 0.5), + collider: collider, + ground_caster: ShapeCaster::new( + caster_shape, + Vector::ZERO, + Quaternion::default(), + Direction3d::NEG_Y, + ), locked_axis: LockedAxes::ROTATION_LOCKED, } } } -pub fn update_grounded(mut character_controller_query: Query<&CharacterController>){ +pub fn update_grounded(mut commands: Commands, mut query: Query<(Entity, &CharacterController, &Rotation, &ShapeHits)>){ - for character_controller in character_controller_query.iter_mut() { - + + for (entity, character_controller, rotation, hits) in &mut query { + let is_grounded = hits.iter().any(|hit| { + rotation.rotate(-hit.normal2).angle_between(Vector::Y).abs() <= character_controller.max_slope_angle + }); + + //println!("{}", is_grounded); + + if is_grounded { + commands.entity(entity).insert(Grounded); + } else { + commands.entity(entity).remove::(); + } } + } pub fn keyboard_input(mut movement_event_writer: EventWriter, keyboard_input: Res>){ diff --git a/src/main.rs b/src/main.rs index 39c47bf..6f885ff 100644 --- a/src/main.rs +++ b/src/main.rs @@ -18,13 +18,15 @@ along with this program. If not, see . use bevy::prelude::*; use bevy_xpbd_3d::prelude::*; use bevy_editor_pls::prelude::*; -use charcacter_controller::*; mod charcacter_controller; +use charcacter_controller::*; +use bevy::diagnostic::FrameTimeDiagnosticsPlugin; fn main() { App::new() .add_plugins((DefaultPlugins, PhysicsPlugins::default(), EditorPlugin::default(), CharacterControllerPlugin)) .add_systems(Startup, setup) + .add_plugins(FrameTimeDiagnosticsPlugin::default()) .run(); }