/// <summary> /// Handles vertical movement from gravity and jumping. /// </summary> /// <param name="entity"></param> /// <param name="currPos"></param> /// <param name="currRot"></param> /// <param name="controller"></param> /// <param name="collider"></param> /// <param name="collisionWorld"></param> private void HandleVerticalMovement( ref float3 verticalVelocity, ref Entity entity, ref float3 currPos, ref quaternion currRot, ref CharacterControllerData controller, ref PhysicsCollider collider, ref CollisionWorld collisionWorld, float DeltaTime) { controller.verticalVelocity = verticalVelocity; if (MathUtils.IsZero(verticalVelocity)) { return; } verticalVelocity *= DeltaTime; NativeList <ColliderCastHit> verticalCollisions = PhysicsUtils.ColliderCastAll(collider, currPos, currPos + verticalVelocity, ref collisionWorld, entity, Allocator.Temp); PhysicsUtils.TrimByFilter(ref verticalCollisions, ColliderData, PhysicsCollisionFilters.DynamicWithPhysical); if (verticalCollisions.Length > 0) { RigidTransform transform = new RigidTransform() { pos = currPos + verticalVelocity, rot = currRot }; if (PhysicsUtils.ColliderDistance(out DistanceHit verticalPenetration, collider, 1.0f, transform, ref collisionWorld, entity, PhysicsCollisionFilters.DynamicWithPhysical, null, ColliderData, Allocator.Temp)) { if (verticalPenetration.Distance < -0.01f) { verticalVelocity += (verticalPenetration.SurfaceNormal * verticalPenetration.Distance); if (PhysicsUtils.ColliderCast(out ColliderCastHit adjustedHit, collider, currPos, currPos + verticalVelocity, ref collisionWorld, entity, PhysicsCollisionFilters.DynamicWithPhysical, null, ColliderData, Allocator.Temp)) { verticalVelocity *= adjustedHit.Fraction; } } } } verticalVelocity = MathUtils.ZeroOut(verticalVelocity, 0.0001f); verticalCollisions.Dispose(); }