Tick 함수로 Actor의 Transform 조정하기
Transform 속성 이해하기
Actor와 Transform
- Actor (액터)는 언리얼 엔진에서 게임 세계(월드)에 존재하는 모든 오브젝트를 의미합니다. 건물, 캐릭터, 아이템 등 눈에 보이는 모든 것들이 액터로 표현됩니다.
- 액터에는 세 가지 중요한 속성이 있습니다.
- 위치(Location)
- 회전(Rotation)
- 크기(Scale)
- 이 세 가지 속성을 Transform이라고 부르며, 뷰포트 상에서 보통 x축 (빨간색), y축 (초록색), z축 (파란색)으로 표시됩니다.

- 위치 (Location)
- 액터가 월드에서 어느 지점에 있는지를 나타냅니다.
- 예) FVector(100.0f, 200.0f, 300.0f)라면 월드의 x축으로 100, y축으로 200, z축으로 300만큼 떨어진 위치를 의미합니다.
- 회전 (Rotation)
- 액터가 어느 방향을 바라보는지, 어떤 각도로 기울어져 있는지를 나타냅니다.
- 언리얼 C++에서는 주로 FRotator(Pitch, Yaw, Roll) 형태로 표현합니다. (X,Y,Z 가 아닙니다)
- Roll: 좌우로 기울어지는 회전 (x축을 축으로 하는 회전)
- Pitch: 앞뒤 방향의 기울어짐 (y축을 축으로 하는 회전)
- Yaw: 좌우 방향 회전 (z축을 축으로 하는 회전)
- 즉 언리얼 FRotator 에서는 (Y Z X) | (Pitch, Yaw, Roll)
[Unreal Engine/UE 기초] - Rotation: Roll, Pitch, Yaw [Transform] | [언리얼 엔진 C++ (Unreal Engine C++)]
- 스케일 (Scale)
- 액터의 크기 비율입니다. FVector(X, Y, Z) 형태로 표현되며, 예) FVector(2.0f, 2.0f, 2.0f)는 기본 크기의 2배를 의미합니다.
유니티 에디터에서 변경 단축키: Q(Select Object) W(Translate) E(Roate) R(Scale)

출처: https://magazine.weverse.io/article/view/1534?lang=ko
....
- 언리얼 에디터에서 액터를 선택하면 3D Gizmo(화살표, 회전 핸들, 스케일 핸들)을 마우스로 직접 움직여서 위치·회전·스케일을 조정할 수 있습니다.
- 단축키 W: 이동(Translate)
- 단축키 E: 회전(Rotate)
- 단축키 R: 스케일(Scale)

FTransform 자료형
- 언리얼 엔진에는 위치, 회전, 스케일을 하나로 묶어 효율적으로 관리하기 위한 구조체인 FTransform이 있습니다.
- FTransform은 내부적으로 다음 세 요소를 보관합니다.
- Translation: 위치를 표현하는 FVector
- Rotation: 회전을 표현하는 FRotator
- Scale3D: 스케일을 표현하는 FVector
- FTransform을 활용하면 위치·회전·스케일을 한 번에 다룰 수 있어, Transform 관련 연산을 보다 편리하게 처리할 수 있습니다.
좌표계의 개념
- 월드 좌표계 (World Space)
- 게임 전체 세계를 기준으로 한 절대적인 좌표계입니다.
- SetActorLocation(), GetActorLocation()처럼 액터 자체를 이동·회전·스케일할 때 대부분 월드 좌표계를 기준으로 합니다.
- 로컬 좌표계 (Local Space)
- 액터 자신이나 부모 액터 (또는 부모 컴포넌트)의 Transform을 기준으로 한 상대적인 좌표계입니다.
- 계층 구조 (부모-자식 관계)가 있는 경우, 자식은 부모의 Transform에 종속되어 움직입니다.
부모-자식 컴포넌트 관계
- 액터에는 여러 컴포넌트가 붙을 수 있으며, 최상위에 있는 **루트 컴포넌트 (Root Component)**를 기준으로 다른 컴포넌트들이 Attach (부착) 관계를 맺을 수 있습니다.
- 부모 액터 (또는 부모 컴포넌트)가 이동·회전·스케일되면 자식들은 상대 좌표값에 따라 함께 이동합니다.
- 부모-자식 관계가 맺어져 있다면,
- GetRelativeTransform(): 부모 기준의 상대 위치·회전·스케일을 가져옴
- SetRelativeLocation(), SetRelativeRotation(): 부모 기준으로 자식의 위치·회전을 조정
- 이처럼 로컬 좌표계를 적절히 활용하면, 여러 컴포넌트를 한꺼번에 움직이거나, 특정 컴포넌트만 부모 기준으로 움직이게 만들 수 있습니다.
C++ 코드로 Transform 다루기
Transform 조정 함수
- 게임 로직에서 액터의 Transform을 변경하고 싶다면, C++ 또는 블루프린트 함수를 사용합니다. 대표적인 함수들은 아래와 같습니다.
- SetActorLocation(FVector NewLocation): 액터 위치 이동
- SetActorRotation(FRotator NewRotation): 액터 회전
- SetActorScale3D(FVector NewScale): 액터 스케일 변경
- GetActorLocation(), GetActorRotation(), GetActorScale3D(): 현재 Transform 정보 가져오기
- SetActorTransform(FTransform NewTransform): 위치·회전·스케일을 한 번에 설정
BeginPlay() 함수에서 Transform 변경
- 현재 임시로 배치된 액터의 Transform 위치를 확인해봅니다.
- 아래는 Item 액터를 예로 들어, 액터가 생성된 직후(BeginPlay())에 특정 위치, 회전, 스케일을 설정하는 코드입니다.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "AItem.generated.h"
UCLASS()
class SPARTAPROJECT_API AItem : public AActor
{
GENERATED_BODY()
public:
AItem();
protected:
USceneComponent* SceneRoot;
UStaticMeshComponent* StaticMeshComp;
**** virtual void BeginPlay() override;
};
void AItem::BeginPlay()
{
Super::BeginPlay();
// 위치, 회전, 스케일 설정하기
// (300, 200, 100) 위치로 이동
SetActorLocation(FVector(300.0f, 200.0f, 100.0f));
// Yaw 방향으로 45도 회전
SetActorRotation(FRotator(0.0f, 45.0f, 0.0f));
// 모든 축을 2배로 스케일
SetActorScale3D(FVector(2.0f)); // 동일 == SetActorScale3D(FVector(2.0f,2.0f,2.0f));
}
- BeginPlay()는 액터가 월드에 배치된 후 초기화가 끝나면 자동으로 호출됩니다. 여기서 SetActorLocation 등으로 Transform을 바꾸면 게임 시작과 동시에 적용됩니다.
- SetActorScale3D(FVector(2.0f))와 같이 스케일 값을 통일하면, 모든 축 (x, y, z)이 같은 비율로 확대·축소됩니다.
- SetActorScale3D(FVector(2.0f)); // 동일 == SetActorScale3D(FVector(2.0f,2.0f,2.0f));
- 빌드 후 언리얼 에디터에서 플레이하면, Outliner → Item 액터 Details 패널에서 새로운 Transform이 적용된 것을 확인할 수 있습니다.
SetActorTransform (한번에 Location, Rotation, Scale 변경)
SetActorTransform(FTransform NewTransform): 위치·회전·스케일을 한 번에 설정
// SetActorTransform(FTransform NewTransform): 위치·회전·스케일을 한 번에 설정
FVector NewLocation = FVector(300, 0.0f, 0.0f);
FRotator NewRotation = FRotator(0.0f, 90.0f, 0.0f);
FVector NewScale = FVector(2.0f);
SetActorTransform(FTransform(NewRotation, NewLocation, NewScale));
SetActorLocation(NewLocation);
Tick 함수와 프레임 독립적인 로직
게임 프레임 업데이트와 Tick
- 언리얼 엔진은 게임 실행 중 매 프레임마다 여러 작업을 수행합니다.
- 렌더링(Rendering): 화면 그리기 (일반적으로 1초에 60프레임, 120프레임 등)
- 물리 연산: 충돌·중력·마찰 등 물리 엔진 처리
- 오브젝트 업데이트: 게임 내 액터들의 상태 갱신
- 특정 액터가 “매 프레임마다” 수행할 로직이 있다면, 언리얼 엔진은 그 액터의 Tick(float DeltaTime) 함수를 매 프레임 호출해줍니다.
Tick 함수 활성화하기
- 액터를 생성할 때 기본적으로 Tick() 함수를 사용하려면, 아래와 같이 생성자에서 설정해야 합니다.
- PrimaryActorTick.bCanEverTick = true;
- bCanEverTick가 false면 엔진은 성능 최적화를 위해 해당 액터의 Tick을 호출하지 않습니다.
- 불필요한 Tick 호출은 성능에 부담을 줄 수 있으므로, 사용하지 않는다면 false를 명시해주어 최적화 효과와 코드 명확성을 높이세요.
DeltaTime이란?
- Tick(float DeltaTime) 함수에서 DeltaTime은 “직전 프레임부터 현재 프레임까지 걸린 시간(초)”입니다.
- 60 FPS 경: DeltaTime ≈ 1/60초 ≈ 0.0167초
- 120 FPS 환경: DeltaTime ≈ 1/120초 ≈ 0.0083초
- 프레임 레이트가 높을수록 DeltaTime이 작아지고, 낮을수록 DeltaTime이 커집니다.
DeltaTime을 활용한 프레임 독립적인 움직임
- 단순히 “매 프레임마다 X 좌표를 1씩 증가”시키면, FPS가 높을수록 더 빨리 움직여 게임 체감 속도가 달라집니다.
- 이를 방지하려면, DeltaTime을 곱해서 초 단위 기준으로 이동·회전을 계산해야 합니다.
- 예) 초당 100만큼 이동하고 싶다면: 100 * DeltaTime을 매 프레임마다 더해줌
- 60 FPS → 한 프레임당 1.67씩 이동, 60 프레임 곱하면 100
- 120 FPS → 한 프레임당 0.83씩 이동, 120 프레임 곱하면 100
- 이처럼 어느 FPS 환경에서도 동일한 실제 속도를 유지할 수 있습니다. </aside>
- 예) 초당 100만큼 이동하고 싶다면: 100 * DeltaTime을 매 프레임마다 더해줌
Tick 함수와 DeltaTime을 활용한 회전 구현하기
회전 속도 변수와 Tick 함수 선언
- FMath::IsNearlyZero는 부동소수점 비교에서 안전하게 0에 가까운지 확인해주는 함수입니다.
- RotationSpeed = 360.0f면 1초에 한 바퀴(360도) 회전, 180.0f면 2초에 한 바퀴 회전하게 됩니다.
- AddActorLocalRotation()은 액터의 로컬 기준으로 회전을 추가해주는 함수입니다.
- 만약 월드 좌표 기준으로 회전하고 싶다면 AddActorWorldRotation()을 사용할 수도 있습니다.
회전 테스트
- RotationSpeed 값에 따라 회전 속도가 달라지는 것을 테스트 해볼 수도 있습니다.
- 만약 Pitch나 Roll 방향 회전을 주고 싶다면, FRotator(Pitch, Yaw, Roll) 부분을 적절히 수정하면 됩니다.
- 이 원리를 이동 (Translate)에도 동일하게 적용할 수 있습니다. 예를 들어, AddActorWorldOffset()에 DeltaTime을 곱해주면 초당 이동 거리를 일정하게 만들 수 있습니다.
Conclustion
추천
[페이지] Unreal Engine | 언리얼 엔진
[Unreal Engine/UE 기초] - Rotation: Roll, Pitch, Yaw [Transform] | [언리얼 엔진 C++ (Unreal Engine C++)]