2026/06 14

내일배움캠프_Unreal/TIL - Day 146 (260630)

GAS 이벤트 기반 패리 카운터 & 가드공격 Bounds화1. 패리 카운터 - 입력 게이팅에서 이벤트 트리거로문제: 카운터가 "상태 태그 + 재입력"에 묶여 있었음패리 성공 후 카운터를, State.Player.CanCounter 상태를 켜두고 플레이어가 Attack을 다시 눌러야 나가는 방식이었음.성공했는데 한 번 더 입력해야 하고, 그 사이 윈도우를 놓치면 불발.CanCounter 상태 부여/해제와 카운터 윈도우 GE(CounterWindowEffect)까지 관리해야 함 → 상태 머신이 무거움.해결: 패리 성공 순간 게임플레이 이벤트로 카운터 GA를 자동 발동카운터 GA가 특정 이벤트를 수신하면 스스로 발동하도록 트리거를 등록. 입력·상태가 아니라 이벤트가 발동 조건.❌ Before — 상태 태그로 ..

카테고리 없음 2026.06.30

내일배움캠프_Unreal/TIL - Day 145 (260629)

레거시 경로 제거 & 점프어택 임팩트 타이밍 분리1. 코드 안전교체 - 검증 후 레거시를 지운다6/26엔 순수 가산 + opt-in(default 꺼짐) 으로 신규 Bounds 경로를 레거시 소켓 경로 옆에 깔았음. 무회귀가 목적이었음. 데이터로 켜서 검증이 끝났으니, 이제 2단계 = 레거시 경로 삭제.❌ Before — 두 경로 공존 (폴백 분기 + 죽은 코드)if (HitParts.IsEmpty()){ BuildTracePoints(CurrentPoints); // 레거시 소켓 보간 if (CurrentPoints.IsEmpty()) return;}// ... 파트별로 bUseBoundsTrace ? 바운드 : 소켓 폴백 분기✅ After — Bounds 단일 경로if (Hit..

내일배움캠프_Unreal/TIL - Day 144 (260626)

무기 히트판정 — 메시 바운드 자동 트레이스1. 문제: 트레이스 지오메트리가 "소켓 2개 + 행 단일 설정"에 묶여 있었음기존 공격 판정은 무기 메시의 소켓 두 개(start/end)를 보간해 그 선을 구체로 스윕하는 방식이었음. 두 가지 한계가 있었다.소켓 노가다: 무기마다 날 시작/끝 소켓을 수동으로 박아야 함. 메시 바뀌면 다시.메시 1개만 판정: GetWeaponMeshForTrace가 "두 소켓을 다 가진 메시 1개"만 반환 → 검+방패처럼 별도 메시 컴포넌트가 여럿이면 방패는 판정에서 누락.설정이 행(Row) 단위 단일 세트 → 파트별로 다른 트레이스 형상을 줄 수 없음.2. 해결: 메시 바운드에서 트레이스를 자동으로 뽑는다핵심 아이디어로컬 바운딩박스의 최장축을 '날'로 간주한다. 시작·끝·스..

카테고리 없음 2026.06.27

내일배움캠프_Unreal/TIL - Day 143 (260625)

무기 공격 데이터 통합1. 문제: 불필요하게 많은 클래스강공격이 원소/무기별로 별도 클래스로 쪼개져 있었음. 동작은 거의 같은데 파라미터(폭발 반경, 데미지 배율, 런치 속도)만 다른데도 클래스가 계속 늘어남.GA_HeavyAttack_Base ← 공통 로직 ├─ GA_HeavyAttack_Fire ← 광역 폭발 (반경만 다름) ├─ GA_HeavyAttack_Water ← 광역 + 빙결 └─ GA_HeavyAttack_Wind ← 자기 런치GA_StaffHeavyAttack ← 스태프 전용 투사체 (별도 계층)문제는 "데이터 차이"를 "코드 분기"로 표현하고 있었다는 것. 새 원소가 생기면 클래스를 또 만들어야 하고, 공격 파라미터 한 줄 바꾸려고 C++ 빌드를 돌려야 함...

내일배움캠프_Unreal/TIL - Day 142 (260624)

무기 공격 시스템 통합1. 데이터 주도 어빌리티 + 범용 AbilitySet어빌리티가 "무기별 동작"을 들고 있으면 무기 종류만큼 클래스가 늘어남. 데이터를 자산으로 빼면 어빌리티 1개 + 무기별 DataAsset로 끝남.❌ Before — 무기/원소마다 클래스GA_HeavyAttack_Fire / _Water / _Wind / _Staff ... // 무기·원소 조합만큼 증식✅ After — 단일 어빌리티가 현재 원소 variant를 데이터에서 resolveconst FWeaponHeavyAttack* V = WeaponData.AttackDefinition.LoadSynchronous() ->ResolveHeavyVariant(ResolveC..

카테고리 없음 2026.06.24

내일배움캠프_Unreal/TIL - Day 141 (260623)

GAS 어빌리티 비용 처리 & Git LFS 대역폭 절감1. GAS 어빌리티 비용 — "조건(gate)"과 "비용(cost)"은 다르다강공격이 무한 발동되던 원인: CanActivateAbility가 원소 게이지 ≥1칸을 조건으로만 검사하고, 정작 소모도 비용도 없었음. 리팩토링이 게이지 소모(ConsumeOldestSlot)를 잘라냈는데 스태미너 비용을 연결하지 않아 비용이 0이 된 것.# git으로 추적한 "끊긴 지점"git show -- GA_HeavyAttack_Base.cpp- const FGameplayTag ConsumedElement = Gauge->ConsumeOldestSlot(); // 슬롯 1칸 소모(원래)- ExecuteHeavyEffect(ConsumedElement);+ E..

내일배움캠프_Unreal/TIL - Day 140 (260622)

Merge시 자주 발생하는 이슈1. 머지중 놓친 닫는 } → C2601의 원인머지(특히 union/수동 해결)는 닫는 브레이스 하나를 놓칠 수 있음. C++은 함수가 안 닫히면 그 뒤 함수들을 전부 "앞 함수 안의 지역 함수"로 해석 → 엉뚱한 곳에서 에러가 터짐.EnemyCombatComponent.cpp(805): error C2601: 'UEnemyCombatComponent::FindBestPattern': 지역 함수 정의가 잘못되었습니다.... 이후 모든 에러가 'UEnemyCombatComponent::ApplyHitToActor::...' 스코프로 폭발진단법에러가 난 함수(FindBestPattern)가 범인이 아님. 에러 스코프 prefix(ApplyHitToActor::)가 안 닫힌 함..

내일배움캠프_Unreal/TIL - Day 137 (260617)

GE Spec에 전투 태그를 실어 Enemy 패턴 파훼 판정을 일관화하기1. 문제: "이번 타격이 무엇이었나"를 역추적하면 안 됨Enemy 패턴 파훼(counter)는 *"정해진 원소 + 공격 타입으로 때렸는가"* 를 판정해야 함.처음엔 Enemy가 플레이어의 현재 ASC 태그 / PlayerState를 조회해서 원소·공격타입을 추정하려 했음.→ 부정확함. 피격 결과가 아니라 현재 상태를 보기 때문임.❌ 역추적 방식 (현재 상태 조회)// Enemy 쪽에서 플레이어를 거꾸로 들여다봄FGameplayTag Element = Player->GetCurrentElementTag(); // 명중 시점 상태일 뿐투사체: 발사 시점과 명중 시점의 원소가 다를 수 있음지연 타격/장판: 실행 중인 Ability ≠ 실..

내일배움캠프_Unreal/TIL - Day 135 (260615)

Staff 신규무기 전투 구현 1. Family 태그로 stuck-active 해소공격 변형(콤보/스프린트/점프/카운터)이 각자 형제(sibling) 태그라, 다른 어빌리티의 `Cancel/BlockAbilitiesWithTag`가 부모 하나(`Ability.Player.Attack`)만 나열하면 변형들이 누락됨 → 변형 공격이 안 끊겨 active로 남는 stuck-active 버그.해결: 공통 family 태그를 AssetTags에 가산(식별 태그는 유지). Cancel/Block은 family만 참조함.// 각 공격 어빌리티 생성자 — 식별 태그 + family 병기FGameplayTagContainer Tags;Tags.AddTag(Ability_Player_Attack); // 식별(기존 B..

내일배움캠프_Unreal/TIL - Day 133 (260611)

어빌리티 상호배제·타이밍 함정·데미지 축 설계1. BlockAbilitiesWithTag ≠ 취소 (Block vs Cancel)GAS 어빌리티가 발동될 때 다른 어빌리티에 주는 영향은 두 컨테이너로 나뉜다. 컨테이너 동작 `BlockAbilitiesWithTag`해당 태그 어빌리티의 신규 발동만 차단 (이미 활성인 건 그대로 둠)`CancelAbilitiesWithTag`해당 태그 어빌리티를 즉시 취소❌ 카운터 발동 시 가드를 끝내려 `BlockAbilitiesWithTag(Guard)`만 넣음 → 가드는 계속 활성, GuardMontage가 카운터 몽타주와 충돌✅ `CancelAbilitiesWithTag(Guard)` 추가 → 가드가 실제로 취소되며 `bStopWhenAbilityEnds` 몽타주가..