유니티에서는 GameObject 하나로 다 퉁쳤지만
언리얼에서는 용도에 따라 미리 세팅된 액터 타입이 존재한다.
액터 Actor
유니티의 GameObject와 비슷. 가장 기본이 되는 형태.
폰 Pawn
컨트롤러에 의해 플레이어나 AI가 제어 가능한 액터.
캐릭터 Character
이족 보행 아바타로 디자인된 복잡한 형태의 폰.
컨트롤 가능한 오브젝트를 만들려면 최소한 폰을 사용해야 한다.
목표는 직접 컨트롤 할 수 있는 폰을 만들어보자.
아래 유튜브 영상을 보고 따라하였다.
https://www.youtube.com/watch?v=vQsOIGWRdXQ
영상에서의 목표는 아래와 같은 동작을 하는 오브젝트를 만드는 것이다.
W, S : 앞뒤 이동
A, D : 좌우 이동
G : 누르고 있으면 커짐. 떼고 있으면 작아짐.
입력 키 세팅하기
1. 편집-프로젝트 세팅
2. 우리의 목표를 상기해보면서 입력키를 세팅한다.
W, S : 앞뒤 이동
A, D : 좌우 이동
G : 누르고 있으면 커짐. 떼고 있으면 작아짐.
입력키 세팅은 끝났고, 이제 우리의 입력에 따라 충실하게 움직여줄 폰을 만들 차례이다.
커스텀 폰 만들기
1. Pawn을 상속받는 C++ 클래스를 생성한다 (MyPawn)
// MyPawn.h
UPROPERTY(EditAnywhere)
USceneComponent* OurVisibleActor;
// MyPawn.cpp
#include "Camera/CameraComponent.h"
#include "Components/StaticMeshComponent.h"
#include "Components/InputComponent.h"
AMyPawn::AMyPawn()
{
// Set this pawn to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
AutoPossessPlayer = EAutoReceiveInput::Player0;
RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("Root Comp"));
UCameraComponent* OurCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("Out Camera"));
OurVisibleActor = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Out Mesh"));
OurCamera->SetupAttachment(RootComponent);
OurCamera->SetRelativeLocation(FVector(-250.f, 0.f, 250.f));
OurCamera->SetRelativeRotation(FRotator(-45.f, 0.f, 0.f));
OurVisibleActor->SetupAttachment(RootComponent);
}
2. 눈으로 볼 수 있도록 StaticMesh와 Camera가 필요하다.
생성자에 세팅하여 초기화와 동시에 필요한 컴포넌트를 세팅하도록 한다.
선언부의 UPROPERTY 어트리뷰트와
구현부의 AutoPossesPlayer 같은 것들은 추후에 깊게 공부해보자.
일단은 컴포넌트를 생성하거나 트랜스폼을 조작하는 등의 기초적인 내용에 중점을..
3. 컴파일하고 MyPawn을 맵에 끌어다 놓으면 이렇게 아무것도 안보인다.
4. OurVisibleActor 를 선택하고 Static Mesh에 Sphere를 넣어주면 보인다.
커스텀 폰 움직이게 하기
// MyPawn.h
void Move_XAxis(float AxisValue); // 좌우이동
void Move_YAxis(float AxisValue); // 앞뒤이동
void StartGrowing(); // 커지기
void StopGrowing(); // 커지기 중단
FVector CurrentVelocity; // 현재 속도
bool bGrowing; // 커질것인지 체크하는 bool 변수
1. 조작에 필요한 함수들 선언.
키를 누르면 변수를 세팅하고, 실제로 움직이거나 커지는 부분은 매 프레임 불리는 Tick 함수에서 처리할 것이다.
// MyPawn.cpp
// 좌우이동 = x축 이동
void AMyPawn::Move_XAxis(float AxisValue) {
CurrentVelocity.X = FMath::Clamp(AxisValue, -1.f, 1.f) * 100.f;
}
// 앞뒤이동 = y축 이동
void AMyPawn::Move_YAxis(float AxisValue) {
CurrentVelocity.Y = FMath::Clamp(AxisValue, -1.f, 1.f) * 100.f;
}
void AMyPawn::StartGrowing() {
bGrowing = true;
}
void AMyPawn::StopGrowing() {
bGrowing = false;
}
2. 함수 구현
앞뒤이동에 해당하는 Move_YAxis를 보면 조금 이상하다.
Y축은 위아래이고, 앞뒤면 Move_ZAxis가 되어야 하는거 아닌가? 싶었지만.
알고보니 유니티와 언리얼은 좌표축이 다르다.
유니티는 왼손 & y-up 좌표계
언리얼은 왼손 & z-up 좌표계를 사용한다.
참고자료
http://www.aclockworkberry.com/basis-orientations-in-3ds-max-unity-3d-and-unreal-engine/
void AMyPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
InputComponent->BindAction("Grow", IE_Pressed, this, &AMyPawn::StartGrowing);
InputComponent->BindAction("Grow", IE_Released, this, &AMyPawn::StopGrowing);
InputComponent->BindAxis("MoveX", this, &AMyPawn::Move_XAxis);
InputComponent->BindAxis("MoveY", this, &AMyPawn::Move_YAxis);
InputComponent->BindAxis("Space", this, &AMyPawn::Move_ZAxis);
}
3. 키를 눌렀을 때 우리가 구현한 함수가 작동되도록 연결시켜주어야 한다.
Pawn 클래스에서 SetupPlayerInputComponent 상속받아서 이 부분을 구현할 수 있는 듯 하다.
4. 컴파일 후 실행해서 조작해보자.
'#DevStudy > Unreal' 카테고리의 다른 글
UE4 - Building Better 3D Meshes & Textures (0) | 2020.10.01 |
---|---|
UE4 - CLion 연동하기 (0) | 2020.01.05 |
UE4 - 로그 남기기 (0) | 2020.01.03 |
댓글