Relavancy
Net Load On Client
서버에서의 액터
언리얼 bit
캐릭터 무브먼트 동기화
애니메이션 동기화
클라에 모든 액터 동기화하거나 복제하지 않음
Relavancy로 판단하여 정함
기준은 owner, instigator, 거리 등 여러가지를 이용하여 Relavancy를 정하고, Relavancy가 있으면 복제 및 동기화 해줌
SetNetCullDistanceSquared(NetCullDistance * NetCullDistance);
서버에서 클라로 레플리케이션 해주는 Relavancy를 거리 기준으로 설정해줌
해당 거리 이내로 들어가면, 서버에서 클라로 레플리케이션 되면서 액터가 보임
거리 멀어지면 Relavancy 사라져서 클라에서 액터 사라짐(EndPlay 호출됨)
추가적으로, Net Load On Client 설정을 켜보면, 해당 액터가 거리가 멀어져도 화면에 보이긴 함
다만, 서버와의 동기화는 안 되어서 서버에서 액터가 움직여도 클라에서는 움직이지 않고 그냥 존재하기만 함
로그 찍어보니까 해당 옵션을 끄면, 액터가 거리에 따라 아예 레벨에 사라지고 존재하고를 반복.
클라에서 load하지 않다보니까 거리 멀면 애초에 레벨에 존재 안하는 것 같음. 로그찍어도 안 보임
그러다가 거리 가까워지면 서버에서 레플리케이션 되면서 액터도 생성되고, 로그도 나옴
해당 옵션을 키면 클라에서 load하는 것이니까 레플리케이션과 상관없이 일단 무조건 생성은 되는듯. 그래서 거리와 상관없이 항상 로그는 찍힘. 다만 거리가 멀면 동기화는 안 일어나고, 가까워야 동기화 일어남
액터 소환은 서버에서 해주어야, 서버 및 모든 클라에도 적용됨. RPC이용해서 서버에서 소환해주기. 그리고 소환된 액터는 bReplicates가 참이어야 서버에서 소환되고 클라로 복제됨. 안하면 서버에서만 소환됨
서버에서 클라로 복제된 액터들은 생성자부터 잘 실행됨. 마치 레벨에 새로 스폰한 것처럼
플레이어가 지뢰 밟는거나, 아이템 획득 등 모든 상호작용은 서버에서 인지하고 동작 처리해야함. HasAuthority()가 참일 때만, 피격, 오버랩, 히트 등을 처리. 클라에서는 오로지 서버가 결정한 향후 동작들을 수행해주는 역할만 해줌(동기화당하기, UI, 파티클..)
즉 모든 로직은 서버에서 처리하고 클라는 결과를 받기만 해야함
uint8 bIsExploded : 1에서 콜론(:)은 C++ 비트필드(bit-field) 선언 문법으로, uint8 타입 변수가 1비트만 사용하도록 지정. :은 해당 변수의 비트 크기를 명시.Replicate Movement 속성을 거짓으로 설정하면 동기화 안 돼서 내 클라에서는 캐릭터 이동하는데 서버나 다른 클라에서는 내 캐릭터 가만히 있음애니메이션 몽타주에서 노티파이가 호출되면 이 호출은 해당 몽타주를 재생하는 객체의 animinstance에 자동으로 이벤트를 전달함. 그래서 애님인스터스에서 노티파이 함수를 만들면 자동으로 연결이 되는 것
노티파이 이름을 AnimNotify_뒤에 붙여 함수이름을 만듦녀 해당 노티파이가 불렸을 때 바로 이 함수가 호출됨
UFUNCTION()
virtual void AnimNotify_AttackHit(); // AttackHit 노티파이 호출될 때 실행됨

if (KINDA_SMALL_NUMBER < MeleeAttackMontagePlayTime - MeleeAttackTimeDifference)
{
// ... //
FTimerHandle TimerHandle;
GetWorld()->GetTimerManager().SetTimer(TimerHandle,
FTimerDelegate::CreateLambda([&]()
{
bCanAttack = true;
OnRep_CanAttack();
}), MeleeAttackMontagePlayTime - MeleeAttackTimeDifference, false, -1.f);
}