이 글은 Inflearn - Rookiss : 언리얼 엔진4 입문 강의를 듣고 정리한 글입니다.
목차.
블루프린트 클래스 생성
저번 글에서 작성한 C++클래스를 블루프린트로 구현해 볼 계획이기 때문에 Character를 생성하겠습니다.
콘텐츠 -> 빈 폴더 생성(이름 : Blueprints) -> 블루프린트 클래스 -> Character 클릭
생성된 블루프린트를 더블클릭 했을 때 아래와 같은 창이 뜬다면 잘 생성된 것입니다.
블루프린트 클래스 구조
블루프린트도 잘 보면 C++ 클래스와 거의 똑같은 구조를 가지고 있습니다.
이벤트 그래프로 가보면 익숙한 함수들이 보입니다.
BeginPlay, Tick 함수가 있는데 이름을 보면 알 수 있듯 C++에 있던 함수들과 동일한 역할을 합니다.
그리고 다시 뷰포트로 돌아와 컴포넌트 계층구조를 보면
CapsuleComponent 하위에 Mesh가 있는 것을 볼 수 있습니다.
Mesh를 한번 클릭해 보겠습니다.
Mesh의 디테일 창에 보면 메시의 Skeletal Mesh 항목이 있는데 이곳에서 간단하게 매쉬를 변경할 수 있습니다.
지금 까는 매쉬를 변경하기 위해선
static ConstructorHelpers::FObjectFinder<USkeletalMesh> SM(TEXT("SkeletalMesh'/Game/ParagonGreystone/Characters/Heroes/Greystone/Meshes/Greystone.Greystone'"));
if (SM.Succeeded())
{
GetMesh()->SetSkeletalMesh(SM.Object);
}
이런 식으로 매쉬의 경로까지 직접 입력하면서 추가했었는데
블루프린트로 매쉬를 수정하면 훨씬 편하게 같은 결과를 얻을 수 있었습니다.
이를 통해 C++ 클래스에서 하던 작업들 대부분을 블루프린트 클래스에서 할 수 있단 것을 알 수 있었습니다.
하지만 블루프린트가 이런 장점만 있는 것이 아니라 단점도 있는데,
C++클래스에서 하던 작업을 블루프린트에서 한다면 작업 속도가 약 10배가량 차이가 난다는 문제가 있습니다.
블루프린트 클래스 기본 설정
위에서 전반적인 블루프린트 구조를 봤으니 이제 C++클래스에서 구현했던 내용들을 블루프린트에서 그대로 구현해 보겠습니다.
먼저 위에서 하던 것을 이어서 매쉬를 변경해 주었습니다.
그다음 현재 Capsule Component의 가장 아래에 매쉬의 피봇이 배치돼있지 않고 정 중앙에 배치되어있는데,
GetMesh()->SetRelativeLocationAndRotation(
FVector(0.f, 0.f, -88.f), FRotator(0.f, -90.f, 0.f));
C++ 클래스에서는 GetMesh()->SetRelativeLocationAndRotation을 통해서 회전 및 위치 이동을 해주었습니다.
블루프린트에 트랜스폼이라는 항목이 있는데 이를 c++에서 작성한 수치와 동일하게 해 보겠습니다.
이제 캐릭터가 Arrow 방향으로 바라보고 있고, y 축 위치도 거의 바닥과 닿아있습니다.
생성한 캐릭터를 게임 시작했을 때 생성될 수 있게 GameMode의 Default Pawn Class로 설정해 주겠습니다.
#include "MyGameModeBase.h"
#include "MyCharacter.h"
AMyGameModeBase::AMyGameModeBase()
{
static ConstructorHelpers::FClassFinder<ACharacter> BP_Char(TEXT("Blueprint'/Game/Blueprints/test.test_C'"));
if (BP_Char.Succeeded())
{
DefaultPawnClass = BP_Char.Class;
}
}
블루프린트 클래스는 특이하게도 이름 마지막에 _C를 꼭 붙여줘야 합니다.
이유는 아무도 모른다고 합니다.
다시 언리얼 에디터 창으로 돌아와 컴파일을 하면 test 블루프린트 클래스가 Default Pawn Class로 변경된 것을 볼 수 있습니다.
그런데 이대로 게임을 시작하면 카메라가 캐릭터 몸 안에 박혀있어 제대로 보이지가 않습니다.
캐릭터 움직임과 카메라 제어를 구현해 보겠습니다.
카메라를 제어하기 위해서 SpringArm 컴포넌트와 Camera 컴포넌트가 필요합니다.
두 컴포넌트를 추가한 뒤 SpringArm 밑으로 Camera를 이동시켜 주어 계층 구조를 맞췄습니다.
여기까지 한 작업이 C++ 클래스에서는 다음 코드와 같습니다.
이제 SpringArm의 위치를 다음과 같이 조절하면 됩니다.
여기까지 한 작업이 C++클래스에서 다음 코드과 같습니다.
AMyCharacter::AMyCharacter()
{
SpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("SPRINGARM"));
Camera = CreateDefaultSubobject<UCameraComponent>(TEXT("CAMERA"));
SpringArm->SetupAttachment(GetCapsuleComponent());
Camera->SetupAttachment(SpringArm);
SpringArm->TargetArmLength = 500.0f;
SpringArm->SetRelativeRotation(FRotator(-35.0f,0.f, 0.f));
GetMesh()->SetRelativeLocationAndRotation(
FVector(0.f, 0.f, -88.f), FRotator(0.f, -90.f, 0.f));
}
블루 프린트를 적절하게 사용하면 정말 유용한 것 같습니다...
이제 컴파일 후 게임실행하면
적절하게 카메라가 배치되었습니다.
C++에서 다양한 변수를 생성하고 사용했는데 마찬가지로 블루프린트에서도 Target Arm Length를 제어할 변수를 하나 생성해 주겠습니다.
변수 항목에 +(1번)를 누르면 새로운 변수가 생성되는데, 변수의 타입은 직접 지정해줘야 합니다.
변수이름 옆에 막대기 모양(2번)을 누르면 다양한 변수 타입이 뜨는데 저는 float 타입으로 지정하겠습니다.
오른쪽 끝에 눈 모양이 있는데 눈을 감고 있다면 private 변수, 뜨고 있다면 public 변수입니다.
눌러서 변경이 가능합니다.
컴파일을 하고 디테일을 보면 Arm Length라는 기본값이 새로 생겼습니다.
처음 지정했던 길이와 같게 500으로 설정하였고, 이제 다시 이벤트 그래프로 돌아오겠습니다.
게임 시작 시 SpringArm의 Target Arm Length가 초기화되어야 하기 때문에 아까 추가한 변수로 길이를 설정하였습니다.
여기서 다시 한번 느낀 점은 C++에서 사용한 기능은 대부분 비슷한 이름으로 블루프린트 클래스에 있다는 점입니다.
블루프린트 클래스 캐릭터 이동, 카메라 움직임 구현
이제 캐릭터 이동을 구현해 보겠습니다.
WASD로 캐릭터가 움직이는 코드를 C++ 클래스에서는
이런 식으로 구현했으니 블루프린트 클래스에서도 비슷한 방식으로 구현하면 될 것이라는 생각이 드네요.
위아래 입력을 받는 Updown 입력축, 좌 우 입력을 받는 LeftRight 입력축,
GetActorForwardVector.. AddMovementInput.. 등 C++ 클래스에서 사용했던 기능들이 그대로 사용되었습니다.
이제 이동과 카메라 움직임 모두 잘 되는 것을 볼 수 있었습니다.
문뜩 든 생각이 C++ 클래스에서 구현한 기능을 대부분 블루프린트에서 사용이 가능했다면
미리 작성해 둔 C++ 클래스를 블루프린트로 변경할 방법은 없을까요?
다음과 같은 방법으로 가능합니다.
C++ 클래스를 블루프린트로 변경하기(복사하기)
블루프린트 클래스 -> 부모 클래스 선택 -> 모든 클래스에서 C++ 클래스 검색 후 선택
그럼 추가 작업 없이 전에 생성한 C++ 클래스를 기반으로 블루프린트가 생성되었습니다.
'언리얼' 카테고리의 다른 글
[UE4] 언리얼 엔진 기초 : 애니메이션 블루프린트 스테이트 머신 (0) | 2023.08.22 |
---|---|
[UE4] 언리얼 엔진 기초 : 애니메이션 기초 (0) | 2023.08.21 |
[UE4] 언리얼 엔진 : 스타터 콘텐츠(StarterContent) 삭제하기 (0) | 2023.08.19 |
[UE4] 언리얼 엔진 기초 : 클래스에서 카메라 움직임 제어 (0) | 2023.08.19 |
[UE4] 언리얼 엔진 기초 : 클래스에서 Character 생성과 이동 (0) | 2023.08.19 |