수정중인 페이지 입니다.

지연 보상

소개

지연 보상은 빠른 속도의 네트워크 게임에서 핵심적인 문제를 해결합니다. 클라이언트를 신뢰할 수 없는 상태에서도 WYSIWYG을 경험할 수 있습니다.

문제는 네트워크의 어떤 머신에서도 게임에서 정확히 같은 틱을 표시하지 않는다는 것입니다. 한 클라이언트가 보고 행동의 기반이 되는 것은 하나의 클라이언트에서만 100% 맞습니다. 일반적인 예는 멀리 있는 물체를 명중하도록 쏘는 것입니다. 클라이언트가 직접 조준기에 표적을 가지고 있지만 실제로는 이미 움직인 상태입니다.

  • 권위 있는 서버가 히트 탐지를 오로지 자신의 세계 인식에만 근거한다면 누구도 고의로 어떤 것도 히트하지 못할 것입니다.
  • 만약 클라이언트가 권한을 부여받고 히트한 것을 서버에 알려줄 수 있다면, 그 시스템은 단순한 게임을 파괴할 수 있게 되도록 악용될 것입니다.

지연 보상은 서버가 순간적으로 각 클라이언트의 관점에서 세상을 바라보며 실제로 불가능한 씬을 찍을 수 있는 위치에 있는지 결정할 수 있게 해줍니다. 반대로, 이것은 목표물이 벽 뒤로 안전하게 끌려갔다고 느낄지라도 명중할 수 있다는 것을 의미합니다. 그러나 이것은 알아챌 수 있는 가능성이 훨씬 낮습니다.

Fusion은 HitBoxes가 과거에 어디에 위치했는지를 기록하고 각 클라이언트의 시각이 현재 서버 상태와 비교해 얼마나 뒤처져 있는지를 알고 있습니다. 이력을 사용하여 Fusion은 과거에 레이캐스팅을 통해 지연 보상 레이캐스트를 수행할 수 있습니다. ( 알림: 클라이언트가 입력 권한이 있는 객체의 경우에만 서버에 앞서 있습니다.)

초고정밀을 위해 Fusion은 한 단계 더 지연 보상이 가능합니다. AAA 게임의 프레임은 일반적으로 네트워크의 틱 속도보다 높습니다. 플레이어가 화면에서 실제로 보는 것은 보통 개별 틱에서 보는 것이 아니라 두 틱 사이의 보간입니다. Fusion은 지연 보상 레이캐스트가 두 틱 사이에서 얼마나 멀리 만들어졌는지 정확히 알고 있으며, 이를 사용하여 정확한 레이캐스트를 할 수 있습니다.

메인 화면으로

지연 보상 특징

Fusion을 사용하는 게임 개발자들에게 이 모든 마법은 거의 투명합니다. 일반 유니티 콜라이더 대신 또는 추가로 미리 제작된 HitBox 컴포넌트만 있으면 됩니다.

HitBox

네트워크 GameObject에서 지연 보상 히트 박스를 설정하려면 다음 두 단계가 필요합니다:

  1. HitBoxRoot 컴포넌트는 GameObject의 최상위 노드에 필요합니다. HitBoxRoot는 자식에서 발견되는 모든 HitBox 컴포넌트를 그룹화하는 역할을 담당니다.

  2. HitBox 노드는 모든 동적 객체에 대해 일반 유니티 Collider 컴포넌트와 별도의 레이어로 유지해야 합니다. 이는 레이캐스팅 시 동적 Collider를 Hitbox에서 분리하는 가장 빠르고 신뢰할 수 있는 방법입니다. 이러한 분리를 통해 지연 보상 레이캐스트는 모든 정적 지오메트리에 도달하는 동시에 비용이 엄청나게 많이 드는 HitBox 컴포넌트를 추가할 필요가 없습니다. 동시에 모든 동적 히트는 HitBox에만 의존해야 하지만 동적 콜라이더는 개체가 PhysX와 원활하게 상호 작용할 수 있도록 하기 위해 필요하므로 완전히 제거할 수 없습니다. 중간 지대는 동적 콜라이더를 지연 보상 레이 캐스트에 의해 무시될 수 있는 레이어에 유지하는 것입니다.

주의: HitBoxRoot당 31개의 HitBox 노드가 제한됩니다. 단일 객체 또는 프리팹에 더 많은 하위 노드가 필요한 경우 계층을 세분화하여 여러 루트로 분산해야 합니다.

히트 박스 계층의 구체적인 구조체는 전적으로 특정 게임의 필요에 달려 있습니다.

메인 화면으로

레이캐스트

서버에서 지연 보상 물리 쿼리를 수행하는 것은 내장된 PhysX 레이캐스트만큼 간단하며 중복 검사도 지원합니다. 네트워크 GameObject에 Fusion의 사전 빌드 Hitbox 컴포넌트를 추가하기만 하면 됩니다.

API는 PhysX 내에 보관되는 시차 보상 데이터와 정적 수준 데이터를 모두 쿼리할 때 동일합니다.

Runner.LagCompensation.Raycast(transform.position, transform.forward, 25, Object.InputAuthority, out var hit);

Object.InputAuthority는 Fusion이 이 히트 스캔/발사체를 제어하고 있다고 말합니다. 레이캐스트는 해당 데이터를 제어한 특정 플레이어 클라이언트가 본 타임 프레임과 일치하는 데이터에 대해 수행됩니다. 이 모든 것이 자동으로 수행되므로 복잡한 수학을 추가할 필요가 없습니다!

기술문서 TOP으로 돌아가기