NetMulticast RPC로 모두에게 효과 보여 주기
17강. NetMulticast RPC로 모두에게 효과 보여 주기
1. 이번 강의에서 해결할 문제
모든 클라이언트에 보여야 한다는 이유로 체력, 문 열림과 점령 상태를 Multicast로 보내면 늦은 참가자는 과거 호출을 받지 못하고 패킷 손실 뒤 잘못된 상태에 머뭅니다. Multicast는 현재 상태 저장소가 아니라 서버가 승인한 순간 표현을 여러 관련 연결에 알리는 도구입니다.
2. 학습 목표
3. 핵심 개념
서버가 복제 Actor의 NetMulticast RPC를 호출하면 서버와 현재 그 Actor가 관련성 있는 클라이언트에서 실행됩니다. 클라이언트가 호출하면 일반적으로 그 클라이언트 로컬에서만 실행되므로 권위 있는 브로드캐스트가 아닙니다. 호출 기록이 저장되지 않아 나중에 관련성이 생긴 연결이나 늦은 참가자는 과거 효과를 받지 않습니다.
적합: 총구 섬광, 충격 파티클, 짧은 사운드, 이미 상태로 확정된 행동의 일시적 표현. 부적합: 현재 체력, 팀 점수, 문 열림, 점령 소유 팀, 준비 상태.
4. 단계별 실습
UFUNCTION(NetMulticast, Unreliable)
void Multicast_PlayFireEffects(
FVector_NetQuantize MuzzleLocation,
FVector_NetQuantize ImpactLocation,
bool bHitTarget);
void ACaptureWeapon::ServerExecuteFire(const FHitResult& Hit)
{
check(HasAuthority());
if (AActor* HitActor = Hit.GetActor())
{
UGameplayStatics::ApplyPointDamage(
HitActor, Damage, Hit.TraceEnd - Hit.TraceStart,
Hit, GetInstigatorController(), this, DamageType);
}
Multicast_PlayFireEffects(
GetMuzzleLocation(), Hit.ImpactPoint, Hit.bBlockingHit);
}
void ACaptureWeapon::Multicast_PlayFireEffects_Implementation(
FVector_NetQuantize MuzzleLocation,
FVector_NetQuantize ImpactLocation,
bool bHitTarget)
{
if (GetNetMode() == NM_DedicatedServer) return;
SpawnMuzzleFx(MuzzleLocation);
if (bHitTarget)
{
SpawnImpactFx(ImpactLocation);
}
}
데미지는 Multicast 이전에 서버에서 확정됩니다. 전용 서버는 렌더링하지 않으므로 표현 코드를 건너뜁니다. 소유 클라이언트가 이미 로컬 예측 효과를 재생했다면 Multicast를 다시 받을 때 중복되지 않도록 Shot Sequence나 COND_SkipOwner 상태와 함께 설계할 수 있지만 이 강의에서는 서버 효과 하나만 재생합니다.
5. 코드가 동작하는 이유
서버가 Trace와 데미지를 처리한 뒤 효과 위치만 여러 클라이언트에 보냅니다. 효과 패킷이 유실돼도 권위 있는 체력은 RepNotify로 수렴합니다. Actor가 관련 없는 먼 클라이언트에는 Multicast가 전달되지 않을 수 있으며 이는 효과 대상과 Relevancy를 함께 설계해야 함을 뜻합니다.
6. 자주 하는 실수와 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
NetMulticast RPC로 모두에게 효과 보여 주기 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.