본문 바로가기
Unreal Engine/[UE4] RPG Project

5. Dedicated Server 네트워킹 - Sprint 기능 Replication

by JJPearl 2022. 7. 1.
반응형

기존의 싱글플레이 게임 코드에서 데디케이티드 서버를 사용하는 멀티플레이 게임으로 구조를 변경중이다.

여러 머신에서 같은 플레이 화면을 보기 위해서는 Replication을 통한 동기화가 필요하다.

캐릭터의 입력,애니메이션 부터 동기화를 시작해보자.

일단 Sprint 기능부터 동기화 하려 한다.

 

- Sprint 상태 동기화

Sprint키를 눌렀을 때 캐릭터의 bIsSprinting=true 가 되었다는 것을 다른 클라이언트들에게도 알려주기 위해

함수 리플리케이션을 통해 다른 클라이언트에 함수를 똑같이 실행시켜준다.

 

- Character.h

replicated 변수

Replicated 속성을 사용하기 위해서는 GetLifetimeReplicatedProps() 함수에 Replicated할 속성값을 등록해줘야 한다.

클라이언트에서 호출하고 서버에서 실행되는 RPC
bIsSprinting의 상태를 바꿔주는 함수

 

- Character.cpp

클라이언트에서 호출하고 서버에서 실행되는 RPC
bIsSprinting의 상태를 바꿔주는 함수

server 키워드 : 클라이언트에서 호출하고 서버에서 실행되는 RPC

GetLifetimeReplicatedProps() 함수에 Replicated할 속성값을 등록

COND_SkipOwner 키워드 : 오너를 제외한 모든 접속에 전송

* 조건식 프로퍼티 리플리케이션(DOREPLIFETIME_CONDITION )

https://docs.unrealengine.com/4.27/ko/InteractiveExperiences/Networking/Actors/Properties/Conditions/

 

조건식 프로퍼티 리플리케이션

조건에 따라 액터 프로퍼티를 리플리케이트하는 법에 대한 상세 정보입니다.

docs.unrealengine.com

 

 

- Sprint 애니메이션 동기화

캐릭터에서 RPC를 통해 동기화해준 bIsSprinting 변수를 AnimBP StateMachine의 룰 변수에 Set해준다.  

AnimInstance의 NativeUpdateAnimation 함수 내에서 Character의 IsSprinting()을 받아 Set.

- AnimInstance.h

StateMachine의 트랜지션 룰

- AnimInstace.cpp

NativeUpdateAnimation

 

- Sprint키 눌렀을 시 속도 빨라지는 것 동기화 (Custom CharacterMovementComponent)

플레이어 캐릭터는 MovementComponent를 사용해서 이동, 점프를 하고 있다.

CharacterMovementComponent 를 사용하는 캐릭터는 자동으로 클라이언트-서버 네트워킹이 탑재되어 자동으로 위치, 회전 및 속도를 복제하기 때문에

MovementComponent를 사용한 이동은 movement replication 설정만 해주면 언리얼엔진에서 자동으로 리플리케이션 된다.

하지만 Sprint키를 눌렀을 때 MaxSpeed를 바꿔주도록 구현을 따로 해줘야한다.

 

Custom CharacterMovementComponent 를 만들어서 GetMaxSpeed() 함수 오버라이드.

IsSprinting() : Sprint키를 눌렀을 때 true를 반환.

GetMaxSpeed() 함수 내에서 플레이어캐릭터의 SpeedModifier를 얻어와 MaxSpeed값을 변경.

Custom CharacterMovementComponent - GetMaxSpeed 오버라이드

CharacterMovementComponent 내부적으로 GetMaxSpeed()를 이용해 MaxSpeed를 Set해주기 때문에 이 함수를 오버라이드 해주면 Sprint키를 눌렀을 때 빨라진 속도의 동기화가 가능하다.

 

 

반응형