Unreal/C++ 과제 9 - 숫자 야구 게임
Unreal/C++ 과제 9 - 숫자 야구 게임
과제 소개 및 목표
숫자 야구를 구현하면서 Unreal의 Dedicated Server에 대하여
익숙해지기
구현 기능
필수 기능
- GameModeBase를 통한 숫자 야구 판정 규칙
- PlayerState를 이용한 시도 횟수 관리
- 승부 및 게임 리셋용 기능 구현
도전 기능
- 턴 제어 기능 + 남은 시간 UI
- 턴 종료 후, 기회 소진
클래스 설명
TaskGameModeBase
- 숫자 야구를 진행하는 게임 모드(규칙)
- PostLogin을 통해 유저들을 받은 후, 2명 이상이 모였다면 게임 실행
- 숫자 야구의 숫자 생성 및 판정
- 승패 판단 및 재시작 진행
- 턴 판단 및 턴 넘김
TaskGameState
- 실제 사용하는 턴 시간에 대한 관리
TaskPlayerState
- 플레이어 이름 및 최종 추론 횟수 등을 관리
- 현재 자신의 턴인지 관리
TaskPlayerController
- 여러 Widget Class를 담음
- 입력 String을 GameMode로 보내 검사받도록 함
- 자신의 턴이 아니거나, 추론 횟수를 다 썼다면 GameMode에 보낼 수 없음
TaskChatInput
- 입력 UI로서 입력된 String을 PlayerController로 보내줌
트러블 슈팅 - 클라이언트 측의 PlayerState의 Turn이 갱신되지 않았던 문제
// 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를 만든다던가
- Delegate나 Interface 등을 넣으면 일부 부분을 깔끔해 진다던가
- 개인적으로는 ‘구조’를 짜는 것에 대한 고뇌가 벌써부터 아른거린다
그래도 전반적으로 RPC와 Replicated, 언리얼 서버에 대한 구조를 익힐 수 있어
좋은 과제라고 생각했다
GameMode - 게임 규칙 + 서버에만 존재(디버깅 할때 도움이 많이 됨)
GameState - 게임 전반적으로 관리한 변수 관리 -> 클라 복제
PlayerState - Player가 반드시 들고 있을 녀석 + 레벨이 바뀌어도 들고 있을 녀석
PlayerController - ‘이동’을 제외한 ‘입력’을 서버로 RPC하여 보내기
- 그 외에도 NetRole 과 OnwerShip에 대한 내용도 조금은 익힌 듯 하다
- Server 디버깅 방식에는 조금 더 신경써야 하며, Logging을 생활화 하는 것이 좋겠다고 느꼈다
댓글남기기