Mover

  • 기존의 Character Movement Component를 대체할 목적의 언리얼 공식 플러그인
    • 포스트 작성일 기준으로 아직 Experimental
    • Mover 1.0이 나오자마자 곧바로 CMC 지원을 끊을 계획은 없고 장기적으로 대체할 것이라 한다
  • 언리얼 캐릭터의 기본적인 Movement가 마음에 들지 않아서 이를 대체할 Physics, Movement 플러그인 등을 찾다가 Mover 키워드를 알게 됐다
  • 하지만 Mover는 내가 기대한 것과는 전혀 상관없는 목적으로 개발된 기능이다
    • 동기화 시 캐릭터의 위치가 순간적으로 튀는 현상을 획기적으로 줄이기 위함
  • 클라이언트는 서버보다 약간 먼저 예측적으로 실행
  • 클라이언트에서 서버로 전송하는 데이터는 입력

작동 플로우

post_thumbnail

기존 CMC

  1. Automonous Client
    • 클라이언트에서 로컬 입력으로 즉시 이동 반영 (Produce Input / Predict Move)
    • 결과를 서버로 전송 (Inputs + Move Result)
  2. Authority
    • 클라이언트로부터 입력고 예측결과 받아 비교 (Perform Move)
    • 서버 시뮬레이션으로 일치 여부 확인 (Detect Errors)
    • Replicate State에서 결과가 다르면 서버에서 결정한 상태 정보로 수정
  3. Peer Client / Proxy
    • 서버에게 받은 정보로 클라이언트의 위치 및 상태 갱신 (Interpolate)

Mover

  1. Automonous Client
    • CMC와 동일하게 입력 시 내 캐릭터는 Predict Move
    • 서버로는 입력 정보만 전달 (Inputs Only)
  2. Authority
    • 클라이언트에서 받은 입력 정보 버퍼에 저장 (Buffer Inputs)
    • 입력 키 바탕으로 시뮬레이션 해서 캐릭터의 위치 결정 (Perform Move)
    • 위치 및 상태 정보와 함께 입력 정보도 같이 클라이언트에 제공 (Peer Client 2 - State + Inputs)
    • 단, 롤백 시뮬레이션 하지 않는 클라이언트에 한해서는 State 정보만 전달 (Peer Client 1 - State)
  3. 서버로부터 받은 입력 정보로 시뮬레이션 해 상태 및 위치 결정
    • ‘내’가 조종하는 Autonomous Client는 State 정보를 받아 검사 (Detect Errors + Correction)

보정 과정에서의 차이

기존 CMC

  1. 서버와 클라이언트의 차이 감지
  2. 클라이언트의 상태를 서버의 상태로 즉시 변경
    • 이 때 캐릭터의 위치가 튀는 이슈 잠재적으로 발생 가능

Mover

  1. 서버와 클라이언트와 차이 발생 감지
    • 입력 지연 등의 이슈 발생
  2. 서버가 클라이언트와 차이가 발생한 시점을 찾기 위해 롤백
  3. 차이가 발생한 시점을 찾고 거기서부터 다시 시뮬레이션 시작
  4. 시뮬레이션 결과를 클라이언트에 전송
    • 클라이언트도 Local Predicted로 움직이고 있었기 때문에 보다 작은 오차 기대

출처

Categories: ,

Updated: