게임 개발 공부/Unreal Engine

SetActorLocation()과 AddActorLocalOffset() 비교

Vetenir 2025. 1. 22. 21:00

액터의 왕복 이동을 Tick()에서 SetActorLocation()과 AddActorLocalOffset()로

각각 구현해보고 비교해보겠습니다.

SetActorLocation()

AItem::AItem()
{
	LocationMoveSpeed = 100.0f;
}

void AItem::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

	// 현재 위치 가져오기
	FVector CurrentLocation = GetActorLocation();

	// 위치가 범위를 벗어나면 방향 변경
	if (CurrentLocation.Y >= 1000.0f || CurrentLocation.Y <= 0.0f)
	{
    	LocationMoveSpeed *= -1; // 방향 변경
	}

	// 속도를 기반으로 위치 계산
	CurrentLocation.Y += LocationMoveSpeed * DeltaTime;

	// 새로운 위치 설정
	SetActorLocation(CurrentLocation);
}

 

AddActorLocalOffset()

AItem::AItem()
{
	LocationMoveSpeed = 100.0f;
}

void AItem::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);

    // 현재 위치 가져오기
    FVector CurrentLocation = GetActorLocation();

    // 위치가 범위를 벗어나면 방향 변경
    if (CurrentLocation.Y >= 1000.0f || CurrentLocation.Y <= 0.0f)
    {
        LocationMoveSpeed *= -1; // 방향 변경
    }

    // 이동할 오프셋 계산
    FVector Offset = FVector(0.0f, LocationMoveSpeed * DeltaTime, 0.0f);

    // Actor 이동
    AddActorLocalOffset(Offset);
}

 

단순 왕복 구현에서는 코드에서 큰 차이없이 구현할 수 있습니다.

하지만 회전과 같은 다른 요소가 추가 된다면 달라집니다.

 

회전이 있는 코드로 구현

SetActorLocation() - 액터가 돌면서 직선으로 나아감

AItem::AItem()
{
	LocationMoveSpeed = 100.0f;
    RotationValue = 100.0f;
}

void AItem::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

	FVector CurrentLocation = GetActorLocation();
	FRotator CurrentRotation = GetActorRotation();

	CurrentLocation.Y += LocationMoveSpeed * DeltaTime;
	CurrentRotation.Yaw += RotationValue * DeltaTime;

	SetActorLocation(CurrentLocation);
	SetActorRotation(CurrentRotation);
}

 

AddActorLocalOffset() - 액터가 원을 그리며 이동

AItem::AItem()
{
	LocationMoveSpeed = 100.0f;
    RotationValue = 100.0f;
}

void AItem::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

	FVector VectorOffset = FVector(0.0f, LocationMoveSpeed * DeltaTime, 0.0f);
	FRotator RotatorOffset = FRotator(0.0f, RotationValue * DeltaTime, 0.0f);

	AddActorLocalOffset(VectorOffset);
	AddActorLocalRotation(RotatorOffset);
}

 

차이점

  • SetActorLocation()의 경우 월드 좌표계를 기준으로 동작.
  • AddActorLocalOffset()의 경우 로컬 좌표계를 기준으로 동작.

 

참고 사항

  • AddActorLocalOffset()을 AddActorWorldOffset()으로 바꾸면 SetActorLocation()처럼 월드 좌표계를 기준으로 동작합니다.
  • AddActorLocalOffset()의 경우. bSweep, bTeleport 를 이용할 수 있습니다.

https://velog.io/@whoamicj/UE5-TIL-13-AddActorLocalRotation-AddActorLocalOffset

 

[UE5] TIL - 13 <AddActorLocalRotation, AddActorLocalOffset>

AddActorLocalOffset의 bSweep에서 목적지 위치로 가는 도중에 중첩을 발생시킬지, 아니면 충돌검사를 해서 충돌했을때 멈추게 할지를 정할 수 있었다. AddActorLocalRotation으로 물체를 회전하는 방법에 대

velog.io

 

 

만약 SetActorLocation() 으로 AddActorLocalOffset() - 액터가 원을 그리며 이동을 구현하려고 한다면

AItem::AItem()
{
	LocationMoveSpeed = 100.0f;
	RotationValue = 100.0f;
}

void AItem::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

	FVector CurrentLocation = GetActorLocation();
	FRotator CurrentRotation = GetActorRotation();
	FVector ForwardVector = CurrentRotation.Vector(); // Rotation에 따라 이동 방향 계산

	// ForwardVector를 기반으로 Location 업데이트
	CurrentLocation += ForwardVector * LocationMoveSpeed * DeltaTime;

	// Rotation 업데이트
	CurrentRotation.Yaw += RotationValue * DeltaTime;

	SetActorLocation(CurrentLocation);
	SetActorRotation(CurrentRotation);
}

 

이렇게 Rotation의 방향에 따라 추가적인 계산이 필요합니다.