대난투 팀 프로젝트(Project_CS) - 3

정완훈·2025년 4월 11일

주제: UI 작업 초안 완성 및 관련 클래스 연동 구조 학습

원래 GameMode랑 GameState 쪽 C++ 코드를 만지고 있었는데, 갑자기 UI 담당으로 역할이 바뀌면서 UMG 위젯 작업에 집중하게 됐다. 덕분에 하루 종일 위젯 블루프린트랑 씨름한 듯.

작업 내용 & 배운 점:

  1. 요구사항 변경 대처: 처음엔 기존 코드 개선이었는데, 메인 메뉴부터 로비(대전/협동 분리), 인게임 HUD(아케이드/대전/협동)까지 새로 만드는 걸로 바뀌었다. 특히 멀티플레이 진입 방식이 몇 번이나 바뀌어서 좀 헷갈렸다. (Host/Join 버튼 -> 자동 FindOrCreate -> NetMode 체크 -> 최종적으로 GameInstance 콜백에서 HasAuthority 체크 방식으로 결정!) 튜토리얼이랑 보스 레벨도 기획 변경으로 정리됐다.

  2. C++ 위젯 기반 설계: UI 구조를 잡기 위해 C++ 부모 클래스들을 먼저 만들었다. (UCSUIBaseWidget, UCSMainMenu, UCSInGameHUD, UCSStageHUD, UCSLobbyBaseWidget, UCSVersusLobbyWidget, UCSCoopLobbyWidget, UCSPlayerEntry) 이렇게 하니 블루프린트에서는 디자인이랑 세부 로직 구현에 더 집중할 수 있을 것 같다.

  3. BindWidget과 블루프린트 연동: C++에서 UPROPERTY(meta = (BindWidget))로 선언한 변수가 BP 이벤트 그래프의 'My Blueprint' 패널에 바로 뜨지 않아서 당황했다. BlueprintReadOnly 지정자를 추가해야 변수 목록에 나오고 드래그해서 쓸 수 있다는 걸 배웠다. 아니면 함수 노드의 Target에 My Blueprint 패널의 변수를 드래그해서 연결하는 방법도 있다는 걸 알았다. WBP_PlayerEntry의 UI 업데이트 로직 구현 방법을 이걸로 해결!

  4. 캐릭터(직업) 선택: 이것도 C++에서 버튼 동적 생성하고 람다나 공통 핸들러로 연결하려니 복잡했는데, 그냥 각 캐릭터 버튼의 OnClicked 이벤트를 BP에서 만들어서 C++ 함수(HandleCharacterSelected)를 직접 호출하는 게 훨씬 깔끔하다는 결론을 내렸다. (나중에 작업 예정)

  5. 수많은 C++ 오류와의 사투: 헤더 파일 누락(include), 접근 지정자(private 멤버 접근), BlueprintNativeEvent 오버라이드 시 UFUNCTION() 중복 선언, TObjectPtr 멤버 접근 (-> 사용 및 Null 체크), 특히 끈질겼던 FOnlineSessionSearchResultclass/struct 정의 충돌 (헤더 포함 순서 문제!) 등 다양한 컴파일 오류를 잡았다. 프로젝트 클린 & 리빌드는 정말 중요하다...

  6. UI 표시 문제 해결:

    • 아케이드 모드 진입 시 메인 메뉴가 안 사라지는 문제는 OpenLevel 전에 RemoveFromParent()를 호출해서 해결했다.
    • 로비 UI가 안 뜨던 문제는 PlayerControllerInitializeCurrentUI 함수가 Client_ShowLobbyUI가 띄운 위젯을 지워버리는 문제였다. LobbyLevel 진입 시 InitializeCurrentUI 로직을 건너뛰도록 수정해서 해결!

현재 상태 및 다음 작업:

  • 메인 메뉴(WBP_MainMenu), 로비 베이스 및 파생(WBP_VersusLobby, WBP_CoopLobby), 플레이어 엔트리(WBP_PlayerEntry), 인게임 HUD 베이스(WBP_StageHUD)의 C++ 구조 및 블루프린트 연동 초안 완성.

  • 아케이드 HUD (WBP_StageHUD) 기능 구현 방법 정리 완료:

    • 남은 적 수 표시: ACSSingleGameState::OnRep_DeadAICount에서 UpdateRemainingAI 이벤트 호출 필요.
    • 보스 등장 연출: BP_BossGate 오버랩 시 TriggerBossAppearSequence 이벤트 호출 방식으로 변경 가능 (UI/BP 작업).
  • 플레이어 머리 위 체력 바: Widget Component 필요 (팀원 작업 요청).

  • 보류/협업 필요:

    • 멀티플레이 안정성: 로그 중복 문제, PostLogin 중복 호출 의심 등은 GameInstance/GameMode 담당 팀원과 추가 확인 필요.
    • 로비 기능 활성화: HandleCharacterSelected, OnReadyClicked, OnChangeTeamClicked 내부의 RPC 호출 주석 해제 후 실제 기능 테스트 필요.
    • 로비 -> 게임 레벨 이동: LevelData 테이블 정확성 검증 필수!

UI 구조 잡고 오류 잡느라 진땀 뺐지만, 이제 각 위젯 블루프린트 디자인이랑 세부 로직 구현에 들어갈 수 있겠다.

0개의 댓글