728x90
반응형
- 정리
- 물리 움직임 리플리케이션
- 액터의 물리적인 움직임을 리플리케이션하는 플로우와 소스 코드의 이해
- Simulate Proxy로 동작하는 캐릭터에서 움직임을 처리하는 방식의 이해
- 물리 움직임 리플리케이션
- 액터의 리플리케이션 플로우
- 프로퍼티 리플리케이션을 사용해 움직임 정보를 전송하고, 클라이언트는 받을 때마다 이를 적용함
- 움직임 리플리케이션을 위한 서버의 준비
- ReplicatedMovement
- 서버에서 SimulatedProxy로 보내는 움직임 정보를 기록한 멤버 변수
- OnRep_ReplicatedMovement로 이벤트 함수 호출함
- 일반 움직임과 물리 움직임의 리플리케이션을 모두 처리하는 용도로 활용됨
- FRepMovement 구조체의 주요 멤버 변수
- 위치와 회전 : 컴포넌트의 현재 위치와 회전
- 데이터 정밀도 설정 : 위치, 회전, 속도의 데이터 정밀도. 끊김 현상이 보이지 않을 만큼 최소로 설정
- 물리 시뮬레이션 여부 플래그 : 물리 시뮬레이션으로 복제할지를 지정
- 이동 속도 : 컴포넌트의 이동 속도
- 각 속도 : 컴포넌트의 각 속도. 물리 시뮬레이션 진행시에만 사용
- 서버 프레임 : 서버에서의 물리 프레임
- ReplicatedMovement
- 물리 움직임의 기록
- FRigdBodyState
- 액터의 물리 상태를 기록하는 구조체
- 다음과 같은 멤버 변수로 구성되어 있음
- 위치 : 소수점 두 자리 정밀도로 기록됨
- 회전 : 사원수 정보로 기록됨
- 속도 : 소수점 두 자리 정밀도로 기록됨
- 각속도 : 소수점 두 자리 정밀도로 기록됨
- 플래그 : 휴면 상태와 같은 특정 물리 상태를 기록하는데 사용
- 액터 리플리케이션의 준비
- GatherCurrentMovement
- 현재 액터의 움직임을 ReplicatedMovement 속성으로 변환해 설정하는 함수
- 액터의 PreReplication 함수에서 호출됨
- 액터의 물리 움직임과 일반 움직임을 구분해 각각 처리함
- 일반 움직임은 단순히 액터의 현재 위치, 회전, 속도 값을 ReplicatedMovement에 저장함
- 물리 시뮬레이션의 경우 현재 원드에 설정된 물리 씬에서 해당 컴포넌트의 물리 상태를 저장함
- 현재 컴포넌트의 물리 상태 정보를 ReplicatedMovement로 옮김 (FRigidBodyState::FillFrom)
- 이를 통해 최종 ReplicatedMovement가 설정되어 클라이언트에 보내짐
- 액터의 움직임 리플리케이션 옵션을 활성화해주어야 올바로 동작함
- GatherCurrentMovement
- 액터 움직임 정보의 수선
- 서버 액터의 ReplicatedMovement 변수가 변경되면 클라이언트의 OnRep이벤트 함수가 자동으로 호출 된다.
- OnRep_ReplicatedMovement
- Replicatedmovement의 물리 시뮬레이션 속성(bRepPhysics) 여부에 따라 두 가지로 실행됨
- 일반적인 움직임에 대한 처리
- Simulated Proxy에 대해서만 처리함
- 컴포넌트의 위치와 회전 정보를 갱신 함
- 속도 처리는 별도로 진행하지 않음
- 물리 움직임에 대한 처리
- ReplicatedMovement의 정보를 현재 컴포넌트의 물리 상태로 옮김 (FRigidBodyState::CopyTo)
- 물리 리플리케이션 씬에서 컴포넌트와 일치하는 타겟을 찾아서 업데이트 (FReplicatedPhysicsTarget)
- 물리 움직임의 동기화
- ApplyRigidBodyState
- 물리 리플리케이션의 틱에서 호출되는 함수
- 클라이언트의 물리 상태가 서버의 물리 상태의 오차 내에 있을 때까지 계속 호출됨
- 다음과 같은 로직으로 진행
- 서버에서 받은 최종 속도와 핑을 기반으로 클라이언트의 물리 상태를 외삽(Extrapolation)으로 예측
- 예측한 위치와 방향이 서버와 비교해 올바른지 체크하고 문제가 있다고 판단되면 에러 시간을 누적함
- 누적된 에러 시간 설정값을 넘으면 강제 조정(하드스냅)을 진행함
- 차이가 크지 않다면 내삽(Interpolation)을 수행해 현재 위치, 회전, 속도, 각속도를 조정함
- ApplyRigidBodyState
- 움직임 동기화 테스트하기
- 그냥 BP 액터를 생성시켰을 때는 다음과 같이 서버에서만 동작하는 것을 볼 수 있다. 하지만, 클라이언트에서는 보이지 않는 벽에 의해 밀려나는 모습을 볼 수 있다.
- 리플리케이트가 되지 않는 모습
- 이를 해결하기 위해서 Replicates 옵션을 활성화 시켜주자. 그러면 리플리케이트는 되지만 움직이지 않는다. 이를 해결하기 위해서 Replicate Movement를 활성화 시켜주자.
- 그럼 원하는 대로 움직임이 정상적으로 리플리케이트하게 된다.
- 물리 동기화 테스트하기
- 해당 옵션을 true로 설정하면 물리연산이 리플리케이트된다. 해당 옵션을 false로 두면 서버와 클라이언트의 물리 연산이 다르게 반영되는 걸 확인할 수 있다.
- Simulated Proxy 클라이언트의 움직임 진행
- SimulatedTick
- Simulated Proxy의 캐릭터가 처리하는 캐릭터의 움직임
- 캐릭터가 Simulated Proxy인 경우 캐릭터만의 추가적인 작업을 수행 (SimulateMovement)
- 시뮬레이션으로 캡슐을 이동시킨 후 메시의 움직임을 부드럽게 보간함 (SmoothClientPosition)
- SimulatedTick
해당 포스트는 인프런의 <이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이어 프레임웍의 이해>
강의를 수강하고 정리한 내용입니다.
이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해 강의 | 이득우 - 인프런
이득우 | 또 하나의 언리얼 엔진이라고도 불리는 네트웍 멀티플레이어 프레임웍을 학습합니다. 네트웍 멀티플레이어 게임을 제작할 때 반드시 알아야 하는 주요 개념, 내부 동작 원리, 최적화
www.inflearn.com
728x90
'공부 > 이득우의 언리얼 프로그래밍' 카테고리의 다른 글
[Study] Part 3 - 게임플로우 다듬기 (14/15) (0) | 2024.11.09 |
---|---|
[Study] Part 3 - 캐릭터 무브먼트의 확장 (13/15) (2) | 2024.09.10 |
[Study] Part 3 - 움직임 리플리케이션 (11/15) (3) | 2024.08.28 |
[Study] Part 3 - 캐릭터 공격 구현 개선 (10/15) (0) | 2024.08.27 |
[Study] Part 3 - 캐릭터 공격 구현 (9/15) (0) | 2024.08.26 |