Server RPC로 서버에 요청 보내기
14강. Server RPC로 서버에 요청 보내기
1. 이번 강의에서 해결할 문제
클라이언트가 문 열림이나 점령 시작을 로컬에서 확정하면 서버와 다른 플레이어는 그 결과를 모릅니다. 반대로 입력 전체를 서버에 맡기면 카메라와 UI 반응까지 지연됩니다. 로컬 입력은 의도를 만들고 서버가 월드 규칙을 검증하는 경계를 구현합니다.
2. 학습 목표
3. 핵심 개념
좋은 Server RPC 인자는 최소한의 의도입니다. 클라이언트가 bDoorOpened=true, Score=100 같은 결과를 보내지 않고 “이 문과 상호작용하고 싶다”를 보냅니다. 서버는 서버 Character 위치, 실제 Trace, 문 상태와 쿨다운으로 결과를 계산합니다.
Client가 보낸 AActor*는 편리하지만 신뢰할 수 있는 권한 증명이 아닙니다. 서버에서 유효성·종류·거리·Relevancy를 다시 검사하고 가능하면 서버 Trace로 대상을 재확정합니다.
4. 단계별 실습
UFUNCTION(BlueprintCallable, Category = "Interaction")
void TryInteract();
UFUNCTION(Server, Reliable)
void Server_TryInteract(FVector_NetQuantize TraceStart,
FVector_NetQuantizeNormal ViewDirection);
void ACaptureArenaCharacter::TryInteract()
{
if (!IsLocallyControlled()) return;
FVector ViewLocation;
FRotator ViewRotation;
Controller->GetPlayerViewPoint(ViewLocation, ViewRotation);
// 즉시 로컬 조준 표시만 갱신하고 월드 상태는 바꾸지 않습니다.
Server_TryInteract(ViewLocation, ViewRotation.Vector());
}
void ACaptureArenaCharacter::Server_TryInteract_Implementation(
FVector_NetQuantize TraceStart,
FVector_NetQuantizeNormal ViewDirection)
{
if (!Controller || !IsAlive()) return;
const FVector ServerOrigin = GetPawnViewLocation();
if (FVector::DistSquared(ServerOrigin, TraceStart) > FMath::Square(100.0f))
{
return;
}
const FVector End = ServerOrigin + ViewDirection * 250.0f;
FHitResult Hit;
FCollisionQueryParams Params(SCENE_QUERY_STAT(ServerInteract), false, this);
if (!GetWorld()->LineTraceSingleByChannel(
Hit, ServerOrigin, End, ECC_Visibility, Params))
{
return;
}
if (ICaptureInteractable* Interactable = Cast<ICaptureInteractable>(Hit.GetActor()))
{
Interactable->Execute_ServerInteract(Hit.GetActor(), this);
}
}
FVector_NetQuantize 계열은 네트워크 전송 정밀도와 크기를 의도적으로 제한합니다. 서버는 전달받은 시작점을 그대로 사용하지 않고 서버가 아는 View 위치와 허용 오차를 비교합니다. 상호작용 결과는 대상 Actor의 Replicated Property가 전달합니다.
5. 코드가 동작하는 이유
입력과 카메라는 소유 클라이언트에서 즉시 읽지만 Character의 Ownership이 Server RPC를 서버로 라우팅합니다. 서버는 자신의 Character 위치에서 Trace해 클라이언트가 벽 너머 Actor나 먼 대상을 지정하는 것을 막습니다. 승인 뒤 Actor 상태가 복제되어 모든 관련 클라이언트가 같은 결과에 수렴합니다.
6. 자주 하는 실수와 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
Server RPC로 서버에 요청 보내기 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.