Exemple #1
0
    /// <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();
    }