Project-Kungeon / JK2

0 stars 0 forks source link

[Logic Error] ComboAction 을 Blueprint->Cpp 로 리팩토링하는 과정에서 ensure condition failed이 뜨는 현상 #13

Closed eric1306 closed 8 months ago

eric1306 commented 8 months ago

image

LogOutputDevice: Error: === Handled ensure: === LogOutputDevice: Error: Ensure condition failed: CurrentCombo != 0 [File:D:\UEGIT\JK2\Source\JK2\Character\PC\Warrior\JK2Warrior.cpp] [Line: 157]

특이사항

폰과 상호작용이 없을때는 오류가 일어나지 않지만 (일어날 수도 있습니다. 테스트 케이스가 적습니다.) 임의의 액터 (ex) Shapes->Cube) 생성한 후 플레이를 하면 화면이 멈추며 해당 문구가 나옵니다.

유니티 식으로 생각하면 Coroutine으로 함수를 제작해서 waitforsecond를 montage play time 만큼 주면 오류가 해결되지 않을까 라고 생각이 들지만 언리얼엔진 방식으로는 어떻게 해결을 해야하는지 잘 생각이 안나네요.


ensure(CurrentCount!=0) 문구를 주석처리 한다면 해당 오류는 발생하지 않습니다. 로직문제입니다.

peace0096 commented 8 months ago
void AJK2Warrior::Attack()
{
    if ( IsAttacking )
    {
        SaveAttacking = true;
    }
    else
    {
        IsAttacking = true;
        DoCombo();
    }
}

void AJK2Warrior::ComboActionBegin()
{

    if ( SaveAttacking )
    {
        SaveAttacking = false;
        DoCombo();
    }
    if ( CurrentCombo == 4 )
    {
        ComboActionEnd();
    }
}

void AJK2Warrior::DoCombo()
{
    switch ( CurrentCombo )
    {
    case 0:
        CurrentCombo = 1;
        PlayAnimMontage(ComboActionMontage1);
        break;
    case 1:
        CurrentCombo = 2;
        PlayAnimMontage(ComboActionMontage2);
        break;
    case 2:
        CurrentCombo = 3;
        PlayAnimMontage(ComboActionMontage3);
        break;
    case 3:
        CurrentCombo = 4;
        break;
    }
}

void AJK2Warrior::ComboActionEnd()
{
    //ensure(CurrentCombo != 0);
    CurrentCombo = 0;
    SaveAttacking = false;
    IsAttacking = false;
}

해당 로직에 대해선 잘못된 것은 보이지 않지만, 다만 걸리는 것이 다음 부분입니다.

JK2Warrior.h

        //ComboAction
    UFUNCTION(BlueprintCallable)
    void ComboActionBegin();
    UFUNCTION(BlueprintCallable)
    void DoCombo();
    UFUNCTION(BlueprintCallable)
    void ComboActionEnd();

ComboActionEnd() 함수도 블루프린트 Callable로 선언되어있는데, 블루프린트 그래프 어딘가에서 호출이 되고 있는 것이 아닌가하는 생각입니다. 스킬콤보를 블루프린트 클래스에서 C++ 클래스로 이전하는 작업 중이시라 이부분 한번 체크부탁드립니다.

eric1306 commented 8 months ago

해당 문제 해결 됐습니다.

문제 원인


Animation Blueprint상에서 Notify를 통해서 SavedAttack과 ResetCombo를 호출합니다. 그런데 CPP코드 상으로 CurrentCombo의 값이 4와 같아지면 ResetCombo 함수를 호출합니다.

3번 콤보 재생 시 CurrentCombo가 4가 되면서 ResetCombo가 호출됩니다.

그런데 우연히 타이밍이 맞아 Notify에 의해 ResetCombo가 호출되면서 콤보 관련 변수 초기화 함수가 두번 호출되는 로직 에러가 있었습니다.

해결


CPP 코드 상에서 ResetCombo 호출을 삭제했습니다. 이후 CurrentCombo가 4가 되는경우를 아예 제외 시켜도 공격 매커니즘이 정상적으로 작동했기 때문에 불필요한 코드이기 때문에 코드를 삭제하였습니다.

feature/Warrior 브랜치의 내용을 디폴트로 받는 hotfix/ComboAttackEnsureConflictError 브랜치에 해당 수정 내용 푸쉬 하겠습니다.