블루프린트에 대해서 알아보자.
블루프린트를 실제로 사용하는 것에 대해 C++코드 작성보다 훨씬 느리다고 한다.
엔진에서 Content window에서 블루프린트 클래스를 생성하여 Character를 만들어보자.
블루프린트 클래스를 열면 위와 같은 창이 나온다.
transform이나 컴포넌트 추가 등의 기능을 보면 블루프린트 클래스는 마치 유니티를 보는 듯한 느낌이 든다.
빈 캡슐 Component가 있는데 이 컴포넌트를 상속하는 Mesh컴포넌트에서
사진과 같이 메시의 Skeletal Mesh를 변경하면 이전에 C++로 작성한 것과는 달리 쉽게 Mesh를 변경할 수 있다.
SpringArm과 Camera도 추가해보자. 컴포넌트 창의 컴포넌트 추가 버튼을 통해 원하는 컴포넌트를 추가할 수 있는데 마치 유니티의 Inspector창을 보는 것 같다.
Camera 컴포넌트의 디테일에서 Camera → Target Arm Length를 통해 떨어진 거리를 설정할 수 있다. 이전 포스팅에서 코드로 했을 때는 이를
// 컴포넌트의 값 수정
SpringArm->TargetArmLength = 500.f; // TargetArmLength는 오브젝트로부터 떨어진 거리이다.
SpringArm->SetRelativeRotation(FRotator(-35.f, 0.f, 0.f));
GetMesh()->SetRelativeLocationAndRotation(
FVector(0.f, 0.f, -88.f), FRotator(0.f, -90.f, -0.f));
이런식으로 작성했었는데 블루프린트를 이용해서 쉽게 할 수 있다.
내 블루프린트창에서 변수를 추가하면 C++ 헤더에서 변수를 선언한 것과 동일한 기능을 할 수 있다. 디테일에서 인스턴스 편집기능을 on/off함으로써 public/private설정도 할 수 있다.
이제 말로만 듣던 블루프린트 블록코딩을 해볼 차례다. 물론 유니티에도 bolt라는 에셋으로 블록코딩을 지원하지만 써본 적은 없다.
이벤트 그래프에서 컴포넌트를 그대로 드래그하면 블록이 생성된다. 그 후에는 노드를 만들고 노드에 연결될 컴포넌트를 검색해서 결정하면 된다.
위처럼 연결함으로써 이벤트가 발생하면 Set함수가 실행되고, 연결된 Arm Length와 Spring Arm에 대해서 setting하는 일련의 과정을 만들 수 있다.
블루프린트 클래스를 넣기 위해서 GameModeBase cpp파일의 생성자에
static ConstructorHelpers::FClassFinder<ACharacter> BP_Char(TEXT("경로_C"));
위와 같이 작성하면 된다. 참고로 경로뒤에는 '_C'를 반드시 붙여야하는데 이는 그냥 규칙이라한다.
현재 GameModeBase.cpp 는 이렇게 작성되어있는데
#include "MyGameModeBase.h"
#include "MyCharacter.h"
AMyGameModeBase::AMyGameModeBase()
{
// GameMode의 DefaultPawnClass값을 변경
DefaultPawnClass = AMyCharacter::StaticClass();
// 블루프린트 클래스 넣기
static ConstructorHelpers::FClassFinder<ACharacter> BP_Char(TEXT("Blueprint'/Game/Blueprints/BP_MyCharacter.BP_MyCharacter_C'"));
if (BP_Char.Succeeded())
{
DefaultPawnClass = BP_Char.Class;
}
}
FClassFinder가 경로에 해당하는 값을 찾아서 BP_Char에 넣는데 성공하면 Succeeded함수를 통해 class를 반환할 수 있다. 뭔가 유니티의 GetComponent와 비스무리한 느낌을 받는다.
BindAxis를 통해 입력값을 받는 것도 블루프린트에서 가능하다. 다음과 같이 그래프를 설정하면, 이전 포스팅에서 키보드와 마우스로 캐릭터를 움직이던 코드와 같은 효과를 가진다.
대강 느낌을 알 것 같다. 실수로 카메라를 생성해놓고, 이벤트 그래프에서 설정하지 않아서 카메라가 캐릭터의 중심에서 왔는데, Set camera에 Get camera를 연결하고, 이벤트 시작시 설정되도록 노드를 연결하면 된다.
블루프린트 클래스를 생성할 때 부모 클래스가 되는 C++클래스를 선택한다. 위 경우에는 Character 클래스를 상속받아서 생성하였다. 하지만 역으로 블루프린트 클래스를 C++클래스가 상속하는 것은 불가능하다.
하지만 직접 작성한 C++클래스를 블루프린트 클래스가 상속하여 사용할 수 있다는 점을 잘 이용하면 편한 작업을 할 수 있을지도 모른다.
블루프린트가 프로토타입에 유리하다는 말이 뭔지 알려면 블루프린트로 GameModeBase를 상속받아 클래스를 생성해보면 알 수 있다.
해당 GameModeBase의 클래스 값을 블루프린트에서는 손쉽게 수정할 수 있기 때문에 수시로 클래스를 바꾸어 테스트해볼 경우 블루프린트를 잘 사용하면 작업속도 향상을 부를 수 있을 것이다.
'개발 · 컴퓨터공학' 카테고리의 다른 글
Learning Unreal 4 언리얼 공부일지 - 애니메이션 몽타주가 뭐야 (0) | 2022.01.23 |
---|---|
Learning Unreal 4 언리얼 공부일지 - 애니메이션 적용하기 (0) | 2022.01.22 |
Learning Unreal 4 언리얼 공부일지 - 캐릭터 움직이기 (0) | 2022.01.19 |
Learning Unreal 4 언리얼 공부일지 - 키보드 입력으로 움직이기 (0) | 2022.01.18 |
Learning Unreal 4 언리얼 공부일지 - Log, Debug (0) | 2022.01.17 |