UFDLobbyWidget이라는 C++ 클래스를 부모로 두고, 그걸 상속한 WBP_LobbyWidget을 팀원이 디자인하도록 만들었음

 

UCLASS()
class FUNNYORDIE_API UFDLobbyWidget : public UUserWidget
{
    GENERATED_BODY()

protected:
    UPROPERTY(meta = (BindWidget))
    UButton* StartButton;

    UPROPERTY(meta = (BindWidget))
    UTextBlock* WaitingText;

    UFUNCTION()
    void OnStartButtonClicked();

public:
    UFUNCTION(BlueprintCallable, Category = "Lobby")
    void UpdateHostUI(bool bIsHost, bool bCanStart);
};

 

버튼 이름은 StartButton, 텍스트 이름은 WaitingText로만 맞춰주면 색깔/폰트/레이아웃/애니메이션은 자유롭게 해도 됨

(로직을 연결시켜두고 디자인만 맡기는 형태)

 

클릭 → 서버까지 가는 경로

클라이언트 화면에서 일어난 일이 서버의 GameMode에 닿으려면 PlayerController를 거쳐야 한다.

void UFDLobbyWidget::OnStartButtonClicked()
{
    if (AFDLobbyPlayerController* LobbyPC = Cast<AFDLobbyPlayerController>(GetOwningPlayer()))
    {
        LobbyPC->ServerRPC_RequestStartMatch();
    }
}

 

GetOwningPlayer()로 이 위젯이 누구의 화면인지를 자동으로 찾아오고, 그 컨트롤러의 Server RPC를 호출하면 네트워크를 타고 서버 쪽 _Implementation이 실행됨

문제 (이후 수정 예정)

1초 간격 타이머로 PlayerController가 직접 bIsHost와 현재 인원수를 확인해 위젯에 반영하게 함

(인원이 다 차야 start가 눌리니까)

- 이후에 로직 수정 예정

GetWorldTimerManager().SetTimer(RefreshTimerHandle, this,
    &AFDLobbyPlayerController::RefreshLobbyUI, 1.0f, true);

 

 

그래도 기본 골격은 만들어놓고 넘기는 게 피차 편할 것 같아서 WBP 골격을 만듦

 

  • Canvas 깔고 그 위에 button과 text 놓고 이름을 정확히 StartButton, WaitingText로 변경
  • AFDLobbyPlayerController의 LobbyWidgetClass 슬롯에 WBP_LobbyWidget 끼워넣기

 

일단 이렇게 만들어두고 나머지 디자인을 팀원에게 맡김

+ Recent posts