APlayerController* UUserWidget::GetOwningPlayer() const
{
return PlayerContext.IsValid() ? PlayerContext.GetPlayerController() : nullptr;
}
template <class TPlayerState = APlayerState>
TPlayerState* GetOwningPlayerState(bool bChecked = false) const
{
if (auto Controller = GetOwningPlayer())
{
return !bChecked ? Cast<TPlayerState>(Controller->PlayerState) :
CastChecked<TPlayerState>(Controller->PlayerState, ECastCheckedType::NullAllowed);
}
return nullptr;
}
GetOwningPlayerState 함수 내부에서 GetOwningPlayer()를 호출하므로
이미 메소드 내에서 GetOwningPlayer() 를 호출하여 캐싱했을 경우
PlayerState는 GetOwningPlayerState 함수보다
GetOwningPlayer()->GetPlayerState() 로 가져오는 것이 더 좋다!
void ATestWidget::FunctionExample()
{
if(m_Ptr == nullptr || m_Ptr->IsValidLowLevel() == false)
{
// 내부 변수의 예외처리를 그 외의 것보다 먼저 하는 것이 좋다!
WL_LOG(Error, TEXT("[m_Ptr] is InValid."));
return;
}
APlayerController* PlayerController = GetOwningPlayer();
if(PlayerController == nullptr || PlayerController->IsValidLowLevel() == false)
{
return;
}
//GetOwningPlayerState 함수를 쓰지 않은 이유 : 해당 함수 안에서 GetOwningPlayer() 호출하므로,
//중복이다
APlayerState* PlayerState = PlayerController->GetPlayerState();
if(PlayerState == nullptr)
{
// PlayerState를 굳이 먼저 쓴 이유 : playerUID 를 가져올 수 있어서 로그를 더 상세히 기술할 수 있음
return;
}
AHUD* HUD = PlayerController->GetHUD();
if(HUD == nullptr || HUD->IsValidLowLevel() == false)
{
// PS를 미리 받아왔기 때문에 이후 로그에는 playerUID 기술 가능
WL_LOG(Error, TEXT("[AHUD] is Invalid. player UID : %d"), PlayerState->GetID());
}
..........
}'Unreal > 팁' 카테고리의 다른 글
| UE4) 모바일에서는 Hover이벤트 들어오지 않는다. (0) | 2022.09.23 |
|---|---|
| 데디에서 스폰 할 때 특정 클라에만 설정..? (0) | 2022.06.08 |
| Widget이 NativeTick() 돌지 않을 때 (0) | 2022.05.15 |
| #pragma once(수정필요) (0) | 2021.04.21 |
| 데디케이트 서버에서 스탯 관리(수정필요) (0) | 2021.04.16 |