Tick 기반 이동
액터를 움직이기 위해서는 Tick() 함수에서 매 프레임 위치를 갱신하는 방식이 기본이다.
속도와 DeltaTime을 곱하면 프레임에 상관없이 일정한 속도로 이동할 수 있다.
FVector NewLocation = GetActorLocation() + MoveDir.GetSafeNormal() * MoveSpeed * DeltaTime;
SetActorLocation(NewLocation);
- MoveDir.GetSafeNormal()을 사용해 방향 벡터를 정규화하면 속도가 일정하게 유지된다.
- 이동 범위를 설정해두고, 최대 범위에 도달하면 Flip() 함수를 호출하여 방향을 반전시킬 수 있다.
if(GetMoveDistance() >= MaxRange)
{
InitLocate = GetActorLocation();
Flip();
}
void Flip() { MoveDir *= -1; }
이렇게 하면 액터가 한 방향으로 이동하다가 최대 범위에 도달하면 반대 방향으로 다시 움직이는 반복 이동을 쉽게 구현할 수 있다.
Tick 기반 회전
액터를 회전시키는 방법은 크게 Euler 각도(FRotator)를 사용하는 방법과 쿼터니언(FQuat)을 사용하는 방법이 있다.
오늘은 Gimbal Lock 문제를 피하기 위해 FQuat을 사용했다.
Tick에서 매 프레임 DeltaTime을 곱해 회전 속도를 적용하고, 각 축별로 활성화 여부를 bool 변수로 제어했다.
FQuat deltaQuat = FQuat::Identity;
if (ActiveRoll)
{
deltaQuat *= FQuat(FVector::RightVector, FMath::DegreesToRadians(RollSpeed * DeltaTime));
}
if (ActivePitch)
{
deltaQuat *= FQuat(FVector::UpVector, FMath::DegreesToRadians(PitchSpeed * DeltaTime));
}
if (ActiveYaw)
{
deltaQuat *= FQuat(FVector::ForwardVector, FMath::DegreesToRadians(YawSpeed * DeltaTime));
}
CurrentRotate = deltaQuat * CurrentRotate;
CurrentRotate.Normalize();
SetActorRotation(CurrentRotate);
- Forward, Up, Right 벡터를 기준으로 월드 좌표 회전을 적용했다.
- CurrentRotate에 회전을 누적해 매 Tick마다 새로운 회전 상태로 적용한다.
- 각 축 회전을 bool 변수로 켜고 끌 수 있어, 원하는 축만 선택적으로 회전시키는 것이 가능하다.
핵심 포인트
- Tick에서 DeltaTime을 곱해 이동과 회전을 처리하면 프레임 독립적으로 동작한다.
- 이동 방향을 Flip으로 반전시키면 반복 이동 구현이 쉽다.
- FQuat을 사용하면 축 독립적인 회전이 가능하며, Euler 각도 사용 시 발생할 수 있는 Gimbal Lock 문제를 피할 수 있다.
- 각 축 회전 여부를 bool로 제어하면 유연하게 회전을 조절할 수 있다.
이 방식만 잘 이해하면, 이동하는 발판, 회전하는 장애물 같은 게임 오브젝트를 쉽게 구현할 수 있다.
다음 단계로는 이동과 회전을 동시에 조합해서 자연스러운 움직임을 만드는 실습을 해보면 좋겠다.
'내배캠 TIL' 카테고리의 다른 글
| [내배캠 TIL 260116] Unreal PlayerController 와 Input Mapping Context (0) | 2026.01.16 |
|---|---|
| [내배캠 TIL 260112] Unreal Timer를 활용한 액터 생성 (0) | 2026.01.13 |
| [내배캠 TIL 260109] Unreal 액터의 생명주기 (0) | 2026.01.09 |
| [내배캠 TIL 260108] Unreal & VS 호환 문제 (0) | 2026.01.08 |
| [내배캠 TIL 260106] C++ 머드게임 아이템 자동사용 로직 개발 (0) | 2026.01.06 |