void UCombatComponent::ServerFire_Implementation(const FVector_NetQuantize& TraceHitTarget)
{
MulticastFire(TraceHitTarget);
}
void UCombatComponent::MulticastFire_Implementation(const FVector_NetQuantize& TraceHitTarget)
{
if(Character && Character->IsLocallyControlled() && !Character->HasAuthority()) return;
LocalFire(TraceHitTarget);
}
void UCombatComponent::LocalFire(const FVector_NetQuantize& TraceHitTarget)
{
if(EquippedWeapon == nullptr) return;
if(Character && CombatState == ECombatState::ECS_Unoccupied)
{
Character->PlayFireMontage(bAiming);
EquippedWeapon->Fire(TraceHitTarget);
}
}
void UCombatComponent::Fire()
{
if(CanFire())
{
bCanFire = false;
ServerFire(HitTarget);
LocalFire(HitTarget);
StartFireTimer();
}
}
- LocalFire는 로컬에서 즉시 실행되도록 설계됨. 플레이어가 총을 발사할 때
ServerFire 전송하고 응답을 기다릴 필요 없이 발사 애니메이션과 같은 것들을 즉시 처리할 수 있음.
- 네트워크 지연으로 발생할 수 있는 반응 지연을 줄임.
MulticastFire 에서 모든 클라이언트에게 발사 정보를 브로드캐스트 하기 위해 사용되지만 LocalFire 에서 발사를 처리했으므로 중복 처리를 방지했따.