캐릭터는 CurHealth가 0이하로 떨어지면 죽게 만들어야 한다.
앞서 체력과 관련된 부분들을 서버에서 처리했기 때문에 마찬가지로 캐릭터 죽음에 관련된 처리도 서버에서 처리해야 한다.
서버 쪽 캐릭터가 데미지를 입을 때 OnHealthUpdate 함수가 호출되기 때문에 내부에서 CurHealth <= 0 을 체크하여 멀티캐스트로 OnPlayerDie를 실행시킨다.
캐릭터가 죽으면 래그돌 연출을 적용하고 싶다. 콜리전 설정을 변경하여 적용할 수 있다.
공간 쿼리는 (레이캐스트, 스윕, 오버랩)
시뮬레이션은 (리짓 바디, 컨스트레인트)
캐릭터 메시의 기본 프리셋은 Query Only와 Pawn으로 되어 있는데
RagDoll 프리셋을 사용해도 되지만 RagDoll 프리셋은 Query도 허용하기 때문에 캐릭터가 죽은 이후에는 물리 시뮬레이션만 사용하고 싶기 때문에 CollisionEnabled와 ObjectType을 따로 지정해줬다.
그리고 메시의 SetSimulatePhysics를 true로 설정해주면 된다.
점수 누적
BullettimePlayerController를 새로 만들고 SetupInputComponent함수를 오버라이드 했다. tab키를 모든 플레이어 정보(이름 / 킬 / 데스)를 출력하는 함수에 바인딩했다.
멀티플레이어 게임에서는 캐릭터 스탯 관련 정보를 PlayerState에 저장하는 것이 좋다.
GameState에서는 모든 플레이어의 PlayerState에 접근할 수 있는데 GameState는 서버에 존재하면서 모든 클라이언트에 리플리케이트 되므로
BullettimePlayerState를 만들고 다음과 같이 정의했다.
PlayerState가 리플리케이트 된다고 들었어서 PlayerState에 새로 만들어준 변수들도 자동으로 리플리케이트 되는 줄 알았는데, APlayerState의 일부 RepNotify변수들만 리플리케이트 되는 것이었다. 직접 RepNotify 프로퍼티로 선언해주니 해결되었다.
서버의 캐릭터가 죽었을 때 AddScore()함수를 서버에서만 호출한다.
가장 최근에 이 캐릭터를 공격한 PlayerController 정보를 사용하여 각각의 캐릭터 컨트롤러가 가지는 PlayerState에 점수를 추가한다.
결과물
플레이어가 Tab 키를 누르면 모든 플레이어의 스탯 정보를 확인할 수 있다. (Listenserver 1, client 2로 세팅된 상황)
일단은 기능 구현이 우선이므로 디버깅 텍스트를 띄우는 방식으로 구현했는데 나중에 Widget으로 띄울 생각이다.
'언리얼 5 > 게임 개발 일지' 카테고리의 다른 글
FPS 게임 개발 #10 (온라인 서브 시스템 스팀 모듈 세팅, 메인 메뉴 UI 디자인) (0) | 2022.11.18 |
---|---|
FPS 게임 개발 #9 (캐릭터 죽음 처리 : 리스폰, 카메라 워킹) (0) | 2022.11.17 |
FPS 게임 개발 #7 (리플리케이션 마무리, 체력 UI 적용) (0) | 2022.11.13 |
FPS 게임 개발 #6 (RepNotify와 RPC 함수를 사용하여 리플리케이션 적용하기) (0) | 2022.11.12 |
FPS 게임 개발 #5 (유틸리티 매크로, 체력 시스템, 충돌 처리) (0) | 2022.11.08 |