![[Unreal Engine C++] 연속 공격의 구현](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAXedO%2FbtsFiogEO3q%2FfzBU8VUsg3lVfQbHinrAtK%2Fimg.png)
[Unreal Engine C++] 연속 공격의 구현UnrealEngine/공부2024. 2. 27. 16:42
Table of Contents
이득우 언리얼 C++을 공부하면서 배운 연속 공격은 왼쪽 마우스 버튼을 연속적으로 입력해야지만 구현이 가능했다.
이를 버튼을 꾹 눌러도 구현되게 수정해보자.
![](https://blog.kakaocdn.net/dn/AXedO/btsFiogEO3q/fzBU8VUsg3lVfQbHinrAtK/img.png)
캐릭터의 몽타주는 다음과 같이 구현되어 있다.
Attack1 ~ Attack3까지 연속적으로 애니메이션이 재생되게 하고, 각 섹션이 시작하기 전에 NextAttackCheck를 하도록 했다.
//TOAnimInstance.cpp
...
void UTOAnimInstance::PlayAttackMontage()
{
Montage_Play(AttackMontage, 1.0);
}
void UTOAnimInstance::StopAttackMontage()
{
Montage_Stop(0.1f, AttackMontage);
}
void UTOAnimInstance::AnimNotify_AttackHitCheck()
{
OnAttackHitCheck.Broadcast();
}
void UTOAnimInstance::AnimNotify_NextAttackCheck()
{
OnNextAttackCheck.Broadcast();
}
...
PlayAttackMontage()와 StopAttackMontage()는 각각 실행하고 종료하는 기능을 담당한다.
애니메이션의 노티파이들은 언리얼에서 자체적으로 AnimNotify_####()으로 자동으로 만들어지기 때문에 이 노티파이가 실행될 때 Broadcast()되도록 하였다.
//TOCharacter.cpp
...
void ATOCharacter::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
...
if (GetWorld()->GetFirstPlayerController()->GetInputKeyTimeDown(EKeys::LeftMouseButton) > 1.0f)
{
IsComboInputOn = true;
}
}
...
void ATOCharacter::PostInitializeComponents()
{
Super::PostInitializeComponents();
// 캐릭터 애니메이션 적용
TOAnim = Cast<UTOAnimInstance>(GetMesh()->GetAnimInstance());
TOAnim->OnMontageEnded.AddDynamic(this, &ATOCharacter::OnAttackMontageEnded);
TOAnim->OnNextAttackCheck.AddLambda([this]() -> void {
if (!IsComboInputOn)
{
TOAnim->StopAttackMontage();
}
else
{
IsComboInputOn = false;
}
});
}
...
void ATOCharacter::Attack()
{
if (IsAttacking)
{
IsComboInputOn = true;
}
else
{
// 애니메이션을 실행한다
TOAnim->PlayAttackMontage();
IsAttacking = true;
}
}
void ATOCharacter::OnAttackMontageEnded(UAnimMontage* Montage, bool bInterrupted)
{
IsAttacking = false;
}
애니메이션 몽타주의 실행 순서는 다음과 같다.
- TOCharacter → Attack()이 처음으로 실행되었을 때, TOAnimInstance → PlayAttackMontage()가 실행된다.
- 몽타주 실행 중 한번 더 TOCharacter → Attack() 입력이 발생하면, IsComboInputOn = true로 바뀐다.
- TOAnimInstance → OnNextAttackCheck 노티파이가 발생하였을 때 IsComboInputOn = true면 계속 재생되고, 그렇지 않으면 TOAnimInstance → StopAttackMontage()가 실행되면서 몽타주가 종료된다.
- 1번이 실행되고 IsAttacking = true가 되었을 때, Tick()함수에서 왼쪽 마우스 클릭이 얼마 동안 지속되고 있는지를 확인한다. (GetWorld()->GetFirstPlayerController()->GetInputKeyTimeDown(EKeys::LeftMouseButton) > 1.0f) 만약 1초동안 지속되었을 경우 IsComboInputOn = true로 설정해준다.
이를 이용하여 왼쪽 마우스를 연속적으로 누르거나, 누르기를 지속하였을 때 연속공격이 되도록 구현하였다.
결과는 다음과 같다.
'UnrealEngine > 공부' 카테고리의 다른 글
[Unreal Engine C++] 현재 레벨 저장 기능의 구현 (0) | 2024.02.27 |
---|---|
[Unreal Engine C++] 특정 위치로의 레벨 텔레포트의 구현 (1) | 2024.02.27 |
[Unreal Engine C++] SaveData의 구현 (0) | 2024.02.27 |
[Unreal Engine C++] Dash의 이펙트 구현 (0) | 2024.02.27 |
[Unreal Engine C++] Dash 구현 (0) | 2024.02.27 |
@NiffJB :: 개발하는 니프
CSE & GAME 개발 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 부탁드립니다!