캐릭터는 CurHealth가 0이하로 떨어지면 죽게 만들어야 한다.

 

앞서 체력과 관련된 부분들을 서버에서 처리했기 때문에 마찬가지로 캐릭터 죽음에 관련된 처리도 서버에서 처리해야 한다.

 

서버 쪽 캐릭터가 데미지를 입을 때  OnHealthUpdate 함수가 호출되기 때문에 내부에서 CurHealth <= 0 을 체크하여 멀티캐스트로 OnPlayerDie를 실행시킨다.

 

멀티캐스트 RPC 함수 선언

 

Character의 OnHealthUpdate 내부 서버에서 멀티캐스트 RPC를 호출한면 서버와 클라이언트 모두에서 실행된다.

 

캐릭터가 죽으면 래그돌 연출을 적용하고 싶다. 콜리전 설정을 변경하여 적용할 수 있다.

공간 쿼리는 (레이캐스트, 스윕, 오버랩)

시뮬레이션은 (리짓 바디, 컨스트레인트) 

 

캐릭터 메시의 기본 프리셋은 Query Only와 Pawn으로 되어 있는데 

캐릭터 메시의 기본 콜리전 세팅

 

RagDoll 프리셋을 사용해도 되지만 RagDoll 프리셋은 Query도 허용하기 때문에 캐릭터가 죽은 이후에는 물리 시뮬레이션만 사용하고 싶기 때문에 CollisionEnabled와 ObjectType을 따로 지정해줬다.

 

그리고 메시의 SetSimulatePhysics를 true로 설정해주면 된다.

래그돌 물리 시뮬레이션은 리플리케이트되지 않기 때문에 각 클라이언트에서 시체가 다르게 보일 수 있

 

점수 누적

 

BullettimePlayerController를 새로 만들고 SetupInputComponent함수를 오버라이드 했다. tab키를 모든 플레이어 정보(이름 / 킬 / 데스)를 출력하는 함수에 바인딩했다.

 

멀티플레이어 게임에서는 캐릭터 스탯 관련 정보를 PlayerState에 저장하는 것이 좋다.

GameState에서는 모든 플레이어의 PlayerState에 접근할 수 있는데 GameState는 서버에 존재하면서 모든 클라이언트에 리플리케이트 되므로 

 

BullettimePlayerState를 만들고 다음과 같이 정의했다.

 

APlayerState 설명

 

PlayerState가 리플리케이트 된다고 들었어서 PlayerState에 새로 만들어준 변수들도 자동으로 리플리케이트 되는 줄 알았는데, APlayerState의 일부 RepNotify변수들만 리플리케이트 되는 것이었다. 직접 RepNotify 프로퍼티로 선언해주니 해결되었다. 

 

 

서버의 캐릭터가 죽었을 때 AddScore()함수를 서버에서만 호출한다.

가장 최근에 이 캐릭터를 공격한 PlayerController 정보를 사용하여 각각의 캐릭터 컨트롤러가 가지는 PlayerState에 점수를 추가한다.

 

결과물

플레이어가 Tab 키를 누르면 모든 플레이어의 스탯 정보를 확인할 수 있다. (Listenserver 1, client 2로 세팅된 상황)

서버와 클라이언트에서 정상적으로 모든 플레이어의 킬 / 데스 정보를 확인할 수 있다.

 

일단은 기능 구현이 우선이므로 디버깅 텍스트를 띄우는 방식으로 구현했는데 나중에 Widget으로 띄울 생각이다.

 

+ Recent posts