기록

240426~240503 파트너 캐릭터 위치를 나타내는 UI (2)

hayo_su 2024. 5. 4. 15:55

목표 : 다른 캐릭터(파트너)위치를 나타내는 UI를 만들기 

  1. 위젯 만들기 (완료)
  2. 플레이어에 위젯 컴포넌트로 붙이기 (완료)
  3. 거리에 따라 위젯 on/off기능 (완료)
  4. 화면 랜더링 여부에 따라 on/off기능 + 랜더링이 되지 않을 때 화면에서 방향을 가르키도록 하기(진행 중)

4. 화면 랜더링 여부에 따라 on/off기능 + 랜더링이 되지 않을 때 화면에서 방향을 가르키도록 하기

고민됐던 점

1. 화면 랜더링 여부 확인하기(완료)

2. 랜더링 되지 않았을 때 화면에 어떻게 표현할 것인지.


// Get the player's viewport size
int32 ViewportX, ViewportY;
_PlayerController->GetViewportSize(ViewportX, ViewportY);

 

1. 조종하는 플레이어의 ViewPort사이즈를 가져온다.

ViewportX, ViewportY에 정보를 담아 리턴해준다.

 

APlayerController::GetViewportSize

Helper to get the size of the HUD canvas for this player controller. Returns 0 if there is no HUD

docs.unrealengine.com


// Convert the actor's location to screen space
FVector2D ActorScreenPosition;
if (!_PlayerController->ProjectWorldLocationToScreen(GetComponentLocation(), ActorScreenPosition))
{
    return false; // Failed to project actor's location to screen space
}

 

2. 위젯 컴포넌트를 World공간에서 View공간으로 이동한 위치정보를 가져오는 함수를 이용하였다.

ActorScreenPosition에 컴포넌트 위치를 담아 리턴해준다.

 

APlayerController::ProjectWorldLocationToScreen

Convert a World Space 3D position into a 2D Screen Space position.

docs.unrealengine.com


// 화면 안에 존재할 때
if ((ActorScreenPosition.X >= 0 && ActorScreenPosition.X <= ViewportX &&
    ActorScreenPosition.Y >= 0 && ActorScreenPosition.Y <= ViewportY))
{
	UE_LOG(LogTemp, Display, TEXT("rendering"));
    return true;
}
else // 화면 밖으로 나갔을 때
{
	UE_LOG(LogTemp, Display, TEXT("not rendering%f %f"), ActorScreenPosition.X, ActorScreenPosition.Y);
	return false;
}

 

3. Viewport와 ActorScreenPosition를 통해 화면에 랜더링하는지 여부를 확인한다.

로그를 통해 확인!

 

 

 다른 플레이어(파트너)가 보이면 rendering을, 화면 프로젝션 뷰에 존재하지 않는경우 not rendering을 로그를 통해 확인할 수 있다.