Sparta Unreal 부트캠프 74일차

정찬호·2026년 3월 18일

Challenge 분반 복습

콤보 시스템

콤보 시스템은 연속된 입력으로 다단계 공격을 수행하는 시스템입니다.

핵십 요소

요소설명예시
Combo Index현재 콤보 단계1타, 2타, 3타
Combo Window입력 가능한 시간 구간애니메이션 중 특정 구간만 입력 가능
Combo Reset일정 시간 입력 없으면 초기화2초 입력 없으면 1타부터 다시

콤보 시스템은 일종의 리듬게임 특정 시간대에 입력을 주면 지정된 콤보가 나가는 방식
실행되는 콤보와 각 시간 구간은 별도의 Data로 분리해서 협업자들이 편히 수정할 수 있도록 만들어야 한다.

Combo Window를 열고 닫는 것으로 콤보 공격에 대한 입력을 받는 구간을 결정

Montage Section

Montage Section은 Montage를 여러 구간(Section)으로 나눠서 특정 Section부터 재생 가능

굳이 하나의 몽타주에 다 담을 필요는 없지만, 안 담을 이유도 없다

업로드중..

Montage Section 장점

장점설명
하나의 Montage로 관리n개 Montage → 1개 Montage
Section 지정 재생PlayMontage(AM_Combo, "Combo2") → Combo2부터 재생
자연스러운 연결Section 간 Blend Time 자동
Data Table 매칭SectionName으로 Data Table과 연동

태그 부착 및 제거에 Delegate 걸기?

if (ComboWindowTag.IsValid())
{
    ComboWindowTagHandle = CachedASC->RegisterGameplayTagEvent(
        ComboWindowTag,
        EGameplayTagEventType::NewOrRemoved
    ).AddUObject(this, &UComboManagerComponent::HandleComboWindowTagChanged);
}

GasComponent->RegisterGameplayTagEvent

  • 특정 GameplayTag의 “카운트(Count)” 변화를 감시하는 “구독(subscribe)”을 만들고
  • 그 변화가 일어났을 때 호출될 델리게이트(이벤트 콜백)를 등록할 수 있게 해주는 기능입니다.
  • “Delegate를 생성한다”기보다는 ASC 내부의 태그 변경 알림에 ‘리스너를 등록’하고, 그 등록 결과(구독권)를 FDelegateHandle로 받는다라고 이해하는 것이 더 정확하다고 합니다.
    GAS에서 태그는 단순 on/off가 아니라 스택처럼 “몇 번 붙어있는지(Count)”를 갖는 경우가 많아서, “추가/제거”도 결국은 Count 변화로 표현됩니다.

EGameplayTagEventType::NewOrRemoved

  • New: Count가 0 -> 1이 되는 순간 (처음 생김)
  • Removed: Count가 1 -> 0이 되는 순간 (완전히 사라짐)

LogAnimMontage: Warning: JumpToSectionName Combo2 bEndOfSection: 0 failed for Montage AM_ComboAttack

구현 화면

핵심 정리

개념설명
각 콤보 = 다른 Ability블로킹 문제 해결
ComboManagerComponent콤보 상태 관리 & Ability 선택
Combo WindowGameplayTag로 관리
Montage Section하나의 Montage, 여러 공격

과제

랜덤 정답 숫자 고르기 수정

강의에서는 FilterByPredicate를 통해 Number 배열에서 > 0 을 충족하지 못하는 값을 제거했지만 1~9 범위에서는 필요없는 조건이니 제거했습니다.

FMath::RandInit(FDateTime::Now().GetTicks());

  • FDateTime::Now().GetTicks()는 현재 시각을 틱 단위의 큰 정수값으로 가져옵니다.
  • 이 값을 FMath::RandInit(...)에 넣으면, 난수 생성기의 시드(seed, 난수 생성의 출발값)를 현재 시간 기반으로 초기화하게 되면, 이는 GenerateSecretNumber() 호출시마다 랜덤 결과가 달라지게 만듭니다.

FString::Contains(TChar)?

FString.Contains에는 FString만 넣어야 한다.
FString::Contains()는 기본적으로 “문자열(부분 문자열)”을 찾는 함수입니다. 인자로 FString 또는 const TChar*(널 종료 문자열)를 받는 형태가 일반적이라고 합니다.
[]는 상자에서 하나를 꺼내 쓰는 것, Contains는 상자 째로 넘겨서 겹치는 것이 있는 지 찾는 것입니다.

profile
게임 개발 지망생입니다.

0개의 댓글