일반적인 걷기는 동기화 잘 됨 (왼쪽이 내화면, 오른쪽은 상대화면)
그러나 달리면, 속도도 안 증가하고, 내 화면에서 부들부들 떨음
Crouch로 웅크려 걸으면, 속도는 잘 감소하지만, 마찬가지로 내 화면에서 부들거림
CharacterMovement컴포넌트는 당연히 동기화되는줄 알고 있었어서, sprint와 crouch할 때 동기화를 추가로 안 해주었음
동기화를 해주지 않아 발생했던 문제로, 동기화를 해결해주면 해결되는 것이었음
다만, 기본으로 가지고 있는 캐릭터 무브먼트 컴포넌트에서는 sprint와 crouch가 동기화 되어 있지 않았고, 이를 직접 수정하고 싶지는 않았음
따라서 OnRep함수와 NetMulticast를 이용해 동기화해줌
동기화를 하려다보니, 서버에서 자신과 모든 클라에게 함수를 호출시키고 싶을 때, OnRep함수와 NetMulticast 중에서 무엇을 사용해야하는지 고민되었음
(서버에서도 OnRep을 직접 호출해 두 상황 다 동작은 동일하다는 가정)
찾아보니 OnRep으로 발생하는 패킷에서는 값 변경만 존재하기에 패킷크기가 좀 작고, NetMulticast는 멀티캐스트헤더도 패킷에 들어가야해서 패킷크기가 상대적으로 좀 큼
그래서 동작이 동일하다면 OnRep을 사용하는 것이 더 좋다 판단함
그래서 Sprint에는 CurrentSpeed 변수를 이용하여 OnRep을 해주었고, Crouch에서는 동기화할 변수를 따로 만들기가 애매해서 NetMulticast를 이용하여 동기화함
// MyCharacter.h
UPROPERTY(Replicated, ReplicatedUsing = OnRep_SetSpeed) // 동기화변수
float CurrentSpeed;
// MyCharacter.cpp
void AMyCharacter::StartSprint(const FInputActionValue& Value)
{
ServerRPC_StartSprint();
}
void AMyCharacter::ServerRPC_StartSprint_Implementation()
{
CurrentSpeed = BaseWalkSpeed * SprintSpeedMultiplier;
OnRep_SetSpeed()
}
void AMyCharacter::StopSprint(const FInputActionValue& Value)
{
ServerRPC_StopSprint();
}
void AMyCharacter::ServerRPC_StopSprint_Implementation()
{
CurrentSpeed = BaseWalkSpeed;
OnRep_SetSpeed()
}
// 동기화 되어 불러질 함수
void AMyCharacter::OnRep_SetSpeed()
{
GetCharacterMovement()->MaxWalkSpeed = CurrentSpeed;
}
void AMyCharacter::StartCrouch(const FInputActionValue& Value)
{
ServerRPC_Crouch();
}
void AMyCharacter::ServerRPC_Crouch_Implementation()
{
MulticastRPC_Crouch();
}
void AMyCharacter::MulticastRPC_Crouch_Implementation()
{
// crouch 함수
}
(왼쪽 내 화면, 오른쪽 상대 화면)