기초반 강의

기초반 4강 / 몬스터, 체력, 피격 판정, 이펙트, 애니메이션

jh009 2026. 6. 30. 18:13

폴더 추가로 파일 정리 

파일 옮길 곳
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 몽타주