Unreal5 공부/TIL

2026/04/08 TIL

anna59 2026. 4. 8. 21:10

 

오늘의 목표

  • 아침 코드카타
  • 과제 1번 필수 과제
  • 과제 1번 도전 과제
  • 언리얼 강좌 2-1, 2-2 수강

 

아침 코드카타 (완료)

 

과제 1번 필수 과제

StartLocation

(시작 위치) 저장/기준점으로 사용

 

[과정]

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변수) 를 사용하여 이동/회전/크기변경 적용