액터의 왕복 이동을 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의 방향에 따라 추가적인 계산이 필요합니다.
'게임 개발 공부 > Unreal Engine' 카테고리의 다른 글
이동을 위한 Input Mapping Context (IMC) 매핑 (0) | 2025.01.24 |
---|---|
머티리얼의 요소(Element) 추가 (1) | 2025.01.23 |
리플렉션 등록과 변수 리플렉션 (0) | 2025.01.21 |
C++ 언리얼의 빌드 오류 해결 (0) | 2025.01.20 |
셰이프 모델링 작업한 영역 막힐 때 해결 (1) | 2024.12.19 |