본문 바로가기

게임프로그래밍/실습1

[언리얼 실습] 50. 사망시 애니메이션 재생하기


목차

  1. 체력이 0이 되면 데스 애니메이션 재생하기

 

1. 체력이 0이 되면 데스 애니메이션 재생하기

 

에너미에 체력이 존재하고 이 체력이 다하면 데스 애니메이션을 재생할 것이다.

 

가장 먼저 캐릭터가 살아있는지 아닌지 여부를 알려주는 함수를 Attribute 클래스에서 만들 것이다.

 

class PRACTICE_API UAttributeComponent : public UActorComponent
{
// 생략

public:
	bool IsAlive();
  
}
bool UAttributeComponent::IsAlive()
{
	return Health > 0.f;
}

 

 

이제 캐릭터의 생존여부를 알 수 있게 되었으니 캐릭터가 Hit를 했을 때 Hit 애니메이션을 재생해야할지 데스 애니메이션을 재생해야할지 구분할 필요가 있다.

 

에너미 클래스에 있는 GetHit_Implementation() 함수를 바꿀 것이다.

 

가장 먼저 재생할 몽타주를 담을 변수와 이를 재생할 함수를 선언하자.

 

UCLASS()
class PRACTICE_API AEnemy : public ACharacter, public IHitInterface
{
	GENERATED_BODY()
    // 생략
    
protected:
	void Die();
    // 생략
    
private:
	UPROPERTY(EditDefaultsOnly, Category = "Montage")
	UAnimMontage* DeathMontage;
    // 생략
    
}
void AEnemy::Die()
{
	UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance();
	if (AnimInstance && DeathMontage)
	{
		const int32 SectionCount = DeathMontage->GetNumSections() - 1;
		const int32 Selection = FMath::RandRange(0, SectionCount);
		const FName SectionName = DeathMontage->GetSectionName(Selection);

		AnimInstance->Montage_Play(DeathMontage);
		AnimInstance->Montage_JumpToSection(SectionName, DeathMontage);
	}
}

 

데스 몽타주에는 여러가지 애니메이션이 있고 그 중 하나를 랜덤으로 재생할 것이다.

 

이 함수를 실행하는 곳은 GetHit 함수이다.

void AEnemy::GetHit_Implementation(const FVector& ImpactPoint)
{
	if (Attributes && Attributes->IsAlive())
	{
		DirectionalHitReact(ImpactPoint);
	}
	else
	{
		Die();
	}
    
    // 생략
}

 

이제 컴파일하고 재생이 되는지 확인해보자.

 

 

 

비록 데스 애니메이션 재생이 끝나면 idle 애니메이션으로 돌아온다는 문제점이 있지만 애니메이션 자체는 재생이 잘 된다.

 

이제 이 죽어있는 상태를 계속 유지할 방법을 알아보자.