• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    해결됨

스프링암의 Use Pawn Control Rotation적용 질문이 있습니다.

23.11.04 00:02 작성 23.11.04 00:03 수정 조회수 349

0

Use Pawn Control Rotation을 켜면 컨트롤러 회전값을 해당 컴포넌트의 rotation에 적용한다고 이해했었는데요.

이것만 켜면 마우스로 인한 컨트롤러 회전값 변화가 스프링암에 적용되어 스프링 암이 회전할 거라고 생각했는데

스프링암에 있는 부모의 회전값을 상속받는 옵션을 켜야만 작동이 되는 것을 확인했습니다.

어떤 이유로 스프링암의 부모컴포넌트의 회전값을 상속받아야지만 작동되는지 알수있을까요?

 

반대로 Use Pawn Control Rotation을 끄고 회전값 상속을 하니 무조건 캐릭터의 뒷면만 보게끔 되는것을 확인했습니다. 이러한 동작은 이해가 되었습니다.

답변 1

답변을 작성해보세요.

1

언리얼 엔진의 프레임웍은 단순 기능 온오프가 아닌 경우가 많아 말로 설명하긴 어렵고 코드를 보면서 이해를 해야합니다. 가급적이면 직접 소스 코드를 검색해보는 훈련을 해보시기 바랍니다.

Ctrl+Shift+F를 사용해 UsePawnControlRotation을 검색해보면 다음과 같은 코드를 볼 수 있습니다.

 

if (bUsePawnControlRotation)
{
	if (APawn* OwningPawn = Cast<APawn>(GetOwner()))
	{
		const FRotator PawnViewRotation = OwningPawn->GetViewRotation();
		if (DesiredRot != PawnViewRotation)
		{
			DesiredRot = PawnViewRotation;
		}
	}
}

 

코드를 해석하면 스프링암은 자신을 소유하는 폰의 ViewRotation으로 자기의 최종 목적 회전인 DesiredRotation을 설정합니다.
폰의 ViewRotation은 컨트롤러가 있는 경우 컨트롤러의 컨트롤 회전이되고 없으면 액터(폰)의 회전이 됩니다.

 

FRotator APawn::GetViewRotation() const
{
	if (Controller != nullptr)
	{
		return Controller->GetControlRotation();
	}
	else if (GetLocalRole() < ROLE_Authority)
	{
		// check if being spectated
		for (FConstPlayerControllerIterator Iterator = GetWorld()->GetPlayerControllerIterator(); Iterator; ++Iterator)
		{
			APlayerController* PlayerController = Iterator->Get();
			if (PlayerController &&
				PlayerController->PlayerCameraManager &&
				PlayerController->PlayerCameraManager->GetViewTargetPawn() == this)
			{
				return PlayerController->BlendedTargetViewRotation;
			}
		}
	}

	return GetActorRotation();
}

 

themoon007님의 프로필

themoon007

질문자

2023.11.04

감사합니다.

말씀듣고 코드 첨부해주신 bUsePawnControlRotation 사용하는 곳을 봤더니

상속을 안 받을 경우, 강제로 LocalRelativeRotation를 DesiredRot에다가 덮어 씌우는 코드가 있네요.

이것 때문인 것 같습니다.