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