이번에는 렌더링 프레임 호출되는 액터의 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()에서 움직임 구현없이 자동으로 회전하게 해준다
'언리얼C++게임개발 > 03.움직이는 액터의 제작' 카테고리의 다른 글
[이득우 언리얼 C++] 프로젝트의 재구성 (0) | 2023.10.29 |
---|---|
[이득우 언리얼 C++] 로깅 환경의 설정 (1) | 2023.10.29 |