본문 바로가기
Unreal Engine5/KDT 2024

[UE5 KDT2024] 17. 애니메이션 몽타주2

by 유잉유잉유잉 2025. 3. 1.
728x90

 

1. 콤보 공격 했을 때 다음 애니 실행되도록 수정해보자

 

1) AnimBase.h 콤보여부 체크 bool 함수 추가 

..
UPROPERTY( VisibleAnywhere, BlueprintReadOnly )
bool mAttackCombo;

 

2) 공격 몽타주 실행중이면 다음 애니 실행하도록 bool값 true 처리 

void UAnimBase::PlayAttackMonatage()
{
	// Montage_IsPlaying() : 현재 인자인 몽타주가 실행되는지 확인
	if ( Montage_IsPlaying( mAttackMontage ) )
		mAttackCombo = true;
	else
	{
		mAttackCombo = false;
		Montage_Play( mAttackMontage );
	}
}

 

▶️ Montage_IsPlaying() : 현재 인자인 몽타주가 실행되는지 확인

 

3) 공격 끝났을 때 몽타주 연결 처리 

void UAnimBase::AnimNotify_AttackEnd()
{
	if ( mAttackCombo )
	{
		if ( !IsValid( mAttackMontage ) )
			return;

		// Montage_GetCurrentSection() : 현재 재생중인 몽타주 섹션 이름을 반환 
		// BPAM_Player~의 경우 Attack0, Attack1, Attack2, Attack3을 얻어옴 
		FName curName = Montage_GetCurrentSection( mAttackMontage );
		if ( curName == NAME_None )
			return;
	
		// GetSectionIndex() : 섹션 이름을 인자로 주면, 몽타주 섹션의 인덱스 반환 
		int32 idx = mAttackMontage->GetSectionIndex( curName );
		int32 nextIdx = idx + 1;

		// GetSectionName() : 인덱스 번호를 인자로 주면, 섹션 이름을 얻어옴 
		FName nextSectionName = mAttackMontage->GetSectionName( nextIdx );

		// 마지막 몽타주 실행
		if ( nextSectionName == NAME_None )
			mAttackCombo = false;
		else
			Montage_JumpToSection( nextSectionName, mAttackMontage );
	}
}

 

▶️ Montage_GetCurrentSection() : 현재 재생중인 몽타주 섹션 이름을 반환

 

▶️ GetSectionIndex() : 섹션 이름을 인자로 주면, 몽타주 섹션의 인덱스 반환 

 

▶️ GetSectionName() : 인덱스 번호를 인자로 주면, 해당 인덱스의 섹션 이름 반환

 

▶️몽타주 작업 중 입력이 안들어간 이유

애니메이션이 진행되는 쓰레드와 메인 쓰레드와 다르다 

그래서 노티파이 호출되는 쓰레드와  애니메이션 쓰레드가 달라서 입력이 안되었음 

-> EndNotiy가 너무 뒤에있으면 씹히나봄

Begin 앞으로 땡기고 End 도 앞으로 땡기니까 된당 타이밍 잡기 어렵.



 

▶️  ~ 파일 has not been loaded by any process. Changes will be ignored.

나오면 Binaries, Intermediate 폴더 제거하고 다시 하면 됨.

참고링크 : https://community.gamedev.tv/t/ue5-error/234576

 

 

▶️ 강사님 다른 방식으로 처리 (섹션 번호를 멤버변수로 저장하고 처리하는 방식) 나는 둘다 잘됨.

몽타주 다음 애니메이션 다른 처리 

AnimBase.h

UPROPERTY( VisibleAnywhere, BlueprintReadOnly )
int32 mSectionIdx;

cpp

void UAnimBase::PlayAttackMonatage()
{
	// Montage_IsPlaying() : 현재 인자인 몽타주가 실행되는지 확인
	if ( Montage_IsPlaying( mAttackMontage ) )
	{
		mAttackCombo = true;

		FName curName = Montage_GetCurrentSection( mAttackMontage );
		int32 curIdx = mAttackMontage->GetSectionIndex( curName );
		if ( curIdx < 0 )
			return;

		mSectionIdx = curIdx + 1;
	}
	else
	{
		mAttackCombo = false;
		Montage_Play( mAttackMontage );
		mSectionIdx = 0;
	}
}

void UAnimBase::AnimNotify_AttackEnd()
{
	if ( mAttackCombo )
	{
		if ( !IsValid( mAttackMontage ) )
			return;

		FName nextName = mAttackMontage->GetSectionName( mSectionIdx );
		if ( nextName == NAME_None )
			return;

		Montage_JumpToSection( nextName, mAttackMontage );
	}
}

 

728x90

댓글