기록
240426~240503 파트너 캐릭터 위치를 나타내는 UI (2)
hayo_su
2024. 5. 4. 15:55
목표 : 다른 캐릭터(파트너)위치를 나타내는 UI를 만들기
- 위젯 만들기 (완료)
- 플레이어에 위젯 컴포넌트로 붙이기 (완료)
- 거리에 따라 위젯 on/off기능 (완료)
- 화면 랜더링 여부에 따라 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을 로그를 통해 확인할 수 있다.