캐릭터에 애니메이션 적용
아이템 객체 생성해보기

캐릭터의 움직임에 따른 애니메이션을 넣기 위해, Movement Component를 가져옴
Event BlueprintInitializeAnimation : 애니메이션 블루프린트가 초기화될 때 실행되는 이벤트
Get Owning Actor : 현재 애니메이션을 재생 중인 액터를 get
Character와 CharacterMovement를 가져옴

Event BlueprintUpdateAnimation : 프레임마다 호출되는 이벤트
이동속도와 공중에 있는지를 확인하는 변수 MoveSpeed와 IsFalling을 설정
이전에 만들었었던 Anim Graph와 비슷하게 구현

State Machine을 생성 후 캐시로 만들어(LocoMotion) 다른 State Machine속에서 사용 가능(Main State)

Apply Additive를 이용해 서로 다른 애니메이션을 부드럽게 연결해서 표현
(Land State에서 착지하는 모션과 움직이는 모션을 부드럽게 연결)
지면에 착지했을 경우, Control Rig를 이용해 IK작업을 해줌

IK를 통해 지면이 울퉁불퉁하여도 지면에 맞게 잘 애니메이션이 만들어짐
공중에서는 IK해줄 필요 없으므로, IsFalling이 거짓일때만 해줌
지뢰, 코인, 포션 등 여러 아이템을 만들 때 서로 공유하는 속성과 동작들이 있음
그래서 Interface를 이용하게 되는데, Unreal에서도 C++로 제공함

UINTERFACE(MinimalAPI) : 인터페이스를 리플렉션 시스템에 등록하기 위한 매크로. MinimalAPI는 해당 모듈안에서만 접근을 허용하게 해주는 옵션
class UItemInterface : public UInterface
리플렉션을 위한 인터페이스. 보통 수정하지 않음
class SPARTAPROJECT_API IItemInterface
순수가상함수를 직접 추가해주는 부분
OnItemBeginOverlap : 플레이어가 아이템 범위에 들어왔을 때 동작
OnItemEndOverlap : 플레이어가 아이템 범위를 벗어났을 때 동작
ActivateItem : 아이템이 사용(Activate)되었을 때 동작
GetItemType : 아이템 유형(이름)을 반환
DestroyItem : 아이템 제거
AActor와 ItemInterface를 상속받는 BaseItem을 생성
인터페이스 아니고 객체이므로, 순수가상함수를 꼭 override 해줘야함

ItemType : 아이템 이름은 기획자들이 수정하기 때문에 에디터에서 수정할 수 있도록 설정(리플렉션 시스템)FName으로하여 경량화
일단 Tick 사용 안 하도록 false로 설정
BaseItem은 가장 기본객체이므로 대부분의 함수를 비어둠. 각 자식 클래스에서 구현
DestroyItem : AActor에서 제공하는 Destroy() 함수로 객체 제거

PointValue 변수. 마찬가지로 리플렉션 시스템에 등록

여기서 생성자를 통해 ItemType과 PointValue를 설정
ActivateItem : 코인 아이템이 사용(획득)되었을 때의 동작
SmallCoinItem도 마찬가지로 해주면 됨
이 두 아이템 역시 코인과 마찬가지로 BaseItem을 상속받은 자식클래스로 만들어준다
각 아이템에 필요한 HealAmount / ExplosionDelay, ExplosionRadius, ExplosionDamage 등을 마찬가지로 리플렉션 시스템에 등록해주고 생성자에서 초기화해주면 된다