애니매이션
애님그래프 열어
애니메이션 몽타주라는게 있음 -> 피격처리할때 좋음
애니매이션 무시하고 피격해야될때있음 그때 사용
애니매이션 몽타주란?
애니매이션 제어할 수 있게 설계 되어있다
특별상황에서 로직에서 제어할때도 있음, 그때는 애니매이션쪽 무시하고 피격 재생하게
로직에서 애니메이션 제어할 수 있는 좋은거임
사용해서 구현할거

여기서는 뼈대 정보가 이미 설정되어있어서 여기서 몽타주 선택하면 뼈대정보 가져옴


상하체 분리해서 슬롯으로 할수도있음
애님 그래프로 돌아와서 몽타주 연결할거임
DefaultSlot 을 추가해서 연결
로직에서 몽타주 재생하라고 하면 앞의 애니메이션 무시함, 평소에는 무시되어 stateMachine 에서 output 으로 바로 감
어떤 몽타주를 쓸지는 defaultslot 클릭하여 설정가능

이제 몽타주 재생처리 해야함
입력을 해줘야함

IA_Attack 으로 추가함

키보드로 입력처리하는거라 Digital(bool) 그대로 두고 실제 키하고 매핑함
IMC_Game에서 맵핑함

그리고 BP_MainCharacter에서 EventGraph 공격 입력처리함


OnAttack 생성 (입력은 추가하는데 출력이 없는 함수임)
커스텀 이벤트는 자동 호출이 되지 않고 직접 호출해야함

입력이되면 Event를 불러옴
몽타주를 연결하자
play anim montage 함수 가져옴
매시 컴포넌트를 가져옴
컴포넌트를 변수처럼 사용가능
애니매이션 몽타주는 애니메이션하고 연관있음, 그래서 애니메이션 관리하는 객체 가져와야함

애님클래스 지정했었음 (타입 지정)
이 타입을 기반으로 인스턴스 만듬 (실제 객체 만듬)
매시에서 애니메이션을 관리하고 있는 객체는 애님 인스턴스임 Get Anim Instance 추가 후 montage play 추가

몽타주 지정함
이벤트가 들어오면 몽타주 실행하게 댐
여기까지만 하면 공격을 연타할때마다 초기 공격 모션을 진행
캐릭터 상태관리 위해서 열거형 추가 (E_CharacterState)
추가 후 BP_MainCharacter 의 Variables 에 변수 추가한다.

E_CharacterState 에는 아래 3개 추가


열거형 추가하면 전에 추가한 변수의 details에 이렇게 나옴
처음 Default 값을 Locomotion으로 변경해줘야함, 이후에 할 동작에 영
공격할 때 몽타주 재생을 요청함, 아무때나 요청하지 않고 현재 상태보고 공격 모션 재생할지 판단
값을 분기할 수 있는 switch를 추가함
Locomotion 일때만 재생하도록 했음, 그리고 set Attack으로 공격상태로 바꿈

Attack으로 상태값 바꿔서 공격이 끝나면 상태값을 Locomotion으로 바꿔주어야 계속 공격할 수 있음
AM_Attack 의 애니메이션에서 시간길이 확인 (1초에 30장 재생, key가 45개니까 1.5초가 걸림)


이렇게 처리하는 방법이 있음, 근데 로직이 복잡해질 수 있어서 이 방법을 택하진 않을것임
Notifies 에서 add Notifies 로 AttackEnd 를 추가, 몽타주 실행하다가 AttackEnd라고 알려줌

이벤트는 로직에서 처리 ABP_MainCharacter
notify에서 추가한 attackEnd 를 추가
마우스 클릭이 발생되면 OnAttack 이 실행되고 몽타주 재생하고 애니메이션 시스템한테 요청한다.
그 신호 받아서 애니메이션 시스템이 몽타주 재생, 그리고 AttackEnd 발행하고, 그걸 받는 시스템이 애니메이션 시스템이 받음
캐릭터 -> 몽타주재생요청->애니매이션시스템 재생->이벤트발생->애니메이션시스템 받음->캐릭터한테 공격 끝났다고 알려줌
이러한 로직
애니메이션이 받으면 메인 캐릭터한테 알려줘야함

끌어와서 Convert to Validated Get 으로 함

Main Character 를 변수로 읽음, 포인터 변수임, 포인터변수는 null check가 필수
유효성 체크 - 'null'과 삭제 요청했을때 삭제 요청 액터인지도 확인 2가지를 확인함
(언리얼에서 객체 유효성 어떻게 확인하나 확인해보기) (객체지향의 핵심이 뭐냐) - 0917 2교시 20분후반
애니메이션이 캐릭터에게 알려줘야함, 요청은 대화임, 캐릭터한테 알려주려면 캐릭터는 뭘 가지고 있어야할까
-> 함수가 필요함, 중개된 함수, 그래야 다른 객체도 접근이 가능하니까, 메시지를 주고받음 이게 공개된 함수-> 인터페이스
다시 BP_MainCharacter로 가서

Custom Event(함수)를 추가해서 OnAttackEnd로 수정
다시 ABP_MainCharacter로 가서 추가한 OnAttackEnd를 생성

--
Notify를 객체로 만들 수 있음

AnimNotify_AttackEnd 생성해서

AM_Attack 에 추가해줌
AnimNotify_AttackEnd 에서 함수 추가를 누르면 다형성에 의해서 오버라이드 할 수 있는 함수들이 나옴
Received_Notify를 추가
MainCharacter로 가야하기때문에 BP_MainCharacter로 형변환함

이렇게 구성하면 객체로 따로 분리 가능
# 무기
무기는 캐릭터랑 충돌이 가능해야함
블루프린트 액터 생성 후 Components에 Box Collision, SkeletalMesh 추가 후 Weapon Mesh의 Details에 무기 에셋 적용
Box Extent의 크기 에셋에 맞게 조절
Mesh를 루트로

BP_Weapon의 EventGraph에서

Has Tag에서 Tag를 Player 로 했는데 BP_MainCharacter에 Player 태그 있는지 확인
Player가 있으면 True로 분기, BP_MainCharacter가 해야해서 형변환 진행,
Tag가 없다면 BP_MainCharacter에서 Class Defaults 클릭하여 Details 열로 Actor Tags에 Player 추가

BP_MainCharacter 에서 Custom Event 추가해서 BP_Weapon을 Object Reference로 생성

그리고 변수로 승격함 (Promote to Variable)
다시 BP_Weapon으로 가서 충돌 함수를 연결해주는데 BP_Weapon은 본인인데 파라미터 값이 Weapon이랑 self로 본인을 받음

스켈레톤에서 오른손뼈대 정보를 가지고 와야함, 무기 장착해야해서,, 일단 아래 정보를 지움

hand_r에 Add Socket을 추가 위치정보를 가지고있는 데이터를 추가함.
무기를 손 위치에 맞게 잘 설정

박스가 충돌이 되면 안되기 때문에 충돌처리를 함
BP_Weapon 으로 가서 Set Collision Enabled 추가
물리에서 충돌처리 2가지 방법이 있음
1. 충격이나 힘처리 X (겹쳤는지만 확인) -> 오버랩 Query (뚫고 지나갈 수 있음)
2. 힘을 처리 (뚫고 지나가지 못함) 콜리전 피직스

한번 수집처리하면 collision 을 꺼줘야함
도착한 액터의 타겟 연결하고. Parent 는 Component를 필요로 하여 모델링에 붙인다.
메시를 컴포넌트로 붙인다.

컴포넌트가 가지고있는 것 중에 (스켈레탈 매시중) weaponPosiiton 소켓에 붙일것임
Location Rule, Rotation rule, Scale Rule - 떨어져있는 거리를 어디로 기준으로 하는지 정하는 거

무기획득 처리 로직

공격 종료

공격 시작

공격 입력 처리 -> 공격 이벤트 실행
무기랑 충돌처리를 하기 위해, BP_Weapon에서 컴포넌트를 추가함
Box Collision


BP_Weapon의 무기획득처리
시작할때는 WeaponCollision은 끄고 시작할거임
칼을 휘둘렀을때만 켜질거

시작하면 무기 콜리전 끄기
애니메이션하고 합이 맞아야함, 무기랑
휘두를 때

BP_MainCharacter
Event Dispatchers 사용하여 AttackCheckStart랑 AttackCheckEnd 추가
https://dev.epicgames.com/documentation/unreal-engine/event-dispatchers-in-unreal-engine?lang=ko
언리얼의 옵저버 패턴
무기획득 처리가 되면 이벤트 디스패처에서 스타트 바인드
Weapon 변수가 OnAttackCheckStart를 추가했으니 아까

이벤트 구독처리한거 추가한거임
발행을 해야 이벤트 구독한게 실행이 될거임
Notify 추가할거, 공격 시점 잡아서 충돌처리 on off 할 예정임
animnotifyState 추가해서 몽타주에 배치

notifyState 로 Attack 시점을 잡음
AnimNotify_AttackCheck 에서

Function 추가, Begin 이랑 End 추가
애니메이션 이벤트의 한 종류, 애니메이션 이벤트는 애니메이션이 소유, 애니메이션은 컴포넌트가 소유하고, 컴포넌트가 소유하고있는 액터를 메인 캐릭터로 바꿔서 쓸려고 한다.
Begin 구현부
1. get Owner 가져옴 Comp ()
2. 형변환 진행
3. call Attack Check Start하여 발행
4. return node로 성공실패 반환


델리게이트 - 함수 포인터 배열
충돌처리 기반으로 데미지 전달할거
1. Weapon Collision 하고 부딪힌 물체를 명확하게 파악, Details 에서 On Component Begin Overlap 추가
언리얼에서의 데미지 처리가 있음 언리얼에 어떤식으로 데미지 저리를 하는지
2. 충돌 대상한테 알려줄거임
캐릭터가 데미지 입는다면 캐릭터쪽에 이벤트 만들어주고 형변환 해주는 것도 방법임
하지만 BP_Weapon에서 처리할거다. 데미지 처리가 있으니까
Base Damage는 변수로 만들어 줄것 (기본값을 설정해야한다.)
Instigator 는 누가 맞았는지 몰라서 플레이어 액터를 가져와야함
3. Get Player Controller (Player Index 0 은 '나'를 의미)
4. Damage Causer : Weapon 입장에서 본인이 때린거니 Self
5. 때렸으니 맞을게 필요해서 액터를 하나 둘거임
# 대미지 처리

동작 흐름
1. 무기 충돌하면 applyDamage 호출, 딸려있는 정보 수집
2. 맞은 대상한테 가서 Event AnyDamage 호출, Weapon이 전달한 메시지를 전달
대상이 없어지면 파격효과를 넣기위해 Spawn Emitter at Location 사용, 파괴되는 액터 위치이기 때문에 Get Actor Location 으로 본인 위치 전달

Scale을 이용해서 파격 효과 크기 조절 가능
'Unreal' 카테고리의 다른 글
| [Unreal Blueprint] 머티리얼 피격 효과 (0) | 2026.09.23 |
|---|---|
| [Unreal Blueprint] 카메라 매니저 (0) | 2026.09.21 |
| 애니메이션 블루프린트 링크 (0) | 2026.09.17 |
| 게임 플레이 입력 처리 (0) | 2026.09.15 |