언리얼 3d 이동 구현

roberto·2025년 2월 6일
  • 액터클래스가 아닌 폰으로 이동을 구현해보려는데, 유니티로 따지면 CharacterContoller를 안쓰고 구현하는 정도라고 생각하면 될 것 같다.

  • 사실 유니티 개발할 때도 CharacterController를 즐겨 사용하는 편은 아니었다.

  • 이동은 WASD, 회전은 마우스 축으로 주려고 했다.

void AFirstPawn::Move(const FInputActionValue& value)
{
	FVector MoveDir = value.Get<FVector>();

	if (MoveDir.IsNearlyZero())
	{
		return;
	}

	MoveDir = MoveDir.GetSafeNormal();
	UE_LOG(LogTemp, Warning, TEXT("%s"), *MoveDir.ToString());
	const float DeltaTime = GetWorld()->GetDeltaSeconds();
	AddActorLocalOffset(600.0f * DeltaTime * FVector(MoveDir.X, MoveDir.Y, 0));
}

Tick에서 인풋을 받아 쓰는 것이 아니라 따로 인풋을 받아 쓰기 때문에 DeltaTime을 따로 받아와야 한다.

  • 사실 이건 액터랑 별반 차이가 없다.
void AFirstPawn::Look(const FInputActionValue& value)
{
	UE_LOG(LogTemp, Warning, TEXT("%s"), *value.ToString());
	FVector2D LookDirection = value.Get<FVector2D>();

	if (LookDirection.IsNearlyZero())
	{
		return;
	}

	SpringArm->SetRelativeRotation(FRotator(LookDirection.Y + SpringArm->GetDesiredRotation().Pitch,0, 0));
	SetActorRotation(FRotator(0, LookDirection.X + GetActorRotation().Yaw, 0));
}

중요한 건 회전인데, AddControllerYawInput 같은 걸 안쓰고 그냥 회전을 주려고 했다.

  • 스프링암을 따로 회전 시키는 이유는 SetActorRotation으로 같이 회전 시키면 오브젝트 자체가 피치 회전을 하기 때문에 누워 버리는 일이 발생한다.
  • 그래서 스프링암은 SetRelativeRotation을 통해 따로 회전을 주고, Yaw회전은 오브젝트 자체를 돌리는 걸 의도했다.
profile
아마도 개발 관련된 것만 올릴듯한 벨로그

0개의 댓글