콤보 구현 분석

CJB_ny·2022년 12월 28일
0

득언리얼

목록 보기
4/12
post-thumbnail

이거 22/12/27에 구현하다가 안되서 오늘 다시 구글링하다가 다른사람들 꺼 한거 보고 뭐가 잘못됬는지 찾음.

이득우 책 코드가 좀 좋긴 좋은듯... 근데 c++잘 모르거나 그러면 많이 힘들듯하다. (c++공부를 계속하자)

일단 https://koreanfoodie.me/883 이곳에서 뭐가 잘못됬는지 찾음.

몽타주 클래스의 노티파이 부분이 뭔가 잘못됬다고 느끼긴했는데 블로그 참고를 해보니 딱 노티파이 부분이 잘못된거 같드라..

위에보면은 NextAttackCheck노티파이가 있는 영역에서 공격 버튼이 눌릴경우 다음 섹션으로... 어쩌구 있는데

책이 옛날 버젼이라 내가 책에있는 말을 이해를 못한듯

그래서 나도

이렇게 수정함.. 이전에는

위의 사진처럼 되어 있었음.

이렇게 NextAttackCheck 노티파이가 뒤에 있으니까 다음 섹션으로 넘어갈 수가 없었던 것이다..

못 넘어가는 이유 분석 ❗❗❗

분석할려면 알고 있어야하는 부분이

  • Delegate
  • Lambda
  • FMath::Clamp
  • 코드 흐름 이해

이정도 되는듯.

내가 처음 써보는 함수는 FMath의 함수들이였다. Clamp나 IsWithinInclusive뭐 이딴 함수...

이것들은 그냥 구글링해서 바로 이해를 하도록 하고 일단,

공격을 하면은 Attack함수가 호출됨.

최초로 공격을 한 경우이니까 else문으로 빠짐.

그러면 AttackStartComboState() 호출을 한다. (여기가 중요함)

호출이 되면은 CanNextCombo는 true(콤보 공격 후릴 수 있는 경우임), IsComboInputOn은 false이다(아직 연속눌림 감지 못했기 때문에)

그리고 현재 CurrentCombo값이 0 ~ 에서 MaxCombo(4) - 1 사이에 있는지 체크후

Clamp함수를 통해서

FMath함수

Clamp함수를 호출을 하는데 위의 글처럼 FMath::Clamp< int32 >(CurrentCombo + 1, 1, MaxCombo); 이니까

최초에는 CurrenCombo값이 0이니까 여기다가 1을 더한 값을 1~4사이에 고정을 하겠다라는 거임.

이게 마침 범위 안에 있으니까 그대로 1을 return하면은 Currentcombo값은 0에서 1로 바뀜.

이후에 몽타주 틀어달라고 부탁하고 섹션도 넘어가는 코드 수행후 IsAttacking = true로 아래처럼 만들어준다.

CanNextcombo = true,
IsComboInputOn = false,
CurrentCombo = 1,
IsAttacking = true


그러면 최초로 우클릭으로 Attack호출했을 때까지가 이까지 임. 그러다 애니매이션 재생이되다가 NextAttackCheck 노티파이가 울리면

아래의 람다가 자동호출될 것임

CanNextCombo는 false로 바뀌고 IsComboInputOn을 체크후에 true라면은 안으로 들어가는데 아직 IsComboInputOn이 false라 못들어감... 그럼 언제들어가냐면..

우클릭 개갈기면 Attack함수의 IsAttacking으로 아래처럼 빠짐

그래서 NextAttack울릴때쯤 우클릭 갈기면 이때 IsComboInputOn이 true로 바뀌어서 람다의 if문에 걸려서

다시 아래 함수 호출해서 CurrentCombo + 1, 1, MaxCombo값 안에 있으니까 CurrentCombo = 2로 바뀌는 것이다.

못넘어가는 이유 찾음 ❗❗❗❗❗

나는 이전에는 첫번째 몽타주 섹션에서 NextAttackCheck가 AttackHit보다 뒤에있었는데

아래 처럼 첫번째 몽타주 섹션에서만 NextAttackCheck를 앞에다가 놓으면 에러없이 콤보 구현 잘된다.

근데 첫번째 섹션 에서 NextAttackCheck를 AttackHit노티파이 뒤에 놔두면 에러난다...

이유는 모르겠음..


모르는 개념은 👍

  • Actor의 생명주기 (함수 호출 순서)

    Actor 생명주기

    게임이 시작될 때 액터는 준비와 게임 참여, 퇴장의 과정을 거친다.
    액터는 여러가지의 컴포넌트(component) 조합으로 이루어질 수 있는데, 이러한 컴포넌트들을 모두 초기화 및 설정하는 과정은 준비 단계에서 이루어진다. 컴포넌트를 설정하기 전에 PreInitializeComponents라는 함수가 호출 되고, 이후에 InitializeComponents 함수가 호출되어 컴포넌트들을 초기화한다. 컴포넌트들의 초기화가 완료되면 PostInitializeComponents 라는 함수가 호출된다.

    위의 준비 단계가 끝나면 액터는 게임에 참여하게 되고, 이때 최초로 1번 BeginPlay 함수가 호출한다. 이후 매 프레임마다 Tick 함수를 호출한다. 만약 액터의 생명 주기가 끝나 게임에서 퇴장당하게 되면 EndPlay 함수가 호출된다.

  • Lambda

    [람다 MSDN])https://learn.microsoft.com/ko-kr/cpp/cpp/lambda-expressions-in-cpp?view=msvc-170)


결과

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글