본문 바로가기

언리얼C++게임개발/03.움직이는 액터의 제작

[이득우 언리얼 C++] 움직이는 액터의 설계

Fountain.cpp
0.00MB
Fountain.h
0.00MB

이번에는 렌더링 프레임 호출되는 액터의 Tick()함수를 이용해 액터의 움직임을 구현해본다.

Tick()함수는 전 렌더링프레임과의 시간차를 DeltaTime에 담아 전달해준다.

구현시 사용하는 moveSpeed와 같은 변수들은 public:으로 사용하면 문제없지만 private:일 경우 컴파일 에러가 발생한다. 이를 피하기 위해 다음과 같이 Fountain.h에 선언해야한다.

private:
	UPROPERTY(EditAnywhere, Category = Stat, Meta = (AllowPrivateAccess = true))
	float RotateSpeed;

Fountain.cpp Tick()에 AddActor~를 추가해 오브젝트를 돌게 해준다. 현재 회전값에 RotateSpeed*DeltaTime만큼 돌려주는 편리한 함수이다.

void AFountain::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);
	AddActorLocalRotation(FRotator(0, RotateSpeed * DeltaTime, 0));
}

사실 Rotation()도  

플레이 해보면 플레이어가 분수가운데로 떨어져 물방울만 보인다. PlayerStart를 좀 외곽으로 배치해 분수가 보이게 한다. 빌드후 자동리로딩후 플레이 해보면 분수가 빙글빙글 돌고 있다.

위쪽 분수는 반대로 돌려보겠다. 같은 속도로 하면 멈춰보이니 2배의 속도로 반대로 돌리겠다.

// Called every frame
void AFountain::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);
	SetActorRotation( GetActorRotation()+ FRotator(0, RotateSpeed * DeltaTime, 0));
	//AddActorLocalRotation(FRotator(0, RotateSpeed * DeltaTime, 0));
	Water->SetRelativeRotation(Water->GetRelativeRotation()+ FRotator(0, -2*RotateSpeed * DeltaTime,0));
}

무브먼트액터의 설계

언리얼은 액터의 움직임을 액터와 분리해 별도의 컴포넌트를 제공하는데 다음과 같은 무브먼트를 제공한다.

  • FloatingPawnMovement : 중력의 영향을 받지 않는 액터의 움직임 제공
  • RotatingMovement : 지정한 속도로 액터를 회전
  • InterpMovement : 지정한 위치로 액터를 이동
  • ProjectileMovement : 액터에 중력의 영향을 받아 포물선을 그리는 발사체의 움직임을 제공(총알, 미사일 등)

Fountain.h

#include "GameFramework/RotatingMovementComponent.h"

UCLASS()
class ARENABATTLE_API AFountain : public AActor
{
	GENERATED_BODY()

    ...

	UPROPERTY(VisibleAnywhere)
	URotatingMovementComponent* Movement;
    
    ...
};

Founting.cpp

PrimaryActorTick.bCanEverTikc = false로 틱발생이 안되어도 Move->RotationRate로 생성과 동시에 회전물체로 만들수 있다.

#include "Fountain.h"

// Sets default values
AFountain::AFountain()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = false; // Tick 작동 필요 없음

	RotateSpeed = 30.0f;
	Movement->RotationRate = FRotator(0.0f, RotateSpeed, 0.0f);
}

생성해서 배치해 보면 Movement컴포넌트가 추가되었고 rotation Rate는 30으로 Tick()에서 움직임 구현없이 자동으로 회전하게 해준다