네트워크 소유권은 Roblox 엔진의 더 미묘하고 일반적으로 오해받는 측면 중 하나입니다. 플레이어가 부품이나 조립체의 네트워크 소유권을 가질 때, 그들은 해당 객체의 물리 시뮬레이션에 대한 완전한 권한을 갖습니다. 기본적으로 서버는 물리 시뮬레이션의 부하를 분산하기 위해 인근 플레이어 캐릭터가 있는 클라이언트에게 고정되지 않은 부품의 네트워크 소유권을 부여합니다. 이 시스템은 반응성을 개선하지만 모든 개발자가 이해해야 할 중요한 보안 문제를 발생시킵니다.
네트워크 소유권 이해하기
클라이언트가 부품(캐릭터 포함)의 네트워크 소유권을 가질 때, 그들은 다음에 접근할 수 있습니다:
조립체 조작:
- 어떤 위치로든 텔레포트.
- 이는 서버가 허용하는 만큼 많은 고정되지 않은 부품과 조립체의 소유권을 빠르게 얻고 제어하는 데 사용될 수 있습니다.
- 비행하거나 속도를 변경하는 등 그들의 이동과 상태를 조작합니다.
- 악용자는 자신의 Humanoid WalkSpeed를 어떤 값으로든 설정할 수 있습니다. 속성은 로컬 클라이언트에서 이벤트를 발생시키지 않고 로컬로 수정될 수 있으며, 이러한 속성 변경은 로컬 스크립트에서 읽을 수 없습니다.
- 임의의 애니메이션을 재생하고 애니메이션 상태를 조작합니다.
- 물리적 장애물을 우회하고 충돌을 변경합니다.
물리 조작
- 고정되지 않은 부품이나 메커니즘의 위치와 회전을 제어하며, CFrames에서 Inf 또는 NaN 구성 요소를 복제합니다. 부품 속도를 극단적인 값(포함 Inf 또는 NaN)으로 설정하여 다른 고정되지 않은 부품/조립체의 물리에 간섭할 수 있으며, 이는 악용자가 소유하지 않은 것들에도 해당됩니다. 이는 종종 다른 플레이어 캐릭터와 인근 부품을 튕겨내는 데 사용됩니다. Touched 이벤트의 발생을 조작하며, Touched를 전혀 발생시키지 않을 수도 있습니다.
게임에서 게임 플레이에 중요한 완전히 고정되지 않은 부품이나 조립체가 필요하다면, 네트워크 소유권 API를 사용하여 소유권을 수동으로 설정하거나 자동 소유권을 끄는 것을 고려하세요.
이동 검증
경쟁 게임에서 플레이어 이동의 서버 측 검증은 시뮬레이션의 무결성을 위해 매우 중요합니다. 클라이언트가 캐릭터 이동과 물리를 제어하기 때문입니다. 그러나 보편적인 솔루션은 존재하지 않으며, 게임 플레이 메커니즘이 다양하기 때문입니다.
전통적인 방법은 복잡한 시나리오에서 종종 부족합니다. 간단한 거리-시간 계산은 경쟁 슈팅 게임에서는 충분할 수 있지만, 차량, 비행 또는 복잡한 상호작용이 포함된 물리 집약적인 게임에서는 실패합니다. 검증은 네트워크 지연도 고려해야 합니다.
서버 권한이 제공될 때까지 클라이언트 측 검증을 구현하는 개발자는 효과적인 접근 방식이 극적으로 다를 수 있음을 이해해야 합니다. 기본적인 휴리스틱은 불안정한 연결을 가진 무고한 플레이어를 플래그할 수 있으며, 간단한 속도 계산은 복잡한 이동 시스템이 있는 게임에서 무너집니다. 위치 업데이트는 인터넷 지연의 영향을 받으며, 시간에 따라 평균을 내야 합니다. 많은 개발자들은 누수 버킷 스타일의 누산기가 급격한 이동을 처리하면서 지속적인 위반을 방지하는 데 잘 작동한다고 생각합니다.
실용적인 구현은 종종 특정 평면(예: 지면 기반 이동을 위한 XZ)에 이동을 투영해야 하며, 이는 정당한 수직 이동을 처벌하지 않으면서 수평 텔레포트를 감지하는 데 도움이 됩니다. 정당한 텔레포트 메커니즘이 있는 게임은 명시적인 면제 시스템이 필요합니다. 검증 빈도, 허용 수준 및 집행 전략은 각 게임의 특정 요구 사항에 맞게 조정되어야 합니다.