1 분 소요

Unreal/C++ 과제 9 - 숫자 야구 게임

Git Page

과제 소개 및 목표

숫자 야구를 구현하면서 Unreal의 Dedicated Server에 대하여
익숙해지기

구현 기능


필수 기능

  • GameModeBase를 통한 숫자 야구 판정 규칙
  • PlayerState를 이용한 시도 횟수 관리
  • 승부 및 게임 리셋용 기능 구현

도전 기능

  • 턴 제어 기능 + 남은 시간 UI
  • 턴 종료 후, 기회 소진

클래스 설명

TaskGameModeBase
- 숫자 야구를 진행하는 게임 모드(규칙)
- PostLogin을 통해 유저들을 받은 후, 2명 이상이 모였다면 게임 실행
- 숫자 야구의 숫자 생성 및 판정
- 승패 판단 및 재시작 진행
- 턴 판단 및 턴 넘김

TaskGameState
- 실제 사용하는 턴 시간에 대한 관리

TaskPlayerState
- 플레이어 이름 및 최종 추론 횟수 등을 관리
- 현재 자신의 턴인지 관리

TaskPlayerController
- 여러 Widget Class를 담음
- 입력 String을 GameMode로 보내 검사받도록 함
- 자신의 턴이 아니거나, 추론 횟수를 다 썼다면 GameMode에 보낼 수 없음

TaskChatInput
- 입력 UI로서 입력된 String을 PlayerController로 보내줌

트러블 슈팅 - 클라이언트 측의 PlayerState의 Turn이 갱신되지 않았던 문제

Image

// TaskPlayerState.h

UPROPERTY(Replicated)
bool bMyTurn;
  • bMyTurn의 속성이 Replicated 설정이 되어있음에도 불구하고
    Client에선 확인할 수 없었던 문제가 존재하였다

왜 그럴까 싶었는데…

void ATaskPlayerState::GetLifetimeReplicatedProps(TArray<class FLifetimeProperty>& OutLifetimeProps) const
{
	Super::GetLifetimeReplicatedProps(OutLifetimeProps);

	// 현재 클래스의 Replication Descriptor Table 을 생성하여 NetDriver에 전달
	DOREPLIFETIME(ThisClass, PlayerNameString);
	DOREPLIFETIME(ThisClass, CurrentGuessCount);
	DOREPLIFETIME(ThisClass, MaxGuessCount);
}
  • 생각해보니 GetLifetimeReplicatedProps 부분에 추가해주는 걸 깜빡했었다
  • 서버 측에 아직 익숙치 않다보니 한 실수…

9번 과제 후기

트러블 슈팅에도 하나 적었지만
여러모로 잔 실수가 많았다

  • 특히 초기화 순서에 대한 실수가 잦았다…
    ex) 시작 플레이어만 Turn 진행하고 싶었으나
    bMyTurn이 모든 Player에 False로 나옴
    뭐가 문제인가 싶었는데
    시작 플레이어를 True로 세팅한 후, 그 다음에
    모든 Player를 False로 밀고 있었다…

  • 이미 어느정도 구조가 주어진 상태에서 진행하였기에
    다소 구조를 생각하지 않은 코드가 되어버렸다
    • Delegate나 Interface 등을 넣으면 일부 부분을 깔끔해 진다던가
    • 아니면 Turn을 관리하는 Manager를 만든다던가
  • 개인적으로는 ‘구조’를 짜는 것에 대한 고뇌가 벌써부터 아른거린다

그래도 전반적으로 RPC와 Replicated, 언리얼 서버에 대한 구조를 익힐 수 있어
좋은 과제라고 생각했다

GameMode - 게임 규칙 + 서버에만 존재(디버깅 할때 도움이 많이 됨)
GameState - 게임 전반적으로 관리한 변수 관리 -> 클라 복제
PlayerState - Player가 반드시 들고 있을 녀석 + 레벨이 바뀌어도 들고 있을 녀석
PlayerController - ‘이동’을 제외한 ‘입력’을 서버로 RPC하여 보내기

  • 그 외에도 NetRole 과 OnwerShip에 대한 내용도 조금은 익힌 듯 하다
  • Server 디버깅 방식에는 조금 더 신경써야 하며, Logging을 생활화 하는 것이 좋겠다고 느꼈다

댓글남기기