본문 바로가기

공부/이득우의 언리얼 프로그래밍

[Study] Part 3 - 물리 움직임 리플리케이션 (12/15)

728x90
반응형

 

  • 정리
    • 물리 움직임 리플리케이션
      1. 액터의 물리적인 움직임을 리플리케이션하는 플로우와 소스 코드의 이해
      2. Simulate Proxy로 동작하는 캐릭터에서 움직임을 처리하는 방식의 이해

 

 

  • 액터의 리플리케이션 플로우
    • 프로퍼티 리플리케이션을 사용해 움직임 정보를 전송하고, 클라이언트는 받을 때마다 이를 적용함

액터의 리플리케이션 플로우

 

 

  • 움직임 리플리케이션을 위한 서버의 준비
    • ReplicatedMovement
      • 서버에서 SimulatedProxy로 보내는 움직임 정보를 기록한 멤버 변수
      • OnRep_ReplicatedMovement로 이벤트 함수 호출함
      • 일반 움직임과 물리 움직임의 리플리케이션을 모두 처리하는 용도로 활용됨
      • FRepMovement 구조체의 주요 멤버 변수
        • 위치와 회전 : 컴포넌트의 현재 위치와 회전
        • 데이터 정밀도 설정 : 위치, 회전, 속도의 데이터 정밀도. 끊김 현상이 보이지 않을 만큼 최소로 설정
        • 물리 시뮬레이션 여부 플래그 : 물리 시뮬레이션으로 복제할지를 지정
        • 이동 속도 : 컴포넌트의 이동 속도
        • 각 속도 : 컴포넌트의 각 속도. 물리 시뮬레이션 진행시에만 사용
        • 서버 프레임 : 서버에서의 물리 프레임

 

 

  • 물리 움직임의 기록
  • FRigdBodyState
    • 액터의 물리 상태를 기록하는 구조체
    • 다음과 같은 멤버 변수로 구성되어 있음
      • 위치 : 소수점 두 자리 정밀도로 기록됨
      • 회전 : 사원수 정보로 기록됨
      • 속도 : 소수점 두 자리 정밀도로 기록됨
      • 각속도 : 소수점 두 자리 정밀도로 기록됨
      • 플래그 : 휴면 상태와 같은 특정 물리 상태를 기록하는데 사용

 

 

  • 액터 리플리케이션의 준비
    • GatherCurrentMovement
      • 현재 액터의 움직임을 ReplicatedMovement 속성으로 변환해 설정하는 함수
      • 액터의 PreReplication 함수에서 호출됨
      • 액터의 물리 움직임과 일반 움직임을 구분해 각각 처리함
      • 일반 움직임은 단순히 액터의 현재 위치, 회전, 속도 값을 ReplicatedMovement에 저장함
      • 물리 시뮬레이션의 경우 현재 원드에 설정된 물리 씬에서 해당 컴포넌트의 물리 상태를 저장함
        • 현재 컴포넌트의 물리 상태 정보를 ReplicatedMovement로 옮김 (FRigidBodyState::FillFrom)
      • 이를 통해 최종 ReplicatedMovement가 설정되어 클라이언트에 보내짐
    • 액터의 움직임 리플리케이션 옵션을 활성화해주어야 올바로 동작함

 

  • 액터 움직임 정보의 수선
    • 서버 액터의 ReplicatedMovement 변수가 변경되면 클라이언트의 OnRep이벤트 함수가 자동으로 호출 된다.
    • OnRep_ReplicatedMovement
      • Replicatedmovement물리 시뮬레이션 속성(bRepPhysics) 여부에 따라 두 가지로 실행됨
      • 일반적인 움직임에 대한 처리
        • Simulated Proxy에 대해서만 처리함
        • 컴포넌트의 위치와 회전 정보를 갱신 함
        • 속도 처리는 별도로 진행하지 않음
      • 물리 움직임에 대한 처리
        • ReplicatedMovement의 정보를 현재 컴포넌트의 물리 상태로 옮김 (FRigidBodyState::CopyTo)
        • 물리 리플리케이션 씬에서 컴포넌트와 일치하는 타겟을 찾아서 업데이트 (FReplicatedPhysicsTarget)

 

 

  • 물리 움직임의 동기화
    • ApplyRigidBodyState
      • 물리 리플리케이션의 틱에서 호출되는 함수
      • 클라이언트의 물리 상태가 서버의 물리 상태의 오차 내에 있을 때까지 계속 호출됨
      • 다음과 같은 로직으로 진행
        1. 서버에서 받은 최종 속도와 핑을 기반으로 클라이언트의 물리 상태를 외삽(Extrapolation)으로 예측
        2. 예측한 위치와 방향이 서버와 비교해 올바른지 체크하고 문제가 있다고 판단되면 에러 시간을 누적
        3. 누적된 에러 시간 설정값을 넘으면 강제 조정(하드스냅)을 진행
        4. 차이가 크지 않다면 내삽(Interpolation)을 수행해 현재 위치, 회전, 속도, 각속도를 조정함

 

  • 움직임 동기화 테스트하기

BP_MovePlatform

 

 

그냥 BP 액터를 생성시켰을때
  • 그냥 BP 액터를 생성시켰을 때는 다음과 같이 서버에서만 동작하는 것을 볼 수 있다. 하지만, 클라이언트에서는 보이지 않는 벽에 의해 밀려나는 모습을 볼 수 있다.
  • 리플리케이트가 되지 않는 모습

 

BP_MovePlatform>Class Defaluts>Replication

  • 이를 해결하기 위해서 Replicates 옵션을 활성화 시켜주자. 그러면 리플리케이트는 되지만 움직이지 않는다. 이를 해결하기 위해서 Replicate Movement를 활성화 시켜주자.
  • 그럼 원하는 대로 움직임이 정상적으로 리플리케이트하게 된다.

 

 

Replicates true, Replicate Movement true

 

  • 물리 동기화 테스트하기

Static Mesh>Static Mesh Replicate Movement

  • 해당 옵션을 true로 설정하면 물리연산이 리플리케이트된다. 해당 옵션을 false로 두면 서버와 클라이언트의 물리 연산이 다르게 반영되는 걸 확인할 수 있다.

 

  • Simulated Proxy 클라이언트의 움직임 진행
    • SimulatedTick
      • Simulated Proxy의 캐릭터가 처리하는 캐릭터의 움직임
      • 캐릭터가 Simulated Proxy인 경우 캐릭터만의 추가적인 작업을 수행 (SimulateMovement)
      • 시뮬레이션으로 캡슐을 이동시킨 후 메시의 움직임을 부드럽게 보간함 (SmoothClientPosition)

Simulated Proxy 클라이언트의 움직임 진행

 

 

 

 

 

해당 포스트는 인프런의 <이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이어 프레임웍의 이해>
강의를 수강하고 정리한 내용입니다.
 

이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해 강의 | 이득우 - 인프런

이득우 | 또 하나의 언리얼 엔진이라고도 불리는 네트웍 멀티플레이어 프레임웍을 학습합니다. 네트웍 멀티플레이어 게임을 제작할 때 반드시 알아야 하는 주요 개념, 내부 동작 원리, 최적화

www.inflearn.com

 

728x90