< [이득우의 언리얼 프로그래밍 Part3 필기] 11. 움직임 리플리케이션

언리얼엔진5/[Part3] 이득우의 언리얼 프로그래밍

[이득우의 언리얼 프로그래밍 Part3 필기] 11. 움직임 리플리케이션

Rocketbabydolls 2024. 5. 13. 20:15

 

 

 

공식 문서

 

Understanding Networked Movement In The Character Movement Component For Unreal Engine | Unreal Engine 5.4 Documentation | Epic

Detailed explanation of how the Character Movement Component handles networked movement

dev.epicgames.com

 

해석본 일부

 

[언리얼엔진 5 공식문서] Networked Movement in the Character Movement Component

캐릭터 무브먼트 컴포넌트는 걷기, 낙하, 수영, 비행 등 휴머노이드 캐릭터의 일반적인 이동 모드가 포함된 캡슐화된 이동 시스템을 제공하는 액터 컴포넌트입니다. 캐릭터 무브

plug-in-baby.tistory.com

 

 

우리가 입력을 하면 입력을 원하는 가속도로 변환 후 PerformMovement 함수를 호출하여 이동 계산을 하는데, 이것을 TickComponent 에서 진행한다. (매 틱마다 진행)

 

 

Autonomous Proxy 클라이언트의 진행

[ReplicateMoveToServer]

TickComponent -> ControlledCharacterMove ->ReplicateMoveToServer

  • 클라이언트 캐릭터의 움직임를 보관하는 네트웍용 클라이언트 데이터 생성 (FNetworkPredictionData_Client_Character)
  • 클라이언트의 데이터에 저장된 움직임 중에 참고할 중요한 움직임 기록 (OldMove)
  • 현재 틱의 움직임을 기록하는 신규 움직임 생성 (NewMove)
  • 입력을 처리하기 전의 각종 초기화 상태를 저장 (ex) StartLocation)
  • 필요시 최종 움직임과 현재 움직임을 병합 시도
  • 클라이언트 로컬에서의 움직임 진행 (PerformMovement)
  • 신규 움직임에 움직임 결과 상태를 저장 (ex) SavedLocation)
  • 신규 움직임을 클라이언트 데이터에 추가
  • ServerMove 함수를 호출해 OldMove와 NewMove를 서버에 전송

 

 

클라이언트가 호출하는 서버 RPC
[ServerMove]

클라이언트의 최종 움직임 정보를 서버에 보내는 함수

  • 타임스탬프 : 움직임에 대한 시간 정보
  • 가속 정보 : 입력으로 발생된 최종 가속 정보를 작은 사이즈로 인코딩
  • 위치 정보 : 캐릭터의 최종 위치 정보. 캐릭터가 베이스 (예) 플랫폼) 위에 있는 경우는 상대 위치를 사용
  • 플래그 : 특수한 움직임(점프, 웅크리기) 에 대한 정보
  • 본 정보 : 스켈레탈 메시 컴포넌트인 경우, 기준이 되는 본 정보
  • 무브먼트 모드 정보 : 캐릭터 컴포넌트의 무브먼트 모드 정보

 

서버의 처리

[ServerMove_Implementation]

  • 서버 캐릭터의 움직임을 보관하는 네트웍용 서버 데이터 생성
  • 클라이언트로부터 받은 타임스탬프 값을 검증
    타임 스탬프 값을 다양한 방법으로 검증
    상당한 시간 차가 감지되면, 해킹 방지를 위해 서버 틱으로 제한함
    네트웍 매니저 설정의 보상 비율을 사용해 클라이언트와 서버 시간을 서서히 균등화시킴
  • 압축된 가속, 회전 데이터를 디코딩하고 클라이언트와 서버의 타임 스탬프 정보를 기록
  • MoveAutonomous 함수를 호출해 서버 캐릭터를 이동시킴
  • 클라이언트와의 차이를 비교하고 에러를 수정함
    떨어지는 상황, 착지할 때의 상황에 따라 허용 가능 범위 내에서 클라이언트 데이터를 신뢰함
    상당한 시간 차가 감지되면, 수정 정보를 기록함(PendingAdjustment)

 

 

서버가 호출하는 클라이언트 RPC

[ClientAdjsutPosition]

 

  • 클라이언트에게 수정할 위치 정보를 알려주는 함수
  • 중복 없이 서버 틱의 마지막에서 수정이 필요한 때만 전송함
    타임 스탬프 : 클라이언트의 타임 스탬프 값
    델타 타임 : 서버의 델타 타임
    무브먼트 모드 정보 : 압축된 캐릭터 컴포넌트의 무브먼트 모드 정보
    새로운 속도 : 수정할 새로운 속도 정보
    새로운 위치 : 수정할 새로운 위치 정보
    새로운 회전 : 수정할 새로운 회전 정보
    새로운 베이스와 베이스 본 이름 : 수정할 베이스에 대한 정보

 

 

클라이언트의 수정 처리

[ClientAdjustPosition_Implementation]

  • 타임 스탬프 값을 통해 서버로부터 확인받은 움직임 정보를 기록 (LastAckedMove)
  • 서버에서 전달받은 위치로 루트 컴포넌트(캐릭터)의 위치를 변경
  • 서버에서 전달받은 속도로 무브먼트 컴포넌트의 속도를 수정
  • 베이스 정보와 위치를 수정
  • 서버에 의해 클라이언트 위치가 업데이트되었다고 기록 (bUpdatePosition)
    서버의 수정 정보를 바탕으로 MoveAutonomous 함수를 호출해 클라이언트에서 남은 움직임을 재생함