
저번 글에 이어서 직접 해보기를 해보자
언리얼5-29 C++ <Cpp 튜토리얼 - 컴포넌트와 콜리전(1)>
- 첫 번째 과제: 부모 중심을 도는 컴포넌트 제작
- 두 번째 과제: 일정 시간 후 스폰 해제
- 세 번째 과제: 컴포넌트를 이용해 다른 액터에 붙이기
그럼 첫 번째 과제로 자동으로 부모 중심 궤도를 도는 컴포넌트를 만들어 보자
먼저 Scene Component 클래스를 부모 클래스로 해서 공전 컴포넌트를 만들어야 한다
공전(Revolution)이기에, 우선 RevolutionSceneComponent라는 이름으로 새 클래스를 생성한다
그리고 소스 파일로 가서 정적 메시를 나타내는 Static Mesh Component를 생성하고 RevolutionMesh라는 이름으로 Mesh 포인터에 할당해 준다
Mesh 컴포넌트를 현재 객체에 첨부하고 나서 상대적인 위치를 나타낸다 (여기서는 Y축을 기준으로 100만큼 위로 이동시킨다)
FObjectFinder를 사용하여 지정된 경로에 있는 정적 메쉬를 찾고, MeshAsset이 성공적으로 찾아냈다면 Mesh 컴포넌트에 해당 정적 메쉬를 설정한다. 즉, Mesh가 찾은 정적 메쉬 컴포넌트에 구체 모양의 정적 메쉬를 할당한다
그리고 TickComponent 함수로 가서 이 컴포넌트를 회전시키는 코드를 작성한다
코드 작성이 끝나면 모두 저장하고 에디터로 가서 컴파일을 해준다
컴파일이 끝나고 난 뒤에 레벨에 배치된 오브젝트 중에 탁자 위에 있는 스태츄를 선택하고 컴포넌트 추가 버튼을 눌러 RevolutionSceneComponent를 찾아서 선택한다
그리고 게임을 플레이해보면 탁자의 스태츄를 중심으로 회전하는 구체를 볼 수 있다
두 번째 과제는 3개의 자손을 스폰하고, 일정 시간이 지나면 스스로 스폰 해제되는 컴포넌트를 만드는 것이다
먼저 SceneComponent를 상속받는 SpawnerSceneComponent 클래스를 생성한다
클래스 생성이 끝나면 헤더 파일로 가서 컴포넌트를 파괴할 시간을 정하는 DestroyTimer 변수와 자식 컴포넌트들을 담고 있을 배열을 TArray로 선언한다
과제 내용에서 "3개의 자손을 스폰"하는 부분을 생성자에서 해야 할지 TickComponent 함수에서 해야 하는지 고민해 봐야 하는데,
지금까지 코드를 작성하면서 컴포넌트를 생성할 때 사용했던 CreateDefaultSubobject 함수는 생성자 함수에서만 사용할 수 있는
함수이고, 그 외의 곳에서 컴포넌트나 오브젝트를 생성하는 방법을 아직 모르기 때문에 생성자에서 작업을 진행해 보자
우선 소스 파일의 생성자로 이동하여 3개의 자식 컴포넌트를 만들기 위해서 반복문을 작성하고, 그 안에서 UStaticMeshComponent를 생성한 후 Child 오브젝트를 현재 오브젝트에 부착하도록 코드를 작성한다
[단 여기서 주의할 점은, 생성되는 컴포넌트의 이름이 같으면 빌드할 때 문제가 생기기 때문에 이름을 다르게 하기 위해서 TEXT 매크로만 사용하던 전과는 조금 다르게 코드를 작성해야 한다]
FObjectFinder를 이용해서 Cone 스태틱 메쉬를 가져와서 Child에 넣어주고, 만약 할당이 성공하면 Child에 Cone을 부착한다
이렇게 생성된 컴포넌트들은 radian을 이용해서 Child 오브젝트들의 각도를 만들고, 삼각함수로 각도에 따른 2D평면상의 좌표를 계산한다. 계산된 좌표는 Child 오브젝트가 배치될 위치를 나타내며, 100.0f를 곱해서 반지름이 100인 원을 중심으로 배치되도록 한다
마지막으로는 DestroyTimer을 3으로 정해준다
그리고 TickComponent 함수에서는 DestroyTimer를 감소시키고 0보다 작아지면 DestroyComponent 함수를 이용해서 Childs 배열에 들어있는 자식 컴포넌트들과 SpawnerSceneComponent를 파괴하도록 코드를 작성한다
이렇게 코드 작성이 모두 끝나면 코드를 저장하고 에디터로 돌아가서 컴파일 버튼을 눌러준다
컴파일이 끝나고 나서 레벨에 배치되어 있는 CollidingPawn을 선택하고 SpawnerSceneComponent를 붙여준다
그리고 게임을 플레이시키면 CollidingPawn 주변으로 웅장한 원뿔이 배치되고, 3초 뒤에 원뿔들이 사라지는 모습을 볼 수 있다
마지막 과제는 컴포넌트를 통해 완전한 액터를 다른 액터에 붙이는 것이다
우선 앞선 코드에서 주로 컴포넌트를 다른 컴포넌트에 붙일 때는 SetupAttachment라는 함수를 썼던걸 기억할 것이다
구글에 "unreal actor attach to actor"라는 키워드로 검색해 보면 관련 내용이 많이 나오는데,
그중에 AActor 클래스의 AttachToActor 함수에 대한 언리얼 공식 문서를 찾을 수 있다
AActor::AttachToActor | 언리얼엔진 5.3 문서 (unrealengine)
다시 기능을 만들기 위해 SceneComponent를 상속받아서 AttactSceneComponent를 만들어준다
클래스 생성이 끝나면 헤더 파일로 가서 AActor의 포인터 타입으로 TargetActor 변수와 ParentActor 변수를 선언하고
UPROPERTY 매크로와 지정자를 넣어준다
그리고 소스 파일의 BeginPlay 함수로 이동해서 TargetActor의 AttachToActor 함수를 호출하고 매개변수로 ParentActor와 FAttachmentTransformRules의 KeepRelativeTransform를 넣어준다
그리고 코드를 저장하고 에디터로 이동해서 컴파일을 진행한다
컴파일이 끝나면 CollidingPawn에 AttachSceneComponent를 붙이고 Target Actor에 Statue 액터를 할당하고 Parent Actor에 CollidingPawn을 할당해 준다
마지막으로 레벨에서 스태츄를 선택해서 모빌리티를 무버블로 바꿔준다
그리고 게임을 플레이시켜 주면 스태츄 액터가 CollidingActor에 붙어서 따라다니는 모습을 볼 수 있다
VR게임 개발을 위한 언리얼엔진/C++ 공부한 내용 끄적이기...
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!