언리얼에서 Player 카메라의 회전 범위를 조절하기 위해서는 Player Camera Blueprint로 범위를 제한할 수 있다.


현재는 위 아래 회전각도인 Pitch값의 범위를 -45도에서 45도 사이로 제한 해 둔 것을 볼 수있다.
이제 해당 Player Camera Manager는 Controller에 적용시키면 게임에 적용된다.
다시 BP_Controller로 돌아가서 설정을 한다.

공격 애니메이션 넣어보기
(갑작스런 Tmi, AnimInstance에서 Event Graph가 AnimGraph보다 먼저 실행된다.)
공격 애니메이션을 넣기 전에 일단 고민해봐야 할 것들이 있다.
상태를 어디에 넣어줄 지 즉, 캐릭터의 상태를 어느 객체가 관리할 지를 결정해야 한다.
일반적으로는 로직을 담당하는 블루프린트 or C++에서 상태를 관리하는게 일반적이다.
이전 Directx11 프로젝트를 진행할 때 enum값을 통해 상태를 관리함으로써 각 상태에 따른 로직을 명확하게 분리하고
유지보수를 용이하게 만들 수 있었다.
따라서 Unreal Engine에서도 마찬가지로 Enum 기반의 상태 관리 방식을 적용하여 보다 직관적이고 안정적인 캐릭터 상태 관리를 구현하고자 한다.
우선 캐릭터의 상태를 Enum값으로 보관할 Enumeration을 만들자.

해당 Enum 자료형을 열면

다음과 같이 Enum 값을 설정해 줄 수 있다.
이제 본격적으로

Character Class에서 Input_Action 을 가져와서 해당 Input에 입력 ( started = 입력이 들어오는 한 순간)을 체크해서
해당 입력이 들어온다면서 현재 상태를 switch case문으로 분류하고 만약 현재 상태가 Locomotion 이라면 현재 State 를 Battle 로 set 해주는 것을 의미한다.

다음은 Customer Event를 통한 공격이 끝났을 때는 다시 상태를 Locomotion으로 설정하는 블루프린트이다.
커스텀 이벤트는 엔진이 호출해주지 않아 어디에선가 직접적으로 호출 해주어야 한다.
해당 Customer Event는 notify가 호출될 때 Animation Blueprint의 EventGrpah에 로직 추가해줘 작동하게 한다.

프로젝트를 진행하면서 State 값을 디버깅 해야할 때가 있다.
그럴 땐 다음과 같이 블루 프린트를 디버깅하면 된다. ( F9 = breakpoint 단축키 )
블루 프린트 디버깅하기


Notify 이벤트 등록

Animation Notify를 사용하는 이유
- 애니메이션 타임라인 상의 특정 시점에 이벤트를 발새시키기 위한 기능이다.
즉, 단순히 애니메이션을 재생하는 것을 넘어 정확한 타이밍에 로직을 실행하기 위해 사용된다.
(예를 들어, 공격 모션 중 칼이 적에게 닿는 순간, 발이 땅에 닿는 순간, 스킬이 발동되는 타이밍 기타 등등 )
Notify 이벤트가 호출을 가져오는 방법


다음과 같이 Animation notify가 호출되면 다음과 같이 실행되도록 처리할 수 있다.
Montage 와 일반 Animation 시스템 차이 정리
State Machine 기반 Animation
- State Machine은 조건(상태)에 따라 애니메이션을 전환한다.
- 상태가 변경되면 현재 애니메이션과 관계없이 즉시 다음 상태의 애니메이션으로 전이된다.
즉, 상태 변화가 곧 애니메이션 변경이다.
Montage
- Montage는 State Machine과 독립적으로 재생된다.
- Slot을 통해 최종 애니메이션 위에 덮여씌워지는 구조로 동작한다
따라서
- 상태가 Idle -> Run으로 바뀌더라도 Montage는 영향을 받지 않고 계속 재생된다.
즉, 상태와 무관하게 재생이 유지된다.
왜 Montage는 끊기지 않는가?
- State Machine은 상태 기반 -> 즉시 전이됨
- Montage는 명령 기반 -> 한 번 실행되면 유지됨
그래서 State 변화로 인해 애니메이션이 중간에 끊기는 일이 발생하지 않는다.
Montage를 실행하는 방법


Character Blueprint에서 Montage Animation을 실행하면서 State안에서는 현재 실행되고 있는 애니메이션 포즈와 현재 시간의 몽타주 포즈를 블랜드(A자세에서 B자세로 섞는거 즉 자연스럽게 애니메이션을 전환하기 위한 보간 작업이라고 보면 된다) 하여 진행하면서 애니메이션을 실행시킨다
블랜딩 하는 시간은 따로 설정 값을 통해 조정할수있다.
몽타주 애니메이션을 이용한 콤보 공격 구현 방법

각 Montage의 Section 마다 마우스 클릭을 통한 Attack의 모션을 바꿀려고 한다.
해당 작업을 하기 위해서는 일단 마우스 좌클릭으로 인한 콤보 Attack의 넘버링을 바꿔줄려고 한다.

Weapon을 캐릭터에 붙히는 방법 2가지
1. Socket에 Weapon을 붙혀넣기

해당 화면은 해당 모델의 skeleton으로 들어가면 확인할 수 있다.

해야할 것으로는 무기 위치에 해당할 Parent Socket 값 넣기 그리고 매쉬 Asset 추가하기
2. 이벤트 방식으로 ( 칼과 충돌했을 때 플레이어와 붙히기 )
이벤트 방식으로 칼을 획득하게 하기 위해서는 다음과 같은 과정이 필요하다.
무기에 Collider Componnet를 부착하여 충돌 속성을 부여하고 해당 충돌 발생 이벤트를 OnComponent Begin Overlap를 사용하여 충돌한 Actor 객체를 가져와서 해당 Actor의 custom Event를 호출한다.


- Socket Name : 부착할 위치를 지정하는 곳 ( 캐릭터의 Bone 또는 Socket 이름을 사용한다 )
- Location Rule : 부착 시 대상 컴포넌트의 위치를 어떤 기준으로 맞출지 결정하는 규칙
- Rotation Rule : 부착 시 회전을 어떤 기준으로 적용할지 결정하는 규칙
- Scale Rule : 부착 시 스케일을 어떤 기준으로 유지 또는 적용할지 결정하는 규칙
각 Rule에 적용되는 옵션들
- Keep Relative : 기존 상대 위치 유지
- Keep World : 월드 위치 유지
- Snap to Target : 대상 위치에 정확히 맞춤

특정 순간에만 Collider를 On/Off 구현
다음과 같은 과정으로 구현할 예정이다.
1. Animation Notify 발생
- 공격 애니메이션 타임라인에 설정된 Notify가 호출된다.
2. AnimBlueprint Event Graph에서 처리
- 해당 Notify 이벤트를 수신한다
- 현재 애니메이션을 재생 중인 Pawn을 가져온 뒤, Character로 캐스팅 한다.
3. Character로 이벤트 전달
- 캐릭터의 Custom Event를 호출한다 ( BP_Character의 OnAttackCheckBegin, BP_Character의 OnAttackCheckEnd )
4. Weapon Mesh로 전달
- 캐릭터는 자신이 소유한 Weapon Mesh에 접근하여 Weapon의 Custom Event를 호출한다. ( BP_Weapon의 OnAttackCheckBegin, BP_ Weapon의 OnAttackCheckEnd )
우선 Animation notify를 사용하여 어느 애니메이션 key frame에 Collider을 키고 어느 key Frame에 Collider를 끌 지를
각각 notify 이름으로 "AttackCheckBegin" , "AttackCheckEnd"으로 설정합니다.

주의할 점으로는 ComboCheck 뒤에 notify를 설정하면 jump section하면서 notify가 호출이 안될 수 있기 때문에 앞에다가 설정하도록 하자.

다음과 같이 Animation Event Graph를 설정하여 Anim notify를 호출 받으면 Character의 Custom Event를 호출하도록 한다.


위에서 주의 깊게 봐야할 것은 바로 Set Collision Enabled의 New Type의 속성으로
- No Collision
- 충돌을 전혀 수행하지 않음
- 물리 충돌 및 충돌 검사( = 트레이스 ) 모두 비활성화
- Query Only
- 물리적인 충돌 반응은 없지만 충돌 검사 ( 트레이스 , 오버랩 등)는 가능
- 즉, 실제로 부딪히지는 않지만, 충돌 판정은 체크할 수 있는 상태
EVENT DISPATCHERS 사용해보기
Event Dispatcher는 Blueprint에서 사용하는 Delegate 입니다.
Delegate란?
- 함수 포인터의 확장 개념으로 이벤트를 등록하고 호출하는 시스템 입니다. ( 옵저버 패턴! )
Bind -> 이벤트 연결
Call -> 이벤트 실행



