폴더 추가로 파일 정리
| 파일 | 옮길 곳 |
| PlayerCharacter.h / .cpp | Characters/Player/ |
| PlayerInputConfigDataAsset.h / .cpp | Input/ |
| WeaponDataAsset.h / .cpp | Weapons/ |

PlayerCharacter.h / .cpp

PlayerInputConfigDataAsset.h / .cpp

WeaponDataAsset.h / .cpp

include 경로 수정
PlayerCharacter.h / .cpp


PlayerInputConfigDataAsset.cpp

WeaponDataAsset.cpp

#include "PlayerCharacter.generated.h" → 폴더가 바뀌어도 항상 파일명
UHT가 알아서 처리하니 그대로 두기 (헤더 맨 마지막 include 위치도 그대로)
프로젝트 파일 재생성, 리빌드
Generate Visual Studio project files (Rider 솔루션이 새 폴더 구조를 인식)
이후 빌드

BP가 안 깨지는 이유?
- BP가 참조하는 것은 C++ 클래스 자체임 (파일 경로 X)
- .h/.cpp를 폴더만 옮기는 건 BP 참조를 안 깨짐
1. 체력 시스템 UHealthComponent
1-1. UHealthComponent C++ 클래스
New C++ Class → ActorComponent → 이름 설정 HealthComponent
Components 파일 추가 (Public 폴더에만 생성해도 Private도 자동으로 생성됨)
경로에 Components 추가 → Create Class


Public/Components/HealthComponent.h

Private/Components/HealthComponent.cpp

1-2. 플레이어 HealthComp 붙이기
Characters/Player/PlayerCharacter.h

Characters/Player/PlayerCharacter.cpp

build or livecoding → BP_PlayerCharacter → HealthComponet 확인

2. 몬스터 만들기 AMonster
2-1. AMonster C++ 클래스
New C++ Class → Character → 이름 설정 Monster
Monsters 파일 추가 후, 경로에 Characters/Monsters 추가 → Create Class


Public/Characters/Monsters/Monster.h

Private/Characters/Monsters/Monster.cpp


2-2. BP_Monster 만들고 레벨에 배치
Content/Characters/Monsters/ 폴더 생성
Blueprint Class → All Classes → Monster → 이름 설정 BP_Monster


Components → Mesh 선택 후
Material 슬롯 → 빨간 계열 머티리얼 할당 (적 구분용)

PIE 테스트 (몬스터가 제자리에 서 있으면 성공)

3. 몬스터 피격 처리 UMonsterAnim + UMonsterAI
피격 흐름
- UMonsterAnim (AnimInstance) : 몬스터 AnimBP를 구동 + 몽타주 재생 브리지
- UMonsterAI (컴포넌트) : 맞았다는 신호를 받아 살았나/죽었나 판단하고 몽타주를 시킴
3-1. UMonsterAnim
New C++ Class → AnimInstance → 이름 설정 MonsterAnim
Animation 파일 추가 후, 경로에 Animation 추가 → Create Class


Public/Animation/MonsterAnim.h

.cpp는 자동 생성된 그대로 두기 (브리지 함수는 BP에서 구현 → C++ 본문 없음)
3-2. UMonsterAI
New C++ Class → ActorComponent → 이름 설정 MonsterAI
AI 파일 추가 후, 경로에 AI 추가 → Create Class


Public/AI/MonsterAI.h

Private/AI/MonsterAI.cpp


3-3. AMonster → MonsterAI 붙이기
Monster.h

Monster.cpp

BP_Monster → MonsterAI 확인

3-4. 몬스터 AnimBP + 피격/사망 몽타주
idle로 서 있기 / 피격 시 반응 / 죽으면 쓰러짐
몽타주 2개 만들기
Content/Characters/Monsters/Animations/
이름 설정 AM_Monster_Hit , AM_Monster_Death




AM_Monster_Hit
이름 설정 HitReact0

빨간색 테두리로 표시된 부분을 클릭하면 갈색 표시가 나옴

그 상태로 밑에서 우클릭 → New Montage Section → 이름 설정 HitReact0


AM_Monster_Death

- AM_Monster_Hit → 두 애니를 이어 넣고 각각 HitReact0 / HitReact1 섹션으로 자르기
- 각 섹션의 다음(Next)을 비워두면 한 구간만 재생하고 멈춤(다음 섹션으로 안 넘어감)
- 코드의 JumpToSection 이름과 섹션 이름이 정확히 일치해야 함
ABP_Monster 만들기
Animation → Animation Blueprint
Parent Class = MonsterAnim, Skeleton = UE4_Mannequin_Skeleton 선택
이름 설정 ABP_Monster


ABP_Monster - AnimGraph


ABP_Monster - Event Graph
VARIABLES
AM_Monster_Hit / AM_Monster_Death 추가
Object Types → Anim Montage

부모클래스 꼭 확인하기


BP_Monster에 연결
BP_Monster → Details → Anim Class에서 ABP_Monster 선택

4. 발사 → 몬스터 데미지 연결
PlayerCharacter.cpp

if (bHit && Hit.GetActor()) 부분 수정

BP_Monster 캡슐 컴포넌트에 Collision 설정 문제로 피격이 되지 않음
사진과 같이 collision 설정 (Visibility → Block)

몬스터 사망 시 바닥으로 내려가는 현상 수정
AM_Monster_Hit
Hit0 → Hit1 연결을 끊기


AM_Monster_Death → Enable Auto Blend Out 체크해제

5. 이펙트 / 총구 머즐 플래시 + 임팩트
5-1. Niagara 모듈 추가
Source/TPSWaveShooter/TPSWaveShooter.Build.cs
의존성 목록에 "Niagara" 추가

5-2. 머즐 컴포넌트 + 임팩트 슬롯
PlayerCharacter.h

PlayerCharacter.cpp

생성자 - EquippedWeaponMesh



5-3. 무료 이펙트 팩 다운로드
| 용도 | 에셋 | Fab |
| 머즐 (Niagara) | NS_MuzzleFlash | Muzzle Flash (Niagara System) |
| 임팩트 (Cascade) | P_Sparks / P_Explosion 또는 P_ky_hit1 / P_ky_shotShockwave |
Realistic Starter VFX Pack Vol 2 |
Content/External/로 이동 → 그 뒤 폴더 우클릭 → Update Redirector References

5-4. BP에서 이펙트 에셋 할당 + 소켓 확인
BP_PlayerCharacter → Components → MuzzleComp 선택

Details → Niagara → System Asset 머즐 플래시 Niagara 할당

무기 메시에 Muzzle 소켓이 없는 경우
스켈레톤 트리에서 총구 끝 본 우클릭 → Add Socket → 이름 설정 Muzzle (총구 끝으로 위치 조정)
무기 3종의 Muzzle 이름을 동일하게 만들면 코드 수정 없이 전부 동작


5-5. PIE - 발사 연출
Muzzle Effect 방향을 맞추기
Muzzle 위치 -90, 0, 0 수정

수정 전

무기 3종 수정 후



6. 플레이어 애니메이션 몽타주
6-1. UPlayerAnimInstance
New C++ Class → AnimInstance → 이름 설정 PlayerAnimInstance
경로에 Animation 추가 → Create Class


Private/Animation/PlayerAnimInstance.h

Private/Animation/PlayerAnimInstance.cpp

이동 값(H/V Direction)을 지금 미리 채워두는 이유
- 5강에서 걷기 BlendSpace를 만들 때 바로 꺼내 쓰기 위함
- 4강에선 몽타주만 쓰지만 발판은 깔아둠
6-2. 플레이어 몽타주 브리지 + 피격 함수 + 테스트 키
PlayerCharacter.h

PlayerCharacter.cpp



FireGun() 맨 위(저격 분기)에서 발사 몽타주 호출 추가

테스트 입력 연결
Content/Input/Actions/ → IA_TestDamage, IA_TestDeath (Digital) 생성

IMC_PlayerInputMapping
- K → IA_TestDamage
- L → IA_TestDeath
PlayerInputConfigDataAsset.h
TestDamageAction, TestDeathAction 슬롯 추가 → 빌드 → DA_PlayerInputConfig에서 IA 할당

PlayerCharacter.cpp
SetupPlayerInputComponent 바인딩

빌드 후
DA_PlayerInputConfig에 Damage, Death 설정

6-3. ABP_Player + 몽타주
Content/Characters/Player/Animations/

| 몽타주 | 만드는 법 | 섹션 |
| AM_Player_Fire | AnimStarterPack Fire_Rifle_Ironsights | (단일 — 섹션 불필요) |
| AM_Player_Hit | 피격 리액션 애니 2개로 | HitReact0, HitReact1 |
| AM_Player_Death | Death 애니로 | DeathStart |

AM_Player_Fire

AM_Player_Hit

AM_Player_Death

Enable Auto Blend Out 체크해제

ABP_Player 생성
Animation Blueprint → Parent = PlayerAnimInstance, Skeleton = UE4 마네킹 → 이름 설정 ABP_Player

AnimGraph

EventGraph

Event Play Fire Montage → Montage Play (AM_Player_Fire)

Event Play Damage Montage (SectionName) → Montage Play (AM_Player_Hit) → Jump To Section (SectionName)

Event Play Death Montage (SectionName) → Montage Play (AM_Player_Death)

EventGraph → Details 에서 Default 설정

BP_PlayerCharacter 연결
Mesh → Details → Anim Class = ABP_Player

최종 PIE 테스트
이동 / 점프 / 무기 전환 / 발사
발사 : 총구 머즐 플래시 + 발사 몽타주, 맞은 곳 임팩트 이펙트
몬스터 사냥 : 몬스터를 쏘면 HitReact로 흠칫 → 3방에 DeathStart로 쓰러짐 → 4초 뒤 시체 소멸
플레이어 피격/사망 (테스트) : K 누르면 HitReact 몽타주, L 누르면 Death 몽타주
'기초반 강의' 카테고리의 다른 글
| 기초반 5강 / 캐릭터 애니메이션 수정, 상태머신을 사용한 점프 구현 (0) | 2026.07.11 |
|---|---|
| 기초반 3강 / 컨트롤러, 총기 구현 (0) | 2026.06.23 |
| 기초반 2강 / 캐릭터 만들기, 움직여보기 (0) | 2026.06.16 |
| 기초반 1강 / OT & 프로젝트 세팅 (0) | 2026.06.09 |