Para soportar mecanismos físicos complejos y a la vez buscar una experiencia suave y responsiva para los jugadores, el motor de física de Roblox utiliza un sistema de física distribuida en el que los cálculos se distribuyen entre el servidor y todos los clientes conectados. Dentro de este sistema, el motor asigna la propiedad de red de BaseParts simulados físicamente a un cliente o al servidor para dividir el trabajo de cálculo de física.
Los clientes experimentan interacciones físicas más responsivas con las partes que poseen, ya que no hay latencia por la comunicación con el servidor. La propiedad de red también mejora el rendimiento del servidor porque los cálculos de física se pueden dividir entre los clientes individuales, permitiendo que el servidor priorice otras tareas.
Propiedad de BasePart
Por defecto, el servidor retiene la propiedad de cualquier BasePart. Además, el servidor siempre posee BaseParts anclados y no se puede cambiar manualmente su propiedad.
Basado en la capacidad de hardware de un cliente y la proximidad del Player.Character del jugador a un BasePart no anclado, el motor asigna automáticamente la propiedad de esa parte al cliente. Así, las partes cercanas al personaje de un jugador tienen más probabilidades de convertirse en parte de su propiedad.
Propiedad de ensamblaje
Si un mecanismo basado en física no tiene partes ancladas, establecer la propiedad en un ensamblaje dentro de ese mecanismo establece la misma propiedad para cada ensamblaje en el mecanismo.
Si anclas un ensamblaje solitario que no es parte de un mecanismo más amplio, su propiedad va al servidor, ya que el servidor siempre posee BaseParts anclados. Al desanclar el mismo ensamblaje, se pierde su estado de propiedad anterior y vuelve a ser gestionado automáticamente por el motor.
Si anclas un ensamblaje dentro de un mecanismo más amplio de ensamblajes, su propiedad va al servidor, pero la propiedad de los otros ensamblajes permanece sin cambios. Desanclar el mismo ensamblaje revierte su propiedad establecida anteriormente.
Estableciendo la propiedad
En juegos con interacciones físicas complejas o en casos donde necesitas asignar control directo, puedes establecer la propiedad a través de una llamada del lado del servidor a BasePart:SetNetworkOwner().
Considera un vehículo que tiene un objeto VehicleSeat para el conductor y un objeto Seat para un pasajero, ambos incluidos en el ensamblaje del vehículo. Con las reglas de propiedad por defecto, si un personaje de jugador se sienta en el Seat (pasajero) y luego otro jugador salta al VehicleSeat (conductor), el pasajero gana la propiedad física de todo el vehículo porque fue el primero en entrar. El conductor tendrá que esperar varios ciclos de red antes de que su entrada sea reconocida y el vehículo se sentirá menos receptivo.
El siguiente Script soluciona esto al asignar manualmente la propiedad de red al conductor. En él, el VehicleSeat establece su Occupant al Humanoid que está sentado en él, por lo que el script escucha el evento Changed del asiento para capturar cuando un jugador se sienta en el asiento. Cuando el conductor abandona el asiento, la propiedad de red del vehículo se revierte a la gestión automática 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
-- Obtener al jugador del personaje
local player = Players:GetPlayerFromCharacter(humanoid.Parent)
if player then
vehicleSeat:SetNetworkOwner(player)
end
else
-- Restablecer la propiedad cuando el asiento no esté ocupado
vehicleSeat:SetNetworkOwnershipAuto()
end
end
end)
Visualizando la propiedad
Para ayudar con la depuración de la propiedad de red, Studio puede renderizar contornos coloreados alrededor de los objetos al probar el juego.
| Color del contorno | Descripción | |
|---|---|---|
| (verde) | Tu cliente posee la parte y la está simulando. | |
| (rojo) | La parte está dentro de una "zona de búfer" donde tu cliente la está simulando, pero todavía está en posesión de otra cosa. Tu cliente podría obtener la propiedad después de esto, o podría rechazarla. | |
| (blanco/gris) | El servidor u otro cliente posee la parte a través de la propiedad de red automática o por asignación explícita a través de part:SetNetworkOwner(). | |
| (negro) | La parte no es propiedad ni del servidor ni del cliente. La física no se aplicará a esta parte. | |
Para habilitar la visualización de la propiedad de red:
Haz clic en el botón de opciones de visualización en la esquina superior derecha de la ventana 3D.

En el menú desplegable, activa Propietarios de red.
Problemas de seguridad
Roblox no puede verificar los cálculos de física cuando un cliente tiene propiedad sobre un BasePart. Los clientes pueden explotar esto y enviar datos incorrectos al servidor, como teletransportar el BasePart, hacerlo atravesar paredes o volar alrededor.
Además, los eventos BasePart.Touched están ligados a la propiedad de red, lo que significa que un cliente puede disparar eventos Touched en un BasePart que posee y enviarlo al servidor, incluso si el servidor no lo ve tocar nada. Por ejemplo, un cliente puede hacer que una espada cause daño a otro jugador al otro lado del mapa al disparar el evento a través de inyecciones de scripts, por lo que es importante verificar la validez de tales eventos disparados por los clientes.
Consulta Tácticas de seguridad y mitigación de trampas para obtener tácticas de seguridad detalladas y tácticas de mitigación de trampas para juegos de Roblox.