언리얼은 객체지향을 하고있으므로 어떤 겹치는 기능들이 있다면 그걸 Base 로 내리고, 세부한 기능들은 자식에서 구현할 수 있습니다. 그래서 매번 캐릭터가 생겨날때마다 캐릭터 이동, 마우스 입력, 키보드 조작 등의 로직을 일일이 다 만들 필요 없이 Base 에서 그 기능을 만들고 그 클래스를 상속받으면 모든 기능들은 포함한 체로 새로운 캐릭터를 구현할 수 있다는 장점이 있죠!
애니메이션 블루프린트도 물론 상속을 받을 순 있습니다! 다만 여러가지 제약이 있습니다...
일단 방법 한번 보시죠!
이는 '클래스 세팅 - 클레스 옵션(메뉴확장) - Target Skeleton' 에 있습니다.
이렇게 바꾸면 프리뷰 메쉬는 변경되지 않은 체로 T 자세를 취하는데
쫄지마시고 컴파일, 저장 후 자식 블루프린트를 닫고 다시 열어보면 새 메쉬, 스켈레톤으로 변경 되어 있습니다.
(컨텐츠 브라우저 아이콘에서도 바뀐 새 메쉬로 보일꺼예요!)
뭔가 찜찜하죠...? 뭔가 껴맞추는 느낌 들죠...?
그리고 심지어...
Anim Graph를 수정할 수가 없습니다... 전혀 보이지도 않습니다... 부모 애님 블루프린트의 변수, 함수 등 이벤트 그래프에 있는것들은 Override 가능하지만 Anim Graph 는 Override가 안됩니다...
그럼 애님그래프에서 구현한 스테이트머신... 그 안에 들어가는 애니메이션등은... 스켈레톤이 다르면 전혀 동작하지 않을텐데... 어떻게 해야할까...
변수와 함수 등은 오버라이드 된다고 했죠?? 변수로 만들어서 오버라이드 하면 됩니다!
어떻게 하냐면...
예시로 설명 드리겠습니다.
아래와 같은 죽는 애니메이션 스테이트 머신을 구현했다고 칩시다.
그중 스타트를 열어볼께요 더블클릭!
그리고 애니메이션 재생 노드를 클릭하면 디테일 패널에 'Sequence' 라는 변수가 있습니다. 이 변수를 핀으로 노출합니다.
그럼 이렇게 노출이 됩니다!
변수로 승격 후 한번 컴파일 해주면 기본값을 설정할 수 있습니다.
자식에서 구분 가능할 수 있도록 변수 이름을 바꿔주도록 하겠습니다.
↑ 아주 좋네요
그렇다면 자식 블루프린트를 열어본다음 이렇게 클래스 디폴트를 열면 우리의 죽는 시작 애니메이션인 'YES DIE START' 를 볼 수 있습니다!
만약 안보인다면 부모 애님 블루프린트를 컴파일, 저장 하고 난 다음 자식 애님 블루프린트를 닫고나서 다시 열어보세요!
자...그래도 역시나 찜찜한 느낌을 지울수가 없군요...
흐으으음... 뭔가 껴맞추는 느낌이고 만약 자식 애님 블루프린트에서 Anim Graph 의 스테이트머신 이라던지 조건이 바뀐다면 혹은 추가되야하는 애니메이션이 존재한다면 구현할 수 없는 약간 반쪽짜리 상속같은 느낌을 지울 수 없습니다.
그렇다면... 상속을 받으면서도 애님그래프를 수정할 수 있는 방법은 없는걸까요?
불행히도...
있긴 있습니다.
모든 블루프린트 클래스는 열어보면 오른쪽 상단에 어떤 부모클래스를 상속받았는지 나옵니다.
애니메이션 블루프린트도 블루프린트이기 때문에 당연히 오른쪽 상단에 상속받은 클래스가 무엇인지 나오죠.
애니메이션 블루프린트는 Anim instance 라는 클래스를 상속받아서 만들어졌습니다. 그래서 C++ 클래스를 만들때 이 Anim Instance 를 상속받아서 만들면 그 클래스를 상속받아서 애님블루프린트를 만들 수 있습니다.
이 방법은 그렇다~ 라는것만 아시면 될듯하고... 여기서 부터는 프로그래밍적인 지식만 전달하도록 하겠습니다.
Blueprint 를 생성할 때 부모 클래스를 선택할 수 있습니다. 만약 C++로 만든 Anim Instance 를 상속받아 애님 블루프린트를 만들고 싶다면, 일단 C++로 Anim Instance 를 상속받아 클래스를 하나 만들고, 엔진에서는 그냥 애님블루프린트를 만듭니다.
그리고 그 애님 블루프린트의 부모 클래스를 생성했던 C++ 클래스로 변경해야 합니다.
모든 블루프린트는 생성 후 부모클래스를 변경할 수 있는거 아시죠???
위치는 '클래스 세팅 - 클래스 옵션 - 부모클래스' 입니다.
그래서 C++ 로 생성한 Anim Instance 자식 클래스를 저 애님 블루프린트의 부모로 지정하면 이벤트 그래프도 쓸 수 있으며 애님 그래프도 사용 가능합니다.
다만 C++로는 이벤트 그래프(BeginPlay, Initialize, Update 등) 내의 로직은 구현이 가능합니다.
아래는 언리얼 엔진 Anim Instance 안에 있는 코드입니다.
// the below functions are the native overrides for each phase
// Native initialization override point
virtual void NativeInitializeAnimation();
// Native update override point. It is usually a good idea to simply gather data in this step and
// for the bulk of the work to be done in NativeUpdateAnimation.
virtual void NativeUpdateAnimation(float DeltaSeconds);
// Executed when begin play is called on the owning component
virtual void NativeBeginPlay();
하지만 애님그래프 내의 로직을 구현할 수 있는지는... 모릅니다... 일단 함수는 있는걸 봤는데 어떻게 사용하는지는 아직 찾아보진 못했습니다.
제 예상으로는 C++ 에서
virtual void NativePostEvaluateAnimation();
이 함수를 오버라이드하면 가능하지 않을까... 생각이 듭니다...
이상... 아주 찜찜하지만... 가능은 하다... 같은 글이었습니다!