Per supportare meccanismi fisici complessi e nel contempo mirare a un'esperienza fluida e reattiva per i giocatori, il motore fisico di Roblox utilizza un sistema di fisica distribuita in cui i calcoli sono distribuiti tra il server e tutti i client connessi. All'interno di questo sistema, il motore assegna la proprietà di rete dei BaseParts simulati fisicamente a un client o al server per suddividere il lavoro di calcolo della fisica.
I client sperimentano interazioni fisiche più reattive con le parti che possiedono, poiché non c'è latenza nella comunicazione con il server. La proprietà di rete migliora anche le prestazioni del server, poiché i calcoli fisici possono essere distribuiti tra i singoli client, consentendo al server di dare priorità ad altre attività.
Proprietà di BasePart
Per impostazione predefinita, il server mantiene la proprietà di qualsiasi BasePart. Inoltre, il server possiede sempre i BaseParts ancorati e non è possibile modificare manualmente la loro proprietà.
In base alla capacità hardware di un client e alla vicinanza del Player.Character di un giocatore a un BasePart non ancorato, il motore assegna automaticamente la proprietà di quella parte al client. Pertanto, le parti vicine al personaggio di un giocatore hanno maggiori probabilità di diventare di proprietà del giocatore.
Proprietà di Assemblaggio
Se un meccanismo basato su fisica non ha parti ancorate, impostare la proprietà su un assemblaggio all'interno di quel meccanismo imposta la stessa proprietà per ogni assemblaggio nel meccanismo.
Se ancorate un singolo assemblaggio che non fa parte di un meccanismo più ampio, la sua proprietà va al server, poiché il server possiede sempre i BaseParts ancorati. Una volta che lo stesso assemblaggio viene sbloccato, il suo stato di proprietà precedente viene perso e torna alla gestione automatica da parte del motore.
Se ancorate un assemblaggio all'interno di un meccanismo più ampio di assemblaggi, la sua proprietà va al server, ma la proprietà degli altri assemblaggi rimane invariata. Sbloccando lo stesso assemblaggio si ripristina la sua proprietà precedentemente impostata.
Impostare la proprietà
Nei giochi con interazioni fisiche complesse o nei casi in cui è necessario assegnare un controllo diretto, è possibile impostare la proprietà tramite una chiamata lato server a BasePart:SetNetworkOwner().
Considera un veicolo che ha un oggetto VehicleSeat per il conducente e un oggetto Seat per un passeggero, entrambi inclusi nell'assemblaggio del veicolo. Con le regole di proprietà predefinite, se un personaggio del giocatore si siede nel Seat (passeggero) e poi un altro giocatore salta nel VehicleSeat (conducente), il passeggero ottiene la proprietà fisica dell'intero veicolo perché è entrato per primo. Il conducente dovrà aspettare diversi cicli di rete prima che il suo input venga riconosciuto e il veicolo sembrerà meno reattivo.
Il seguente Script risolve questo assegnando manualmente la proprietà di rete al conducente. In esso, il VehicleSeat imposta il suo Occupant al Humanoid seduto su di esso, quindi lo script ascolta l'evento Changed del sedile per catturare quando un giocatore si siede nel sedile. Quando il conducente lascia il sedile, la proprietà di rete del veicolo torna alla gestione automatica con 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
-- Ottieni il giocatore dal personaggio
local player = Players:GetPlayerFromCharacter(humanoid.Parent)
if player then
vehicleSeat:SetNetworkOwner(player)
end
else
-- Ripristina la proprietà quando il sedile è non occupato
vehicleSeat:SetNetworkOwnershipAuto()
end
end
end)
Visualizzare la proprietà
Per assistere con il debug della proprietà di rete, Studio può rendere contorni colorati attorno agli oggetti durante il playtesting.
| Colore del contorno | Descrizione | |
|---|---|---|
| (verde) | Il tuo client possiede la parte ed è in fase di simulazione. | |
| (rosso) | La parte si trova all'interno di una "zona di buffer" in cui il tuo client la simula ma è ancora di proprietà di qualcos'altro. Il tuo client potrebbe ottenere la proprietà dopo questo, oppure potrebbe rifiutarla. | |
| (bianco/grigio) | Il server o un altro client possiedono la parte attraverso la proprietà di rete automatica o da assegnazione esplicita tramite part:SetNetworkOwner(). | |
| (nero) | La parte non è posseduta né dal server né dal client. La fisica non si applicherà a questa parte. | |
Per abilitare la visualizzazione della proprietà di rete:
Clicca sul pulsante opzioni di visualizzazione nell'angolo in alto a destra della finestra 3D.

Nel menu a discesa, attiva Proprietari di rete.
Preoccupazioni di sicurezza
Roblox non può verificare i calcoli fisici quando un client ha la proprietà di un BasePart. I client possono sfruttare questo e inviare dati errati al server, come teletrasportare il BasePart, facendolo passare attraverso i muri o volare in giro.
Inoltre, gli eventi BasePart.Touched sono legati alla proprietà di rete, il che significa che un client può attivare gli eventi Touched su un BasePart che possiede e inviarli al server, anche se il server non vede niente toccare. Ad esempio, un client può far sì che una spada infligga danno a un altro giocatore dall'altra parte della mappa attivando l'evento tramite iniezioni di script, quindi è importante verificare la validità di tali eventi attivati dai client.
Consulta Tattiche di sicurezza e mitigazione delle frodi per tattiche di sicurezza dettagliate e tattiche di mitigazione delle frodi per i giochi Roblox.