분류 전체보기 101

TIL - 101

인벤토리(WBP_InventoryPanel / InventoryPanelWidget) 작업1. 장비 슬롯 버튼 툴팁이 마우스에 붙어 안 사라지던 문제위치: NativeTick()원인: 툴팁 강제 닫기 안전장치가 그리드만 검사 → 슬롯 버튼 호버 중 매 틱 CloseToolTip()이 불려 Slate 상태머신이 꼬임.변경: 조건을 그리드 호버 || 슬롯 버튼 호버 통합으로 확장. 두 영역 어디에도 호버가 없을 때만 CloseToolTip() 호출.Button_SlotHead/Weapon/Chest/Hands_L/Hands_R/Legs/Feet를 IsWidgetOrDescendantHovered로 검사(null 안전).2. 장비 교체 확인 창이 뜰 때 그리드 툴팁 잔상 제거위치: ShowWeaponSwapC..

TIL - 100

Manager_Interactor "Accessed None: OwnerController" 크래시원인OwnerController는 비복제 + 컴포넌트 BeginPlay에서만 캐싱됨.서버→클라 RPC Client_Update_PointOfInterests가 그 BeginPlay보다 먼저 도착하면 None을 읽어 크래시 → 초기화 순서 레이스(코옵/조인·레벨 시작 시).플러그인 버그 아님. 컴포넌트 위치·설정은 정상.수정 (플러그인 미변경)프로젝트 PC ARetrievePlayerController의 PostInitializeComponents(BeginPlay/RPC보다 먼저 실행)에서 리플렉션으로 OwnerController를 미리 세팅해 레이스 창 제거.RetrievePlayerController.h..

TIL - 99

루멘(Lumen) 이슈 정리1. 쉬핑 패키징에서 루멘이 플레이어를 못 따라옴증상: PIE는 정상, 쉬핑 빌드에서 특정 구역에서 거의 못 따라옴 (적 AI도 특정 구역 동일)원인: 레벨 RecastNavMesh의 Runtime Generation이 Static이었음.프로젝트는 bGenerateNavigationOnlyAroundNavigationInvokers=True (플레이어 인보커 주변만 런타임 네비메시 생성) 사용.이 방식은 RuntimeGeneration = Dynamic이어야 동작. Static이면 런타임 생성이 안 돼 네비메시 구멍 → MoveToActor 실패 → 루멘은 2초마다 텔레포트 복구로만 붙음.PIE는 에디터가 네비메시를 항상 갖고 있어 문제가 가려졌던 것.수정: RecastNavM..

TIL - 98

BGM 시스템개요상황에 따라 BGM을 자동 전환하는 시스템. 세션 상태(메뉴/게임/결과), 전투 여부, 지역(존)에 따라트랙을 고르고, 두 오디오 슬롯을 크로스페이드로 전환한다. 각 트랙은 개별 볼륨 배수를 가진다.우선순위: 세션 상태(메뉴/결과) > 지역(존) > 전투 > 기본구성 요소FRetrieveMusicTrack: 사운드(TSoftObjectPtr) + 볼륨 배수(0~2). 전역 설정·존 볼륨 공용.URetrieveMusicSettings (UDeveloperSettings): Project Settings > Retrieve > Retrieve Music.MenuBGM / DefaultBGM / CombatBGM / ResultBGM, CrossfadeDuration, LoopGapSecond..

TIL - 97

BGM 시스템 (기본 / 전투 / 성 지역)개요배경음악을 상황에 따라 자동 전환하는 시스템. 우선순위는 성 지역 > 전투 > 기본이며,두 개의 오디오 슬롯을 크로스페이드해 부드럽게 전환한다.구성 요소URetrieveMusicSettings (UDeveloperSettings): Project Settings에서 기본/전투 BGM 에셋과 크로스페이드 시간 지정.URetrieveMusicSubsystem (UWorldSubsystem): 재생/전환/전투 판정의 중심. 슬롯 A/B 크로스페이드.ARetrieveMusicZoneVolume (AActor + UBoxComponent): 성 구역처럼 특정 영역 전용 BGM을 재생하는 볼륨.동작 규칙성 지역(존): 볼륨 안에 있으면 전투 여부와 무관하게 ZoneBG..

TIL - 96

검방패 사운드 작업 정리0. 한 줄 요약검방패 콤보어택 스윙 사운드를 랜덤 큐 + 몽타주 노티파이로 구현·검증 완료히트음/설정볼륨연동/CastSound/소환액터음은 방식 확정 후 보류 또는 진행 예정.1. 완료된 작업 (monolith로 적용·저장·검증)1-1. 랜덤 Sound Cue 2개 생성 — /Game/Retrieve/Audio/SwordShield/큐구성변조SC_SSH_ComboSwing (스윙)SW_Whoosh_Metal_4-1/2/3/5/7 → RandomPitch 0.91.1, Vol 0.851.0, Randomize Without ReplacementSC_SSH_SwordHit (히트)SW_Sword_Hit_1-1/3/4 + SW_Generic_Hit_1-1/4 → RandomPitch ..

TIL - 95

전투 VFX 작업1. 상태이상 VFX (Burn / Cold)방식: 머티리얼 overlay 틴트 + Niagara 파티클 (GameplayCue 기반)태그: GameplayCue.Status.Burn / GameplayCue.Status.Cold (네이티브, RetrieveGameplayTags)머티리얼: M_StatusOverlay(부모, Unlit·Additive·Fresnel 발광) + MI_StatusBurn / MI_StatusFrostnotify: GCN_Status_Burn/Cold (Looping)OnActive: 타깃 메시에 SetOverlayMaterial + NS 스폰OnRemove: overlay 해제 + 스폰 컴포넌트 정리몸 전체 커버: NS에 Skeletal Mesh Locati..

TIL - 94

GAS에서 지속 데미지(Burn)가 매 틱 피격 리액션을 유발하는 문제증상플레이어가 몬스터에게 Burn(GE_Burn)을 부여하면, 몬스터가 화상 데미지를 받는 매 틱마다 움찔(Flinch) 거리는 현상.원인 분석Burn은 Periodic(주기) 데미지라 틱마다 PostGameplayEffectExecute → BroadcastHitEvent가 호출된다.BroadcastHitEvent는 공격 GE의 asset tag를 읽어 두 개의 이벤트를 발행한다.구분매칭 베이스 태그Burn에서의 값공격자 이벤트GameplayEvent.Attack.HitSuccessGameplayEvent.Attack.HitSuccess.Burn ✅타겟 이벤트GameplayEvent.HitBurn엔 Hit.* 태그가 없어 기본값 Ga..

TIL - 93

전투/UI데미지 플로터가 뜨는 조건 (GAS)데미지 GE가 ExecCalc_BasicHitDamage → IncomingDamage 메타 어트리뷰트를 거쳐야 CombatAttributeSet::BroadcastHitEvent가 Channel.Combat.DamageDealt를 발행한다.BroadcastHitEvent는 GE의 GameplayEvent.Attack.HitSuccess.* 태그를 뽑아 그걸 키로 DT_HitFeedback을 조회(없으면 .Light 폴백). 매칭 행이 없으면 AttackFeedbackComponent가 플로터를 건너뛴다.⇒ 새 공격에 플로터를 띄우려면: 데미지 GE에 HitSuccess.* 태그 + 해당 태그의 DT_HitFeedback 행 추가. 태그를 나누면(버스트 .Bu..

TIL - 92

다중 Row 드랍 & 인벤토리 직접 지급개요적 사망 시 여러 드랍 Row를 각각 확률 굴림하여, 마지막으로 공격한 플레이어의 인벤토리로 직접 지급한다. (아이템 액터 스폰 없음)주요 변경1. 데이터 구조 — RetrieveDataTableTypes.hFEnemyDropRow: ItemTag(FGameplayTag) → ItemId(FName) + ItemCategoryTag(FGameplayTag) (인벤토리 키와 일치)FMonsterDataRow: DropRow(FName) → DropRows(TArray)2. 드랍 처리 — DropComponent.h/.cppInitialize(UDataTable*, const TArray&) — 배열 수신ProcessDrop(): 서버 권한 확인 → 마지막 공격자 ..