Tick 함수로 Actor의 Transform 조정하기 | [언리얼 엔진 C++ (Unreal Engine C++)]

2026. 6. 5. 23:10·Unreal Engine/UE 기초

Tick 함수로 Actor의 Transform 조정하기 

 


 

Transform 속성 이해하기

 

Actor와 Transform

  • Actor (액터)는 언리얼 엔진에서 게임 세계(월드)에 존재하는 모든 오브젝트를 의미합니다. 건물, 캐릭터, 아이템 등 눈에 보이는 모든 것들이 액터로 표현됩니다.
  • 액터에는 세 가지 중요한 속성이 있습니다.
    1. 위치(Location)
    2. 회전(Rotation)
    3. 크기(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

  • 언리얼 엔진은 게임 실행 중 매 프레임마다 여러 작업을 수행합니다.
    1. 렌더링(Rendering): 화면 그리기 (일반적으로 1초에 60프레임, 120프레임 등)
    2. 물리 연산: 충돌·중력·마찰 등 물리 엔진 처리
    3. 오브젝트 업데이트: 게임 내 액터들의 상태 갱신
  • 특정 액터가 “매 프레임마다” 수행할 로직이 있다면, 언리얼 엔진은 그 액터의 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>

 

 

 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++)]

 

저작자표시 동일조건 (새창열림)
'Unreal Engine/UE 기초' 카테고리의 다른 글
  • UE_LOG & On-Screen Debug Message | [언리얼 엔진 C++ (Unreal Engine C++)]
  • 리플렉션 시스템 (Blueprint 와 C++ 관계, UCLASS, UPROPERTY, UFUNCTION) | [언리얼 엔진 C++ (Unreal Engine C++)]
  • Rotation: Roll, Pitch, Yaw [Transform] | [언리얼 엔진 C++ (Unreal Engine C++)]
  • 언리얼 엔진 Actor의 라이프 사이클, Log 사용 | [언리얼 엔진 C++ (Unreal Engine C++)]
DevCol
DevCol
DevCol (Development Collaboration). 함께 개발 & 공부 & IT 정보 나눔장소
  • DevCol
    DevCol (Development Collaboration)
    DevCol
  • 블로그 메뉴

    • Unreal Engine
    • TIL
    • 게임국가기술자격검정 게임프로그래밍전문가 [한국콘텐츠진흥원]
    • 분류 전체보기 (73) N
      • Unreal Engine (31) N
        • Project (2) N
        • Dev Log (0)
        • Debugging (2) N
        • Blueprint (1)
        • UE 기초 (25) N
        • UE 심화 (0)
        • TA (1) N
      • Programming Language (0)
        • C++ (0)
        • C# (0)
      • Unity Engine (0)
      • 자격증 (3)
        • 게임국가기술자격검정 [한국콘텐츠진흥원] (3)
      • Coding Test | 코딩테스트 (0)
        • 프로그래머스 기초 (0)
        • 프로그래머스 입문 (0)
      • TIL (38) N
        • Boot Camp (32) N
      • Git & Github (1)
  • 링크

    • Youtube
    • GitHub
    • itch.io
    • Blog (En)
  • 공지사항

  • 인기 글

  • 태그

    코드 카타
    UE5
    Programming
    til
    게임 개발
    기초
    C++
    UE
    c
    언리얼 엔진
    내일배움캠프
    Devlog
    Unreal engine
    cpp
    Boot Camp
    Game Dev
    코드카타
    게임개발
    프로그래밍
    Code Kata
  • 최근 글

  • GitHub Youtube itch
  • hELLO · Designed By 정상우.v4.10.6
  • DevCol
    Tick 함수로 Actor의 Transform 조정하기 | [언리얼 엔진 C++ (Unreal Engine C++)]
    상단으로

    티스토리툴바