플레이어에게 부드럽고 반응성 있는 경험을 제공하면서도 복잡한 물리적 메커니즘을 지원하기 위해 Roblox 물리학 엔진은 서버와 모든 연결된 클라이언트 사이에서 계산이 분산되는 분산 물리학 시스템을 사용합니다.이 시스템 내에서 엔진은 물리적으로 시뮬레이션된 네트워크 소유권을 클라이언트나 서버에 할당하여 물리학 계산의 작업을 분할합니다.
클라이언트는 서버와의 통신 지연이 없기 때문에 보유부품과의 더 민감한 물리 상호 작용을 경험합니다.네트워크 소유권은 물리 계산을 개별 클라이언트 간에 분할할 수 있으므로 서버가 다른 작업을 우선시할 수 있습니다.
기본 부품 소유권
기본적으로 서버는 모든 BasePart의 소유권을 유지합니다.또한 서버는 항상 고정된 BaseParts 소유하며 소유권을 수동으로 변경할 수 없습니다.
클라이언트의 하드웨어 용량과 플레이어의 Player.Character 부착 여부와 상관없이 고정되지 않은 BasePart 부분의 소유권을 엔진이 자동으로 클라이언트에 할당합니다.따라서 플레이어의 캐릭터에 가까운 부품은 플레이어 소유가 될 가능성이 더 높습니다.
조립 소유권
물리 기반 메커니즘에 고정된 부품이 없으면, 설정 소유권 메커니즘 내의 어셔블리에서는 해당 메커니즘의 모든 어셔블리에 동일한 소유권을 설정합니다.
광범위한 메커니즘의 일부가 아닌 단일 어셈블리를 고정하면, 서버는 항상 고정된 를 소유하기 때문에 소유권이 서버로 이동합니다.동일한 어셈블리를 고정 해제하면 이전 소유 상태가 손실되고 엔진에 의한 자동 처리로 되돌아갑니다.
한 어셈블리를 더 광범위한 어셈블리 메커니즘 내에 고정하면 소유권이 서버로 이동하지만 다른 어셈블리의 소유권은 변경되지 않습니다.동일한 어셈블리를 고정 해제하면 이전에 설정된 소유권이 되돌아갑니다.
소유권 설정
복잡한 물리 상호 작용이 있거나 직접 제어를 할당해야 하는 경우 서버 측 호출을 통해 BasePart:SetNetworkOwner()에 소유권을 설정할 수 있습니다.
차량에 운전자를 위한 VehicleSeat 개체와 승객을 위한 Seat 개체가 모두 포함된 차량 조립에서 고려하십시오.기본 소유권 규칙에서는 플레이어 캐릭터가 Seat (승객)에 앉아 있고 다른 플레이어가 VehicleSeat (드라이버)에 점프하면 승객 이 전체 차량의 물리적 소유권을 얻습니다. 왜냐하면 그들이 먼저 들어갔기 때문입니다.드라이버는 입력이 인식되기 전에 몇 번의 네트워크 사이클을 기다려야 하고 차량은 응답성이 덜 될 것입니다.
다음 Script 수정은 드라이버에 네트워크 소유권을 수동으로 할당하여 이를 해결합니다.그것에서, VehicleSeat 는 그것에 앉아있는 Occupant 에 자신의 Humanoid 을 설정하여 스크립트가 플레이어가 좌석에 앉을 때 좌석의 Changed 이벤트를 듣도록 합니다.드라이버가 자리를 떠나면 차량의 네트워크 소유권이 BasePart:SetNetworkOwnershipAuto()로 자동으로 되돌아갑니다.
local Players = game:GetService("Players")
local vehicleSeat = script.Parent
vehicleSeat.Changed:Connect(function(prop)
if prop == "Occupant" then
local humanoid = vehicleSeat.Occupant
if humanoid then
-- 캐릭터에서 플레이어 가져오기
local player = Players:GetPlayerFromCharacter(humanoid.Parent)
if player then
vehicleSeat:SetNetworkOwner(player)
end
else
-- 좌석이 비어 있을 때 소유권 재설정
vehicleSeat:SetNetworkOwnershipAuto()
end
end
end)
소유권 시각화
네트워크 소유권 디버깅을 지원하기 위해 Studio는 플레이테스트 중에 개체 주위에 색상이 있는 선을 렌더링할 수 있습니다.
요약 색상 | 설명 | |
---|---|---|
(녹색) | 클라이언트가 부품을 소유하고 시뮬레이션하고 있습니다. | |
(빨간색) | 부품은 클라이언트가 시뮬레이션하는 곳의 "버퍼 영역"에 있지만 여전히 다른 것에 소유되어 있습니다.클라이언트는 이 후에 소유권을 얻을 수도 있고, 거부할 수도 있습니다. | |
(화이트/그레이) | 서버나 다른 클라이언트가 자동 네트워크 소유권을 통해 또는 명시적으로 할당을 통해 부품을 소유합니다. |
네트워크 소유권 시각화를 활성화하려면:
3D 뷰포트의 오른쪽 상단 구석에 있는 시각화 옵션 버튼을 클릭하십시오.
드롭다운 메뉴에서 네트워크 소유자 를 토글합니다.
보안 우려
클라이언트가 BasePart에 소유권을 갖고 있을 때 물리 계산을 확인할 수 없습니다. Roblox cannot verify physics calculations when a client has ownership over a .클라이언트는 이를 악용하여 서버에 나쁜 데이터를 전송할 수 있습니다(예: BasePart를 순간이동하여 벽을 통과하거나 주위를 날아다니기).
또한, 이벤트는 네트워크 소유권과 연결되어 있으므로 클라이언트가 소유하는 이벤트를 네트워크에 발사하고 서버에 전송할 수 있지만, 서버가 그것을 만지지 않는다고 해도 됩니다.예를 들어, 클라이언트는 스크립트 삽입을 통해 맵 전체에서 다른 플레이어에게 칼 거래 피해를 입힐 수 있으므로 클라이언트가 발사하는 이러한 이벤트의 유효성을 확인하는 것이 중요합니다.
Roblox 경험에 대한 자세한 보안 전략과 치트 방지 전략은 보안 전략 및 치트 방지 대책에 참조하십시오.