본문 바로가기

Unreal/득우짱의 언리얼

Chapter7,8 애니메이션

애니메이션 블루프린트는 시각적 도구를 사용해 애니메이션 시스템을 제작하도록 설계된 애님 그래프, 애니메이션 블루프린트의 기반을 이루는 애님 인스턴스 두 가지로 구성된다.

1. 

- 애님 인스턴스 : 스켈레탈 메시를 소유하는 폰의 정보를 받아 애님 그래프가 참조할 데이터를 제공한다. 블루프린트와 C++로 제작할 수 있다.

- 애님 그래프 : 애님 인스턴스 변수 값에 따라 변화하는 애니메이션 시스템을 설계하는 공간이다.


2. 게임 엔진은 틱마다 입력시스템->게임 로직-> 애니메이션 시스템 순으로 로직을 실행한다.


3. 스테이트 머신, 트랜지션


4. UPROPERTY에 설정하는 키워드인 EditAnywhere와 VisibleAnywhere에 있는 Anywhere 키워드는 에디터와의 연동 방법에 따라 DefaultsOnly와  InstanceOnly로 세분화할 수 있다.  ex : EditDefaultsOnly

- DefaultsOnly는 클래스의 기본 값을 담당하는 블루프린트 편집 화면에서만 보여지고

- InstanceOnly는 인스턴스의 속성을 보여주는 에디터 뷰포트에서만 보여진다.


5. DefaultSlot (?)


6. 델리게이트- 넓은 의미로 특정 객체가 해야 할 로직을 다른 객체가 대신 처리할 수 있도록 만드는 보편적인 설계의 개념

- 언리얼 엔진의 델리게이트는 A 객체가 B 객체에 작업 명령을 내릴 때 B 객체에 자신을 등록하고 B의 작업이 끝나면 A에게 알려주는 설계 방식을 의미 ㅋㅋ C++에선 델리게이트를 지원하지 않어! 언리얼의 것이야!

애님 인스턴스에는 애니메이션 몽타주 재생이 끝나면 발동하는 OnMontageEnded라는 델리게이트를 제공한다.

- C++ 객체에만 사용할 수 있는 델리게이트와 C++, 블루프린트 객체가 모두 사용할 수 있는 델리게이트로 나뉜다. 

- 블루프린트 오브젝트는 멤버 함수에 대한 정보를 저장하고 로딩하는 직렬화(Serialization) 메커니즘이 들어있기 때문에 일반 C++언어가 관리하는 방법으로 멤버 함수를 관리할 수 없다. 그래서 블루프린트와 관련된 C++ 함수는 모두 UFUNCTION 매크로를 사용해야 한다. 

블루프린트 객체와도 연동하는 델리게이트를 다이나믹 델리게이트라고 한다. 

여러개의 함수를 받아 한번에 알려주는 델리게이트는 멀티캐스트 델리게이트! 델리게이트의 형식은 시그니처라 한다.


7. 일반 애니메이션과 몽타주에 애니메이션 노티파이 사용가능 

- C++에서는 AnimNotify_노티파이명 함수가 호출된다.


8. 델리게이트 기능을 사용하면 애님 인스턴스는 자신의 델리게이트를 사용하는 객체가 어떤 것인지 몰라도 델리게이트에 연결된 함수만 호출하면 되므로, 다른 클래스와 연결되지 않는 의존성 없는 설계를 할 수 있다는 장점이 생긴다.


9. 몽타주로 콤보를 구현하다보면 콤보가 안되는 현상이 발생하는데........... 다음 섹션으로 넘어가기 위한 애니메이션 노티파이를 설정하고 그 안에서 섹션넘기기를 하더라도 OnMontageEnded 에 들어와서 넘어가지 않는 현상이 있다.


위 이미지는 콤보 실행이 되는 상태고, 아래 이미지는 콤보 실행이 안되는 상태다.


NextAttackCheck 라는 노티파이가 한 섹션이 끝나는 지점에서 가까워질수록 노티실행->다음섹션 명령을 내려도 OnMontageEnded 가 실행되서

콤보가 안될 확률이 높다. 


엔진 내부 상황을 보진 않았지만 단순하게 NextAttackCheck 노티파이를 섹션의 중간쯤에 위치하거나(이게 보통 해결 방법인듯)

OnMontageEnded에서 콤보 실행시 종료를 하지 않거나 등의 방법이 우선 해결방법인듯 하다.