ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [UE5] 움직임 리플리케이션
    UE5 2024. 12. 20. 08:15

    다음은 언리얼 공식 문서 Networked Movement in the Character Movement Component의 일부를 번역한 것이다.


     

     

    Autonomous Proxy (자율 프록시)
    캐릭터는 소유 클라이언트의 기기에서 실행되며, 플레이어가 로컬에서 직접 제어합니다.

     

    Authority (권한)
    캐릭터는 게임을 호스팅하는 서버에 존재합니다.

     

    Simulated Proxy (시뮬레이티드 프록시)

    캐릭터는 다른 클라이언트에 존재하며, 원격으로 제어되는 캐릭터를 볼 수 있습니다.
    이 캐릭터는 서버에서 AI에 의해 제어되거나, 다른 클라이언트의 Autonomous Proxy에 의해 제어될 수 있습니다.

     


     

    복제(Replication) 프로세스는 TickComponent 함수 내에서 반복적으로 수행되며, 매 틱마다 실행됩니다.


    캐릭터가 이동을 수행하면 네트워크 게임에 연결된 모든 기기의 복사본들은 원격 프로시저 호출(RPC)을 통해 서로 이동 정보를 동기화합니다.


    이 과정에서 네트워크 역할(Network Role)에 따라 서로 다른 실행 경로를 사용합니다.

     


     

    UCharacterMovementComponent가 각 기기에서 이 프로세스를 수행하는 단계별 개요

     

    Autonomous Proxy (소유한 플레이어의 클라이언트)

    1. 소유 클라이언트가 로컬에서 Autonomous Proxy를 제어합니다.
      • PerformMovement 함수가 이동 컴포넌트의 물리적 움직임 로직을 실행합니다.
    2. Proxy는 방금 수행한 이동에 대한 데이터를 포함하는 FSavedMove_Character를 생성한 후, 이를 SavedMoves 큐에 저장합니다.
    3. 유사한 FSavedMove 항목들은 하나로 합쳐집니다.
      • Autonomous Proxy는 그 데이터를 요약하여 ServerMove RPC를 사용해 서버로 전송합니다.

     

    Authoritative Actor (서버)

    1. 서버는 ServerMove를 수신하고, 클라이언트의 이동을 재현하기 위해 PerformMovement를 실행합니다.
    2. 서버는 이동 후 자신의 위치가 클라이언트가 보고한 최종 위치와 일치하는지 확인합니다.
    3. 서버와 클라이언트의 최종 위치가 일치하면, 이동이 유효하다는 신호를 클라이언트로 보냅니다.
      • 만약 위치가 일치하지 않으면, ClientAdjustPosition RPC를 사용해 수정된 위치를 클라이언트로 보냅니다.
    4. 서버는 자신의 위치, 회전, 현재 상태를 다른 연결된 클라이언트의 Simulated Proxy로 보냅니다.
      • 이 과정은 ReplicatedMovement 구조를 복제하여 수행됩니다.

     

    Autonomous Proxy (소유한 플레이어의 클라이언트)

    1. 클라이언트가 ClientAdjustPosition을 수신하면, 서버의 이동을 재현하고 SavedMoves 큐를 사용해 자신의 이동을 다시 추적하여 새로운 최종 위치를 계산합니다.
      • 이동이 성공적으로 해결되면, 큐에서 해당 저장된 이동 정보를 제거합니다.

     

    Simulated Proxy (다른 모든 클라이언트)

    1. Simulated Proxy는 복제된 이동 정보를 직접적으로 적용합니다.
      • 네트워크 스무딩(Network Smoothing)을 통해 최종 움직임에 대한 시각적 보정을 수행합니다.

     

     

    이 프로세스는 네트워크 게임 내에서 모든 세 종류의 기기(Autonomous Proxy, Authority, Simulated Proxy) 간의 이동을 동기화합니다.


    특정 캐릭터를 제어하는 사용자는 서버의 간섭을 최소화한 상태에서 캐릭터를 로컬에서 제어하는 듯한 경험을 해야 하며, 동시에 다른 사용자의 캐릭터는 각자의 기기에서 수행 중인 이동을 근사적으로 표현해야 합니다.

    이 프로세스의 복잡성 대부분은 Autonomous Proxy와 서버 간의 **예측(Prediction) 및 수정(Correction)**을 조정하는 데 집중됩니다.


    이는 플레이어가 자신의 캐릭터를 제어할 때 가능한 한 매끄러운 경험을 제공하기 위한 것입니다.

    반면, Simulated Proxy는 서버가 지정한 위치와 상태를 단순히 업데이트하여 서버의 지시에 따라 동작하기만 하면 됩니다.

     

     



    Autonomous Proxy 클라이언트의 진행

     

    [ReplicateMoveToServer]

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

     

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

     

    [ServerMove]

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

     

    서버의 처리

     

    [ServerMove_Implementation]

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

     

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

     

    [ClientAdjustPosition]

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

     

    클라이언트의 수정 처리

     

    [ClientAdjustPosition_Implementation]

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