728x90
이 글은 Inflearn - Rookiss : 언리얼 엔진4 입문 강의를 듣고 정리한 글입니다.

 

목차.

  1. 블루프린트 클래스 생성
  2. 블루프린트 클래스 구조
  3. 블루프린트 클래스 기본 설정
  4. 블루프린트 클래스 캐릭터 이동, 카메라 움직임 구현
  5. C++ 클래스를 블루프린트로 변경하기(복사하기)

 

블루프린트 클래스 생성

 

저번 글에서 작성한 C++클래스를 블루프린트로 구현해 볼 계획이기 때문에 Character를 생성하겠습니다.

 

콘텐츠 -> 빈 폴더 생성(이름 : Blueprints) -> 블루프린트 클래스 -> Character 클릭

 

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로 변경된 것을 볼 수 있습니다.

 

Default Pawn Class 설정

 

그런데 이대로 게임을 시작하면 카메라가 캐릭터 몸 안에 박혀있어 제대로 보이지가 않습니다.

 

캐릭터 움직임과 카메라 제어를 구현해 보겠습니다.

 

카메라를 제어하기 위해서 SpringArm 컴포넌트와 Camera 컴포넌트가 필요합니다.

 

Spring Arm 컴포넌트 추가

 

두 컴포넌트를 추가한 뒤 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가 초기화되어야 하기 때문에 아까 추가한 변수로 길이를 설정하였습니다.

 

변수를 활용해 Spring Arm 거리 조절

 

여기서 다시 한번 느낀 점은 C++에서 사용한 기능은 대부분 비슷한 이름으로 블루프린트 클래스에 있다는 점입니다.

 

 

블루프린트 클래스 캐릭터 이동, 카메라 움직임 구현

 

이제 캐릭터 이동을 구현해 보겠습니다.

 

WASD로 캐릭터가 움직이는 코드를 C++ 클래스에서는

 

캐릭터 클래스 움직임 코드

 

이런 식으로 구현했으니 블루프린트 클래스에서도 비슷한 방식으로 구현하면 될 것이라는 생각이 드네요.

 

캐릭터 블루프린트 클래스

 

위아래 입력을 받는 Updown 입력축, 좌 우 입력을 받는 LeftRight 입력축,

 

GetActorForwardVector.. AddMovementInput.. 등 C++ 클래스에서 사용했던 기능들이 그대로 사용되었습니다.

 

이제 이동과 카메라 움직임 모두 잘 되는 것을 볼 수 있었습니다.

 

움직임 및 카메라 잘 작동하는 모습

 

문뜩 든 생각이 C++ 클래스에서 구현한 기능을 대부분 블루프린트에서 사용이 가능했다면

 

미리 작성해 둔 C++ 클래스를 블루프린트로 변경할 방법은 없을까요?

 

다음과 같은 방법으로 가능합니다.

 

 

C++ 클래스를 블루프린트로 변경하기(복사하기)

 

블루프린트 클래스 -> 부모 클래스 선택 -> 모든 클래스에서 C++ 클래스 검색 후 선택

 

C++ 클래스 상속받는 블루프린트 클래스 생성

 

그럼 추가 작업 없이 전에 생성한 C++ 클래스를 기반으로 블루프린트가 생성되었습니다.

 

그대로 잘 생성된 모습

728x90

+ Recent posts