From 67a8eb09cd1ddfb76e65fd8e68d1c28eb848cd15 Mon Sep 17 00:00:00 2001 From: Amatsugu Date: Mon, 23 Jun 2025 20:08:05 -0400 Subject: [PATCH] testing --- src/components/character_controller.rs | 3 ++ src/plugins/character_controller.rs | 63 +++++++++++++++++++++----- src/plugins/game.rs | 37 ++++++++++----- src/plugins/player.rs | 22 ++++++++- src/plugins/ship.rs | 2 +- 5 files changed, 102 insertions(+), 25 deletions(-) diff --git a/src/components/character_controller.rs b/src/components/character_controller.rs index 797572f..e457789 100644 --- a/src/components/character_controller.rs +++ b/src/components/character_controller.rs @@ -7,6 +7,7 @@ use bevy::prelude::*; RigidBody, Transform, ExternalForce, + LinearVelocity, GravityScale, CharacterMotion, CharacterRotation @@ -16,6 +17,7 @@ pub struct CharacterController { pub max_slope: f32, height: f32, radius: f32, + pub is_grounded: bool, } impl Default for CharacterController { @@ -25,6 +27,7 @@ impl Default for CharacterController { radius: 0.5, max_slope: 0.5, step_height: 0.25, + is_grounded: false, }; } } diff --git a/src/plugins/character_controller.rs b/src/plugins/character_controller.rs index 308b8af..8b34140 100644 --- a/src/plugins/character_controller.rs +++ b/src/plugins/character_controller.rs @@ -1,14 +1,19 @@ -use avian3d::prelude::{Collider, ExternalForce, GravityScale, LockedAxes, Mass}; +use avian3d::prelude::{ + Collider, ExternalForce, GravityScale, LinearVelocity, LockedAxes, Mass, RayCaster, RayHits, RigidBody, +}; use bevy::prelude::*; -use crate::components::character_controller::{CharacterController, GravityDirection}; +use crate::components::character_controller::{ + CharacterController, CharacterMotion, CharacterRotation, GravityDirection, +}; pub struct CharacterControllerPlugin; impl Plugin for CharacterControllerPlugin { fn build(&self, app: &mut App) { app.add_systems(PreStartup, setup_hooks); - app.add_systems(Update, apply_gravity); + app.add_systems(Update, is_grounded); + app.add_systems(Update, (apply_gravity, apply_forces, apply_motion).chain()); } } @@ -23,24 +28,60 @@ fn setup_hooks(world: &mut World) { let mut commands = world.commands(); let mut entity_commands = commands.entity(ctx.entity); entity_commands.insert(( - LockedAxes::ROTATION_LOCKED, + RigidBody::Kinematic, Collider::capsule(radius, height), ExternalForce::ZERO.with_persistence(false), + RayCaster::new(Vec3::ZERO, Dir3::NEG_Y).with_max_distance(1.0), )); }); } +fn is_grounded(controllers: Query<(&mut CharacterController, &RayHits)>) { + for (mut controller, hits) in controllers { + controller.is_grounded = !hits.is_empty(); + println!("{}", controller.is_grounded); + } +} + fn apply_gravity( - controllers: Query< - (&mut ExternalForce, &GravityScale, &GravityDirection, Option<&Mass>), - With, - >, + controllers: Query<( + &mut ExternalForce, + &GravityScale, + &GravityDirection, + Option<&Mass>, + &CharacterController, + )>, + time: Res