예제 #1
0
void ACharacter::ApplyDamageMomentum(float DamageTaken, FDamageEvent const& DamageEvent, APawn* PawnInstigator, AActor* DamageCauser)
{
    UDamageType const* const DmgTypeCDO = DamageEvent.DamageTypeClass->GetDefaultObject<UDamageType>();
    float const ImpulseScale = DmgTypeCDO->DamageImpulse;

    if ( (ImpulseScale > 3.f) && (CharacterMovement != NULL) )
    {
        FHitResult HitInfo;
        FVector ImpulseDir;
        DamageEvent.GetBestHitInfo(this, PawnInstigator, HitInfo, ImpulseDir);

        FVector Impulse = ImpulseDir * ImpulseScale;
        bool const bMassIndependentImpulse = !DmgTypeCDO->bScaleMomentumByMass;

        // limit Z momentum added if already going up faster than jump (to avoid blowing character way up into the sky)
        {
            FVector MassScaledImpulse = Impulse;
            if(!bMassIndependentImpulse && CharacterMovement->Mass > SMALL_NUMBER)
            {
                MassScaledImpulse = MassScaledImpulse / CharacterMovement->Mass;
            }

            if ( (CharacterMovement->Velocity.Z > GetDefault<UCharacterMovementComponent>(CharacterMovement->GetClass())->JumpZVelocity) && (MassScaledImpulse.Z > 0.f) )
            {
                Impulse.Z *= 0.5f;
            }
        }

        CharacterMovement->AddImpulse(Impulse, bMassIndependentImpulse);
    }
}
예제 #2
0
void ACharacter::ApplyDamageMomentum(float DamageTaken, FDamageEvent const& DamageEvent, APawn* PawnInstigator, AActor* DamageCauser)
{
	UDamageType const* const DmgTypeCDO = DamageEvent.DamageTypeClass->GetDefaultObject<UDamageType>();
	float const ImpulseScale = DmgTypeCDO->DamageImpulse;

	if ( (ImpulseScale > 3.f) && (CharacterMovement != NULL) )
	{
		FHitResult HitInfo;
		FVector ImpulseDir;
		DamageEvent.GetBestHitInfo(this, PawnInstigator, HitInfo, ImpulseDir);

		FVector Impulse = ImpulseDir * ImpulseScale;
		bool const bMassIndependentImpulse = !DmgTypeCDO->bScaleMomentumByMass;
		CharacterMovement->AddMomentum(Impulse, HitInfo.ImpactPoint, bMassIndependentImpulse);
	}
}