본문 바로가기

인생언리얼TPS

3.2 플레이어 애니메이션 몽타주를 이용한 공격 처리하기

Animation StaterPack의 Fire_Rifle_IronSights 에셋을 찾아 우클릭후 Create Anim Montage메뉴를 선택합니다. Animation폴더로 이동시켜줍니다.

열어서 Blend In/Out 시간을 0.1로 바꿔줍니다.

ABP_Player로 가 MoveFSM과 OutPose사이를 끊습니다. cache를 검색해 New Save cached pose를 추가합니다.

이름을 MoveFSMCache로 바꿔줍니다 MoveFSM의 카피본입니다. moveFS를 검색해서 Use cached pose를 넣어줍니다.

layerd를 검색해서

Layerd blend per bone을 추가하고 연결해줍니다.

이전에 만든 몽타주를 끌어다 놓고 Blend Poses0에 연결해줍니다.

Slot DefaultSlot을 BlendPosed0에 연결해줍니다. Montage가 실행되면 이 Slot에서 실행되는데 Montage가 없는 경우 Source애니메이션이 실행되게 Used cached pose를 카피해서 연결해줍니다.

 

 

Layerd blend per bone을 선택하고 오른쪽 Detail창의 Branch Filters +를 눌러 Bone Name을 spine_01로 해줍니다. 이건

 Skeleton Tree의 Bone이름으로 허리부분입니다. 애니메이션을 상하로 나누기 위한 기준입니다.

PlayerAnim.h에  몽타지를 받을 레퍼런스변수와 애니메이션을 구현할 함수를 선업합니다.

	UPROPERTY(EditDefaultsOnly, Category = "PlayerAnim")
	class UAnimMontage* attackAnimMontage;
	
public:
//생략
	void PlayAttackAnim();

PlayerAnim.cpp에서 구현해줍니다. 단순히 몬타지를 플레이합니다.

void UPlayerAnim::PlayAttackAnim()
{
	Montage_Play(attackAnimMontage);
}

TPSPlayer.cpp파일에서 InputFire부분에 GetMesh()에서 AnimInstance를 얻어 UPlayerAnim으로 캐스트후  PlayAttackAnim()을 호출합니다.

#include "PlayerAnim.h"
//생략
void ATPSPlayer::InputFire(const FInputActionValue& Value)
{
	//공격 애니메이션 재생
	auto anim = Cast<UPlayerAnim>(GetMesh()->GetAnimInstance());
	anim->PlayAttackAnim();

정장후 빌드후 ABP_Player 블루프린트를 열고 attackAnimMOntage속성을 해당 몬타지로 연결해줍니다.

플레이해보면 어깨가 움찔합니다.

마우스클릭하면 C++이 워낙 빨라 여러번 총을 쏘게 됩니다. Cooltimer로 해결할 수도 있지만. 공격몽타지의 공격 애니메이션이 끝나는 부분에 Notify를 넣어

 

PlayerAnim.h에 isFire변수를 만들고

UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = PlayerAnim)
bool isFire = false;

PlayerAnim.cpp에 isFire=true로 설정하

void UPlayerAnim::PlayAttackAnim()
{
	isFire = true;
	Montage_Play(attackAnimMontage);
}

TPSPlayer.cpp의 InputFire가 중복동작하는걸 방지합니다.

void ATPSPlayer::InputFire(const FInputActionValue& Value)
{

	auto anim = Cast<UPlayerAnim>(GetMesh()->GetAnimInstance());
	if (anim->isFire) {
		return;
	}

ABP_Player 블루프린트 이벤트그래프에서 FireRifleEnd를 검색해 노티파이가 오면 변수를 False로 만들어줘 Fire할수 있게 합니다.