1. 게임 시작 전
    GameMode : PostLogin 함수 사용 (언리얼 제공)
    • 오버라이드해서 들어온 사람들 PlayerState 발급 + 대기시키기
  2. 롤 배정 (start 버튼 눌리면 실행)
    GameMode : AssignRoles() 구현 -> 랜덤으로 술래 설정
    PlayerState : RoleTag 변수 (Replicated) -> 역할 Tag 걸기

  3. 정찰 - StartScouting()
    술래가 카메라로 다른 플레이어들 숨는 거 다 봐버리는 문제 -> 시야 차단으로 해결
    함수 안에서 순서대로:
    1. GameState.CurrentPhase = Scouting 세팅
    2. 술래 PlayerController : SetIgnoreMoveInput(true) 호출 (언리얼 제공, 이동 잠금)
    3. 숨는사람 Character : IsNetRelevantFor() 오버라이드 (언리얼 제공)
      • 현재 Scouting 상태이고, 보고 있는 대상의 PlayerState.RoleTag가
        술래라면 -> false 리턴 (숨는 사람 캐릭터 액터를 술래에게 안 보내게 할 수 있다고 함 )
      • 그 외엔 Super 그대로 -> 맵 구조는 보이고 사람만 안 보임
    4. GetWorldTimerManager().SetTimer(60초 뒤 StartInGame() 호출 예약)
  4. 본게임 - StartInGame()
    1. GameState.CurrentPhase = InGame 세팅
    2. 술래 PlayerController : SetIgnoreMoveInput(false) 호출 -> 이동 잠금 해제
    3. IsNetRelevantFor 조건은 Phase가 바뀌었으니 자동으로 재평가되어 원복
    4. GetWorldTimerManager().SetTimer(300초 뒤 EndMatch() 호출 예약)
  5. 포획 - Overlap 발생
    숨는사람Character.OnCaptureOverlap() 안에서 HasAuthority() 확인(서버에서만 실행되게)
    -> 통과 시 GameMode.RequestCaptureJudgement() 호출 (서버에서 포획 판정을 정확하게 내리게 함/ 해킹방지)
    -> 그 안에서 두 캐릭터 DisableInput + 3초 FTimerHandle 시작 (3초 너무 짧은 것 같기도…?)
    -> 술래의 PlayerController에 Client RPC 호출 (UI 띄우기)

  6. PlayerController가 RPC 수신 -> UI 띄움
    같은 함수 선언 + _Implementation에서 술래 UI(커스텀 위젯) 뜨게 함
    커스텀 위젯은 C++ 부모 클래스로 만들고 WBP에서 1.포획하기 2.봐주기 OnClicked 버튼 생성

  7. 위젯 버튼 클릭
    OnClicked 이벤트(언리얼 제공) -> 클릭하면 술래 PlayerController가 가진
    Server RPC 함수 호출되게 구현 (아웃 / 봐주기 각각 따로)

  8. ServerRPC_Implementation 실행
    GameMode의 ResolveCapture() 호출 (마찬가지로 서버에서 구현되게 해야 안전함)
    -> 이 요청 보낸 게 진짜 이번 판정의 술래 맞는지 확인
    -> 아웃이면: 잡힌 사람 PlayerState.bIsAlive = false + GameState.AliveHiderCount--
    -> 봐주기면: 잡힌 사람 PlayerState.bIsInvincible = true + MaxWalkSpeed 1.5배 + 7초 후 원복 타이머

-> AliveHiderCount == 0이 되면 즉시 EndMatch() 호출

9. EndMatch()
GameState.CurrentPhase = GameOver 세팅
모든 PlayerState 모아서 생존시간/살린횟수 기준 정렬 -> UI 띄우기


상의할 것

  1. 정찰모드 저렇게 구현해도 되는지?
  2. 캐릭터 파일을 술래랑 숨는사람 따로 만들건지 / 캐릭터 하나만 구현해놓고 Tag에 따라 다른 로직을 구현하게 할 건지
    술래 교체 모드가 없다면 앞선 선택지가 더 구현하기 쉬움

+ Recent posts