본문 바로가기

Unreal/팁

Jam's Tip

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());
    }
    
    				..........
}