이번 글에서는 점프에 이어 공격 모션을 추가해볼거다.
공격 모션을 추가하기 전에 Animation Montage 라는걸 먼저 알아보려 한다.
공홈의 정의를 가져오자면,
Animation Montage (애니메이션 몽타주, 혹은 줄여서 그냥 몽타주)는 폭넓은 애니메이션 이펙트가 가능해지는 다목적 툴로써, 주로 코드를 통해서나 블루프린트 비주얼 스크립트 안에서 애니메이션 컨트롤을 노출시키는 데 관련되어 있습니다. 애니메이션의 지능형 루프, 로직 기반 애니메이션 전환, 루트 모션 핸들링, 기타 여러가지 다양한 애니메이션 이펙트를 만드는 데도 사용 가능합니다.
라고 한다. 그냥 나는 특정 타이밍에 특정 애니메이션을 실행시켜주기 위한 모듈? 이라고 생각하고 있다.
이제 만들어 보겠다.
위와 같이 만든 후에 이름을 정해준다.
나는 공격을 만들거기 때문에 Attack으로 만들어 주겠다.
만든 이후 더블클릭하면 애니메이션 추가할 때 보던 그 화면이 나온다.
오른쪽의 Attack Animation 중에 본인이 하고 싶은걸 드래그하여,
왼쪽의 Default 밑에 드랍해주면 Montage가 완성된다.
이후에는 소스를 추가해줘야 한다.
먼저 MyAnimInstance.h에
private:
...
UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category = Attack, Meta = (AllowPrivateAccess = true))
UAnimMontage* AttackMontage;
MyAnimInstance.cpp에
UMyAnimInstance::UMyAnimInstance()
{
CurrentPawnSpeed = 0.0f;
static ConstructorHelpers::FObjectFinder<UAnimMontage> ATTACK_MONTAGE(TEXT("AnimMontage'/Game/BluePrint/AnimationMontage/AM_ShinbiAttack.AM_ShinbiAttack'"));
if (ATTACK_MONTAGE.Succeeded())
{
AttackMontage = ATTACK_MONTAGE.Object;
}
}
헤더에 추가되는 소스는 이제 자주 봐왔으니 익숙해져야 할 것이다. 블루프린트 속성 추가해주는거고,
CPP파일은 자기가 만든 Montage에 마우스 우클릭 -> 레퍼런스 복사 하셔서 경로 추가하시면 되고,
AttackMontage에 레퍼런스 경로의 Montage를 넣겠다 라고 보면 됩니다.
이후 다시 애니메이션 블루프린트로 와서 State Machine과 최종 애니메이션 포즈 사이에
Defaultslot을 추가.
이후 다시 소스로 돌아와,
MyAnimInstance.h에
public:
...
void PlayAttackMontage();
MyAnimInstance.cpp에
void UMyAnimInstance::PlayAttackMontage()
{
Montage_Play(AttackMontage, 1.0f);
}
추가해준다.
이제 PlayAttackMontage()를 실행하면,
우리가 레퍼런스 추가한 Montage가 실행될 것이다.
이제 마우스 좌, 우클릭 했을때 위에서 만든 Montage를 실행하게 해줄거다.
먼저 입력에 마우스 좌, 우클릭 추가.(편집 -> 프로젝트 세팅)
(마우스 우클릭, 좌클릭은 따로 만들어야 각각의 동작을 실행하는게 편하다. 여기는 예시로 같이 만들었는데, 실제로는 따로따로 만들어뒀다.)
이후 다시 소스 작업이다.
MyCharacter.h에 아래와 같이 추가.
public:
...
void Attack();
UFUNCTION()
void OnAttackMontageEnded(UAnimMontage* Montage, bool bInterrupted);
private:
...
bool IsAttacking = false;
UPROPERTY()
class UMyAnimInstance* MyAnim;
MyCharacter.cpp에 아래와 같이 추가.
...
#include "MyAnimInstance.h"
...
void AMyCharacter::BeginPlay()
{
Super::BeginPlay();
MyAnim = Cast<UMyAnimInstance>(GetMesh()->GetAnimInstance());
MyAnim->OnMontageEnded.AddDynamic(this, &AMyCharacter::OnAttackMontageEnded);
}
void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
...
PlayerInputComponent->BindAction(TEXT("Attack"), EInputEvent::IE_Pressed, this, &AMyCharacter::Attack);
}
void AMyCharacter::Attack()
{
if (MyAnim)
{
MyAnim->PlayAttackMontage();
IsAttacking = true;
}
}
void AMyCharacter::OnAttackMontageEnded(UAnimMontage* Montage, bool bInterrupted)
{
IsAttacking = false;
}
MyAnim = Cast<UMyAnimInstance>(GetMesh()->GetAnimInstance());
// 내가 만든 MyAnimInstance를 MyCharacter에서 쓰기 위한 소스
MyAnim->OnMontageEnded.AddDynamic(this, &AMyCharacter::OnAttackMontageEnded);
// Montage 실행이 끝나면 OnAttackMontageEnded을 호출하도록 콜백 등록.
Attack()을 실행하면 내가 등록했던 AttackMontage가 실행되도록 추가한 소스이다.
이제 실행해보면,
마우스 좌, 우클릭에 따른 공격이 되는 것을 확인할 수 있다!
다만 클릭시 마다 계속 공격된다던지, 공격중 이동하면 모션이 이상하다던지 하는 현상이 있지만,
이는 소스를 조금만 수정하면 해결 할 수 있다.
다음 글부터는 본격적으로
몬스터를 추가한 후, 공격 모션에 맞는 피격 모션을 한번 추가해보자.
'언리얼엔진' 카테고리의 다른 글
언리얼 엔진 활용하기 - 8. 이펙트 추가하기 (0) | 2023.02.20 |
---|---|
언리얼 엔진 활용하기 - 7. 피격모션 추가하기 (Collision) (0) | 2023.02.20 |
언리얼 엔진 활용하기 - 5. 캐릭터 애니메이션 추가하기2 점프 추가 (0) | 2023.02.20 |
언리얼 엔진 활용하기 - 4. 캐릭터 애니메이션 추가하기 (0) | 2023.02.11 |
언리얼 엔진 활용하기 - 3. 캐릭터 이동하기 (0) | 2023.02.11 |