다양한 기록

[UE Network] Physics Movement Replication 본문

언리얼 엔진/Unreal Network Framework

[UE Network] Physics Movement Replication

라구넹 2025. 1. 11. 17:05

서버

- 컴포넌트의 움직임 혹은 물리 상태 저장

- ReplcatedMovement 프로퍼티 리플리케이션

클라이언트

- OnReq_ReplicatedMovement 호출

- 움직임 조정 혹은 물리 상태를 기록

- 클라이언트와 서버의 물리 상태를 동기화

- 캐릭터의 추가적인 움직임 처리

 

캐릭터의 리플리케이션과 다른점

액터의 리플리케이션은 RPC를 사용하는게 아니라 프로퍼티 리플리케이션을 사용

 

* Authority, SimulatedProxy, AutonomousProxy 이런 건 전부 Actor 단위임

어떤 클라이언트가 AutonomousProxy이다 이런게 아니라 액터 하나의 역할을 의미함

 

[ReplicatedMovement]

- 서버에서 SimulatedProxy로 보내는 움직임 정보를 기록한 멤버 변수

- OnReq_ReplicatedMovement로 이벤트 함수 호출

- 일반 움직임과 물리 움직임의 리플리케이션을 모두 처리하는 용도로 활용됨

- FReqMovement 구조체: 위치와 회전, 데이터 정밀도 설정, 물리 시뮬레이션 여부 플래그, 이동 속도, 각속도, 서버 프레임

 

[FRigidBodyState]

- 액터의 물리 상태를 기록하는 구조체

- 위치, 회전, 속도, 각속도, 플래그(휴면 상태와 같은 특정 물리 상태를 기록하는데 사용)

 

[GatherCurrentMovement 함수]

- 현재 액터의 움직임을 ReplicatedMovement 속성으로 변환해 설정하는 함수

- 액터의 최종 움직임을 정리

- 액터의 PreReplication 함수에서 호출됨

- 액터의 물리 움직임과 일반 움직임을 구분해 각각 처리함

- 일반 움직임은 단순히 액터의 현재 위치, 회전, 속도값을 ReplicatedMovement에 저장

- 물리 시뮬레이션의 경우 현재 월드에 설정된 물리 씬에서 해당 컴포넌트의 물리 상태를 저장

    - 현재 컴포넌트의 물리 상태 정보를 ReplicatedMovement로 옮김 (FRigidBodyState::FillFrom)

- 이를 통해 최종 ReplicatedMovement가 설정되어 클라이언트에 보내짐

 

 * 액터의 움직임 리플리케이션 옵션을 활성화해주어야 올바르게 동작함

물리 시뮬레이션 중이면 FillFrom으로 내용 채우는 거 확인 가능

 

[OnReq_ReplicatedMovement]

- ReplicatedMovement의 물리 시뮬레이션 속성(bReqPhysics)여부에 따라 두가지로 실행됨

- 일반적인 움직임에 대한 처리

    - Simulated Proxy에 대해서만 처리

    - 컴포넌트의 위치와 회전 정보 갱신

    - 속도 처리는 별도로 진행하지 않음

- 물리 움직임에 대한 처리

    - ReplcatedMovement의 정보를 현재 컴포넌트의 물리 상태로 옮김(FRigidBodyState::CopyTo)

    - 물리 리플리케이션 씬에서 컴포넌트와 일치하는 타겟을 찾아서 업데이트(FReplicatedPhysicsTarget)

 

이 다음FReplicatedPhysicsTarget에 맞게 물리 움직임을 수정해줌

 

[ApplyRigidBodyState]

- 물리 리플리케이션의 Tick에서 호출되는 함수

- 클라이언트의 물리 상태가 서버의 물리 상태의 오차 내에 있을 때까지 계속 호출

1. 서버에서 받은 최종 속도와 핑을 기반으로 클라이언트의 물리 상태를 외삽(Extrapolation)으로 예측

2. 예측한 위치와 방향이 서버와 비교해 올바른지 체크하고 문제가 있다고 판단되면 에러 시간을 누적

3. 누적된 에러 시간 설정값을 넘으면 강제 조정(하드 스냅)을 진행

4. 차이가 크지 않다면 내삽(Interpolation)을 수행해 현재 위치, 회전, 속도, 각속도를 조정

 

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

[SimulatedTick]

- Simulated Proxy의 캐릭터가 처리하는 캐릭터의 움직임

- 캐릭터가 Simulated Proxy인 경우 캐릭터만의 추가적인 작업을 수행 (SimulateMovement)

- 시뮬레이션으로 캡슐을 이동시킨 후 메시의 움직임을 부드럽게 보간 (SmoothClientPosition)

 

'언리얼 엔진 > Unreal Network Framework' 카테고리의 다른 글

[UE Network] Movement Replication  (0) 2025.01.09