TIL_081 : 달리기/Crouch 동기화

김펭귄·2025년 12월 15일

Today What I Learned (TIL)

목록 보기
81/111

오늘 학습 키워드

  • 달리기, Crouch 동기화

1. 달리기, Crouch 동기화

1.1. 문제상황

  • 일반적인 걷기는 동기화 잘 됨 (왼쪽이 내화면, 오른쪽은 상대화면)

  • 그러나 달리면, 속도도 안 증가하고, 내 화면에서 부들부들 떨음

  • Crouch로 웅크려 걸으면, 속도는 잘 감소하지만, 마찬가지로 내 화면에서 부들거림

1.2. 해결방법

  • CharacterMovement컴포넌트는 당연히 동기화되는줄 알고 있었어서, sprint와 crouch할 때 동기화를 추가로 안 해주었음

  • 동기화를 해주지 않아 발생했던 문제로, 동기화를 해결해주면 해결되는 것이었음

  • 다만, 기본으로 가지고 있는 캐릭터 무브먼트 컴포넌트에서는 sprint와 crouch가 동기화 되어 있지 않았고, 이를 직접 수정하고 싶지는 않았음

  • 따라서 OnRep함수와 NetMulticast를 이용해 동기화해줌

1.3. OnRep vs 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 함수
}

1.4. 결과 영상

(왼쪽 내 화면, 오른쪽 상대 화면)

profile
반갑습니다

0개의 댓글