- 게임 시작 전
GameMode : PostLogin 함수 사용 (언리얼 제공)- 오버라이드해서 들어온 사람들 PlayerState 발급 + 대기시키기
- 롤 배정 (start 버튼 눌리면 실행)
GameMode : AssignRoles() 구현 -> 랜덤으로 술래 설정
PlayerState : RoleTag 변수 (Replicated) -> 역할 Tag 걸기 - 정찰 - StartScouting()
술래가 카메라로 다른 플레이어들 숨는 거 다 봐버리는 문제 -> 시야 차단으로 해결
함수 안에서 순서대로:- GameState.CurrentPhase = Scouting 세팅
- 술래 PlayerController : SetIgnoreMoveInput(true) 호출 (언리얼 제공, 이동 잠금)
- 숨는사람 Character : IsNetRelevantFor() 오버라이드 (언리얼 제공)
- 현재 Scouting 상태이고, 보고 있는 대상의 PlayerState.RoleTag가
술래라면 -> false 리턴 (숨는 사람 캐릭터 액터를 술래에게 안 보내게 할 수 있다고 함 ) - 그 외엔 Super 그대로 -> 맵 구조는 보이고 사람만 안 보임
- 현재 Scouting 상태이고, 보고 있는 대상의 PlayerState.RoleTag가
- GetWorldTimerManager().SetTimer(60초 뒤 StartInGame() 호출 예약)
- 본게임 - StartInGame()
- GameState.CurrentPhase = InGame 세팅
- 술래 PlayerController : SetIgnoreMoveInput(false) 호출 -> 이동 잠금 해제
- IsNetRelevantFor 조건은 Phase가 바뀌었으니 자동으로 재평가되어 원복
- GetWorldTimerManager().SetTimer(300초 뒤 EndMatch() 호출 예약)
- 포획 - Overlap 발생
숨는사람Character.OnCaptureOverlap() 안에서 HasAuthority() 확인(서버에서만 실행되게)
-> 통과 시 GameMode.RequestCaptureJudgement() 호출 (서버에서 포획 판정을 정확하게 내리게 함/ 해킹방지)
-> 그 안에서 두 캐릭터 DisableInput + 3초 FTimerHandle 시작 (3초 너무 짧은 것 같기도…?)
-> 술래의 PlayerController에 Client RPC 호출 (UI 띄우기) - PlayerController가 RPC 수신 -> UI 띄움
같은 함수 선언 + _Implementation에서 술래 UI(커스텀 위젯) 뜨게 함
커스텀 위젯은 C++ 부모 클래스로 만들고 WBP에서 1.포획하기 2.봐주기 OnClicked 버튼 생성 - 위젯 버튼 클릭
OnClicked 이벤트(언리얼 제공) -> 클릭하면 술래 PlayerController가 가진
Server RPC 함수 호출되게 구현 (아웃 / 봐주기 각각 따로) - 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 띄우기
상의할 것
- 정찰모드 저렇게 구현해도 되는지?
- 캐릭터 파일을 술래랑 숨는사람 따로 만들건지 / 캐릭터 하나만 구현해놓고 Tag에 따라 다른 로직을 구현하게 할 건지
술래 교체 모드가 없다면 앞선 선택지가 더 구현하기 쉬움
'프로젝트 > Funny Or Die (멀티플레이 술래잡기 게임)' 카테고리의 다른 글
| 정찰 단계(Scouting) 구현하기 (0) | 2026.07.01 |
|---|---|
| Seamless Travel 이후 캐릭터 입력이 먹지 않던 문제 (0) | 2026.07.01 |
| 로비 UI 협업 (0) | 2026.06.30 |
| 레벨별 GameMode 분리와 로비 시스템 구현 (0) | 2026.06.30 |
| 술래/숨는자 역할 배정 - 멀티플레이어 캐릭터 분기 스폰 구현 (0) | 2026.06.30 |
