2026/04/08 TIL
오늘의 목표
- 아침 코드카타
- 과제 1번 필수 과제
- 과제 1번 도전 과제
- 언리얼 강좌 2-1, 2-2 수강
아침 코드카타 (완료)
과제 1번 필수 과제
(시작 위치) 저장/기준점으로 사용
[과정]
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "MovingActor|Properties")
FVector3d StartLocation;
FVector3d를 사용해 시작 Location의 위치를 저장하려고 했다.
그러나 다음과 같은 오류가 발생했다.
Type 'FVector3d' is not supported by blueprint. Class: AMovingActor Property: StartLocation
블루프린트에서 FVector3d를 지원하지 않아서 생긴 오류이다.
대신 블루프린트에서 지원하는 FVector로 변환시켰다.
최종적으로 시작 위치, 이동 속도, 최대 이동 범위를 다음과 같이 정의했다.
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "MovingActor|Properties")
FVector StartLocation;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MovingActor|Properties")
float MoveSpeed;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MovingActor|Properties")
float MaxRange;
다음으로 생성자에 이 변수들을 초기화해준다.
AMovingActor::AMovingActor()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
SetActorLocation(StartLocation); // 시작 위치 설정 (현재 디폴트값으로 (0.0f, 0.0f, 0.0f)
MoveSpeed = 10.0f;
MaxRange = 100.0f;
}
AddActorLocalTransform()을 사용해서 움직이는 것을 구현해보려고 한다.
해당 함수가 받는 인자는 다음과 같다.
const FTransform& NewTransform
사용 예시
// 액터를 현재 로컬 위치에서 전방(Local Forward)으로 100 유닛, 90도 회전 추가
FTransform DeltaTransform;
DeltaTransform.SetLocation(FVector(100.f, 0.f, 0.f));
DeltaTransform.SetRotation(FRotator(0.f, 90.f, 0.f).Quaternion());
AddActorLocalTransform(DeltaTransform);
이를 응용해서 다음과 같이 작성했다.
void AMovingActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
FTransform DeltaTransform;
DeltaTransform.SetLocation(FVector(MoveSpeed * DeltaTime, 0.0f, 0.0f));
AddActorLocalTransform(DeltaTransform);
}
내가 선택한 StaticMesh가 칼이라, 날 방향에 맞게 날아갈 수 있도록 조절해줬다.
이제 루프를 구현해보겠다.
[구상]
이동 거리를 계산해서 MaxRange가 되면 방향을 전환시키도록 구현해보겠다.
void AMovingActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
FTransform DeltaTransform;
if (MoveRange >= MaxRange)
{
MoveSpeed *= -1; // 방향 바꾸기
MoveRange = 0;
}
DeltaTransform.SetLocation(FVector(0.0f, MoveSpeed * DeltaTime, 0.0f));
MoveRange += abs(MoveSpeed* DeltaTime); // 이동 거리 합하기
AddActorLocalTransform(DeltaTransform);
}
정상작동한다.
내가 움직이게 하려고 하는 액터의 스태틱 메쉬가 칼이어서, 방향을 바꿀 때 칼날 방향도 같이 바뀌도록 하려고 했다.
if (MoveRange >= MaxRange)
{
// 이동 방향 바꾸기
MoveSpeed *= -1;
MoveRange = 0;
// 칼날 방향 바꾸기
DeltaTransform.SetRotation(FRotator(180.0f, 0.0f, 0.0f).Quaternion());
}
이렇게 작성했는데 칼이 이렇게 부들댄다.

void AMovingActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
if (MoveRange >= MaxRange)
{
// 이동 방향 바꾸기
MoveSpeed *= -1;
MoveRange = 0;
// 칼날 방향 바꾸기
DeltaTransform.SetRotation(FRotator(180.0f, 0.0f, 0.0f).Quaternion());
}
DeltaTransform.SetLocation(FVector(0.0f, MoveSpeed * DeltaTime, 0.0f));
MoveRange += abs(MoveSpeed* DeltaTime); // 이동 거리 합하기
AddActorLocalTransform(DeltaTransform);
}
원인은 내가 매 프레임마다 적용되는 변화값 DeltaTransfrom에 회전값을 넣었기 때문이었다. 한 번만 회전시키도록 변경하도록 하자.
AddActorLocalRotation(FRotator(0.0f, 180.0f, 0.0f));
이렇게 바꿨더니 칼의 방향이 회전됨에 따라 이동 방향도 바뀌어서, 한 곳으로 계속 나아가는 버그가 생겼다.
기존의 이동 방향을 변경하는 로직을 삭제해준다.
다 만들고 났더니 이동 발판을 만드는 과제였던 것 같아서 (...) 발판에 맞춰 로직을 다시 만들었다.

오늘의 배운 점
C++에서 액터를 이동/회전시키는 방법.
특히 local을 기준으로 액터를 이동/회전시킬 경우 시키고 싶은 동작에 따라 방향을 잘 생각해서 코드를 구현해야 한다. 액터를 회전시키면 월드 기준에서는 이동 방향 등이 변하기 때문이다.
개념 정리
AddActorLocalTransform( const FTransform& NewTransform )
Transform (Location, Rotation, Scale 정보를 다 가지고 있다)만큼 액터를 이동/회전/크기변경 시키는 함수.
사용법: Transform 변수 생성. 해당 변수에 SetLocation / SetRotation / SetScale3D 함수를 사용하여 변경값을 저장 후, AddActorLocalTransform(Transform변수) 를 사용하여 이동/회전/크기변경 적용