본문 바로가기

언리얼엔진/c++클래스 만들어보기

C++ 퀵스타트 - 액터움직이기 SetActorLocation()

1 - 필수 프로젝트 구성

  1. 런처에서 언리얼 엔진 을 엽니다. 새 프로젝트를 생성하기 가 나타납니다.

새 프로젝트 탭을 클릭한 다음 C++ 탭을 선택합니다. 거기서 기본 코드 를 선택하여 깨끗한 시작점을 확보하고, "시작용 콘텐츠 포함" 설정되었는지 확인합니다. 프로젝트 이름을 지어줘야 하는데, 여기서는 "inflearn" 라 하겠습니다. 이제 프로젝트 생성 을 클릭하여 시작하면 됩니다.

이제 언리얼 에디터 가 새 프로젝트를 열 것입니다. Visual Studio 역시 프로젝트가 만든 솔루션 파일을 열어 로드할 것입니다.

2 - C++ 클래스 생성

  1. 언리얼 에디터 에서 File (파일) 드롭다운 메뉴의 New C++ Class... (새 C++ 클래스...) 명령으로 새 클래스를 만들 수 있습니다.
  2. 부모를 Actor로 설정하고 이름을 ClassOnly라고 하고 클래스를 만듭니다.
  3. Visual Studio로 이동해서 다음과 같이 모두 다시로드를 눌러줍니다.

 4.  VS  IDE 솔루션탐색기 Game>inflearn>Source>inflearn 폴더아래 방금만든 코드들이 있습니다.

5. 언리얼 레벨에디터로 돌아가 C++>Inflearn폴더의 ClassOnly클래스를 끌어다 뷰포트에 놓으면 다음과 같이 작은 기즈모만 보입니다. 우리가 만든 클래스에는 아직 메시가 없기 때문입니다. 따라서 트랜스폼도 보이지 않습니다. ClassOnly1옆의 +Add를 클릭해 컴포넌트를 추가해 보겟습니다.

 이제 스태틱메시가 추가되었고 트랜스폼도 보이지만 아직도 아무것도 보이지 않습니다. 컴포넌트만 추가했지 메시데이터는 추가하지 않았기 때문입니다. Transform밑에 Static Mesh컴포넌트 None을 클릭해 Cube를 추가해 보겠습니다.

 드디오 화면에 Cube가 보입니다. 디테일에서 StaticMesh가 선택해야 StaticMesh컴포넌트가 보입니다

Cube의 Location이 (0,0,0)인걸 확인한후 Visual Studio로 돌아가 ClassOnly.C의 BeginPlay()를 다음과 같이 수정합니다.

void AClassOnly::BeginPlay()
{
	Super::BeginPlay();
	SetActorLocation(FVector(100, -1000, 300));
}

BeginPlay()함수는 액터인스턴스가 만들어진후 첫번째 프레임에서 실행될 코드입니다. 한번만 실행됩니다. SetActorLocation()은 액터의 위치를 정하는 함수로 위치는 Vector인데 언리얼에서는 FVector()를 사용합니다.

저장후 언리얼로 돌아와 오른쪽 아래 버튼을 눌러 컴파일합니다. 플레이 버튼을 눌러보면

ThirdPersonMode라 플레이어가 보이지만 아웃라이너에서 Class1을 찍어보면 Location이 코드상의 (100,100,300)으로 이동했습니다.

이제 큐브를 화면 왼쪽에서 오른쪽으로 이동시켜보겠습니다. ClassOnly.cpp의 Tick함수를 다음과 같이 수정합니다.

void AClassOnly::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);
	SetActorLocation(GetActorLocation() + GetActorRightVector());
}

액터자신의 위치를 구해 오른쪽방향 벡터를 더해주고 다시 액터자신의 위치에 설정해줍니다.  구현을 매프레임 발생하는 Tick()함수에 구현해주었기 때문에 액터는 매프레임 오른쪽으로 1씩 움직일것입니다. 실제 아웃라이너에서 ClassOnly1을 선택하고 Transform Location을 보면 Y값이 계속 변화하는 것을 볼수 있습니다.

잘생각해보면 블루프린트는 블루프린트 에디터라는게 있었지만 C++클래스는 그런게 없습니다. Visual Studio가 에디터입니다. 그리고 우리가 추가한 메시컴포넌트는 레벨에디터에서 ClassOnly1 인스턴스에 추가한거라 실제 ClassOnly클래스가 변경된건 하나도 없습니다. ClassOnly클래스는 여전히 아무런 StaticMesh도 가지고 있지 않습니다. 물론 코드는 Visual Studio에서 변경한거라 이건 당연히 적용되구요