TIL_075 : Relavancy, Net Load On Client, 서버에서의 액터, 언리얼 bit, 캐릭터 무브먼트 동기화, 애니메이션 노티파이 함수

김펭귄·2025년 12월 5일

Today What I Learned (TIL)

목록 보기
75/93

오늘 학습 키워드

  • Relavancy

  • Net Load On Client

  • 서버에서의 액터

  • 언리얼 bit

  • 캐릭터 무브먼트 동기화

  • 애니메이션 동기화

1. Relavancy

  • 클라에 모든 액터 동기화하거나 복제하지 않음

  • Relavancy로 판단하여 정함

  • 기준은 owner, instigator, 거리 등 여러가지를 이용하여 Relavancy를 정하고, Relavancy가 있으면 복제 및 동기화 해줌

SetNetCullDistanceSquared(NetCullDistance * NetCullDistance);

  • 서버에서 클라로 레플리케이션 해주는 Relavancy를 거리 기준으로 설정해줌

  • 해당 거리 이내로 들어가면, 서버에서 클라로 레플리케이션 되면서 액터가 보임

  • 거리 멀어지면 Relavancy 사라져서 클라에서 액터 사라짐(EndPlay 호출됨)

2. Net Load On Client

  • 추가적으로, Net Load On Client 설정을 켜보면, 해당 액터가 거리가 멀어져도 화면에 보이긴 함

  • 다만, 서버와의 동기화는 안 되어서 서버에서 액터가 움직여도 클라에서는 움직이지 않고 그냥 존재하기만 함

  • 로그 찍어보니까 해당 옵션을 끄면, 액터가 거리에 따라 아예 레벨에 사라지고 존재하고를 반복.
    클라에서 load하지 않다보니까 거리 멀면 애초에 레벨에 존재 안하는 것 같음. 로그찍어도 안 보임
    그러다가 거리 가까워지면 서버에서 레플리케이션 되면서 액터도 생성되고, 로그도 나옴

  • 해당 옵션을 키면 클라에서 load하는 것이니까 레플리케이션과 상관없이 일단 무조건 생성은 되는듯. 그래서 거리와 상관없이 항상 로그는 찍힘. 다만 거리가 멀면 동기화는 안 일어나고, 가까워야 동기화 일어남

3. 서버에서의 액터

  • 액터 소환은 서버에서 해주어야, 서버 및 모든 클라에도 적용됨. RPC이용해서 서버에서 소환해주기. 그리고 소환된 액터는 bReplicates가 참이어야 서버에서 소환되고 클라로 복제됨. 안하면 서버에서만 소환됨

  • 서버에서 클라로 복제된 액터들은 생성자부터 잘 실행됨. 마치 레벨에 새로 스폰한 것처럼

  • 플레이어가 지뢰 밟는거나, 아이템 획득 등 모든 상호작용은 서버에서 인지하고 동작 처리해야함. HasAuthority()가 참일 때만, 피격, 오버랩, 히트 등을 처리. 클라에서는 오로지 서버가 결정한 향후 동작들을 수행해주는 역할만 해줌(동기화당하기, UI, 파티클..)

  • 즉 모든 로직은 서버에서 처리하고 클라는 결과를 받기만 해야함

4. 언리얼 bit

  • uint8 bIsExploded : 1에서 콜론(:)은 C++ 비트필드(bit-field) 선언 문법으로, uint8 타입 변수가 1비트만 사용하도록 지정. :은 해당 변수의 비트 크기를 명시.
    비트 단위 직렬화/레플리케이션으로 네트워크 효율을 높이기 위함

5. 캐릭터 무브먼트 동기화

  • 캐릭터 무브먼트 컴포넌트는 자동으로 동기화 됨. Replicate Movement 속성을 거짓으로 설정하면 동기화 안 돼서 내 클라에서는 캐릭터 이동하는데 서버나 다른 클라에서는 내 캐릭터 가만히 있음

6. 애니메이션 노티파이 함수

  • 애니메이션 몽타주에서 노티파이가 호출되면 이 호출은 해당 몽타주를 재생하는 객체의 animinstance에 자동으로 이벤트를 전달함. 그래서 애님인스터스에서 노티파이 함수를 만들면 자동으로 연결이 되는 것

  • 노티파이 이름을 AnimNotify_뒤에 붙여 함수이름을 만듦녀 해당 노티파이가 불렸을 때 바로 이 함수가 호출됨

UFUNCTION()
virtual void AnimNotify_AttackHit();	// AttackHit 노티파이 호출될 때 실행됨
  • 애님 몽타주에서 montage tick type을 queued로 하면 노티파이가 약간 큐처럼 쌓아두고 한 번에 처리하는 느낌. branching point는 노티파이 즉시 하는 느낌. 그래서 큐는 약간 노티파이 밀려서 한 번에 2번씩 호출될 수 있고, branching point는 무조건 바로바로 해주지만 오버헤드가 있긴 하다
  • 애님 몽타주 실행 부분에서 서버와 클라간의 소통 딜레이를 고려하기 위해 아래와 같이 작성. 서버딜레이를 고려해 미리 타이머 걸어 클라에서 오히려 딱 맞는 시간에 공격이 가능하도록 해줌
if (KINDA_SMALL_NUMBER < MeleeAttackMontagePlayTime - MeleeAttackTimeDifference)
{
	// ... //
	FTimerHandle TimerHandle;
	GetWorld()->GetTimerManager().SetTimer(TimerHandle,
    									   FTimerDelegate::CreateLambda([&]()
		{
			bCanAttack = true;
			OnRep_CanAttack();
		}), MeleeAttackMontagePlayTime - MeleeAttackTimeDifference, false, -1.f);
}
profile
반갑습니다

0개의 댓글