프로그래밍/unreal engine

[UE]나만의 Animation node 만들기2

민냐옹 2022. 9. 10. 07:48

모듈 작업이 끝났으니 이제 애님 그래프 노드와 애님 비헤이비어 노드를 담당하는 클래스들을 각각 PluginTestEditor, PluginTestRuntime 폴더 안에 만들어주자.

먼저 애님 비헤이비어 노드를 만들어보자. UE에는 애니메이션 노드 관련 클래스를 만들 때 명명 규칙이 있는데 애님 비헤이비어 노드는 클래스 접두사로 AnimNode_를 붙인다. TransformModifyBone의 애님 비헤이비어 노드 클래스 AnimNode_ModifyBone.h도 그 규칙을 따른 거다.

나도 이 규칙에 따라 작업 중인 UE 프로젝트에서 새 C++ 클래스 생성(부모 클래스는 None으로 선택한다.)하면서 이름을 'AnimNode_PluginTest'라고 지었다. 이 클래스가 위치할 경로는 아래처럼 PluginTestRuntime (Runtime)으로 지정하고 Public을 택해준다.

캡쳐한다고 AnimNode_PluginTest를 이미 만들어놓고 다시 만들려고 하니 같은 이름의 파일이 있다는 오류가 떴다.

AnimNode_PluginTest 클래스가 만들어지면 AnimNode_PluginTest.h을 열자. 필요한 헤더파일을 인클루드해주고 구조체를 구성하는 등 작업할 차례다.

우선 TransformModifyBone의 AnimNode_ModifyBone.h에서 'BoneControllers/AnimNode_SkeletalControlBase.h'만 가져와 내 AnimNode_PluginTest.h에 인클루드 시키자. 그리고 'AnimNode_PluginTest.generated.h'도 추가 인클루드 시켜주자.

TransformModifyBone의 AnimNode_ModifyBone.h의 구조체 상단 부분도 복사해오자. 이걸 기반으로 AnimNode_PluginTest 구조체를 아래 이미지처럼 정의한다.

AnimNode_PluginTest.h

앞선 게시글에서 설명했지만 애님 비헤이비어 노드는 사실 구조체다. 그러니 구조체 AnimNode_PluginTest를 명명할 때 UE 컨벤션에 맞게 F 접두사를 붙여 FAnimNode_PluginTest를 써야 한다.

TransformModifyBone의 AnimNode_ModifyBone.h에서 함수 2개도 복사 붙여넣기했다. 내 목적은 애니메이션 노드를 만드는 거라 저 함수들을 정의하기는 했지만 사용은 안 했다.

만약 내가 만든 노드가 실제 작동도 되도록 만들고 싶다면 작동 로직은 EvaluateSkeletalControl_AnyThread()에 넣어주면 된다.

이대로 빌드하기 전에 PluginTestRuntime.Build.cs 파일로 가서 PublicDependencyModuleNames에 AnimGraphRuntime 모듈을 추가해준다.

내가 만든 구조체 FAnimNode_PluginTest는 FAnimNode_SkeletalControlBase를 부모로 상속하는데 FAnimNode_SkeletalControlBase는 AnimGraphRuntime이란 모듈에 속해있기 때문이다. 그러니 이 모듈을 내 Build.cs 파일에 추가해줘야 컴파일러가 FAnimNode_SkeletalControlBase를 제대로 찾고 컴파일할 수 있다.

AnimNode_SkeletalControlBase.h의 위치

UE_4.27 > Engine > Source > Runtime > AnimGraphRuntime > Public > BoneController 경로에서 AnimNode_SkeletalControlBase.h를 찾을 수 있다.
이제 빌드하면 성공할 수 있다.

방금 나는 내 애니메이션 노드가 런타임 중에 실행할 기능을 만들었다. 다음은 이 기능을 감쌀, 에디터에서 확인할 수 있는 껍데기를 만들어야 한다. 이 작업까지 해줘야 애니메이션 블루프린트에서 내가 만든 애니메이션 노드를 검색해서 배치할 수 있다.

이제 PluginTestEditor 폴더 안에 애님 그래프 노드 클래스를 만들어보자. 내 FAnimNode_PluginTest를 만들었던 것처럼 부모 클래스가 None인 새 C++ 클래스를 내 UE 프로젝트에 추가한다. 이름은 AnimGraphNode_PulginTest라고 지었다. 저장되는 경로는 PluginTestEditor(Runtime)다.
이 클래스는 TransformModifyBone 노드 기준으로 AnimGraphNode_ModifyBone의 역할을 하는 클래스다.

클래스 파일이 만들어지면 아래처럼 인클루드할 헤더파일 목록과 클래스 멤버들을 채우자. 내 목적은 애니메이션 블루프린트에 내가 만든 노드를 띄우는 거라 클래스 멤버는 딱 필요한 것만 요식 행위 수준으로 추가했다.

FAnimNode_PluginTest Node는 앞선 게시글에서 설명했듯이, 애님 그래프 노드가 가진 연관된 애님 비헤이비어 노드 멤버변수다. 이 멤버변수가 있어야 내가 만든 노드가 작업을 실행할 수 있다.

멤버 함수 중 GetNodeTitle()는 내 노드의 이름을 지정하는 함수다. GetTooltipText())내 내도의 툴팁을 담당하는 함수다. 노드에 마우스를 올리면 안내 문구창이 뜨는데 그 안내 문구창에 들어갈 내용을 이 함수에서 정한다.

이렇게 작성을 완료한 후 빌드하자. 빌드 성공 후 내 UE 프로젝트의 애니메이션 블루프린트 AnimGraph로 가보자. 거기서 마우스 오른쪽 클릭 후 내가 만든 노드 이름을 검색해보면 잘 뜬다!

이 작업을 진행하기 위해 참고한 사이트들은 아래와 같다.
https://docs.unrealengine.com/5.0/ko/animation-node-technical-guide-in-unreal-engine/
https://www.unrealengine.com/en-US/blog/creating-custom-animation-nodes

https://www.youtube.com/watch?v=UTznSEVFEuk&t=2s

 

'프로그래밍 > unreal engine' 카테고리의 다른 글

[UE]나만의 Animation node 만들기1  (1) 2022.09.03