Propiedad de la red

Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.

Con el fin de admitir mecanismos físicos complejos mientras también apunta a una experiencia fluida y receptiva para los jugadores, el motor de Roblox physics utiliza un sistema de física distribuida en el que las computaciones se distribuyen entre el servidor y todos los clientes conectados. Dentro de este sistema, el motor asigna propiedad de red de BaseParts a un cliente o servidor para dividir el trabajo de calcular la física.

Los clientes experimentan interacciones físicas más receptivas con las partes que en posesión, ya que no hay latencia por la comunicación con el servidor. La propiedad de la red también mejora el rendimiento del servidor porque las computaciones de física se pueden dividir entre clientes individuales, lo que permite al servidor priorizar otras tareas.

Visualizando la propiedad

Para ayudar con la depuración de la propiedad de la red, Studio puede renderizar contornos de colores alrededor de los objetos durante la prueba de reproducción.

Propiedad de la parte indicada a través de contornos de colores

Para habilitar la visualización de propiedad:

  1. Abrir ArchivoConfiguración del Studio .

  2. En la pestaña Física , habilita Se muestran los propietarios .

    Studio Settings window showing Are Owners Shown option

Propiedad de la parte base

Por defecto, el servidor mantiene la propiedad de cualquier BasePart . Además, el servidor siempre posee anclado BaseParts y no puede cambiar manualmente su propiedad.

Basado en la capacidad de hardware de un cliente y la Player.Character proximidad del jugador a un BasePart no codificado, el motor asigna automáticamente la propiedad de esa parte al cliente. Por lo tanto, es más probable que las partes cercanas al personaje de un jugador se conviertan en propiedad del jugador.

Propiedad de Asamblea

Si un mecanismo basado en física no tiene partes ancladas, establecer la propiedad en un montaje dentro de ese mecanismo establece la misma propiedad para cada montaje en el mecanismo.

Si anclas una asamblea solitaria que es no parte de un mecanismo más amplio, su propiedad va al servidor, ya que el servidor siempre posee anclado BaseParts . Al descorregar la misma asamblea, su estado de propiedad anterior se pierde y vuelve al manejo automático por el motor.

Si anclas una asamblea dentro de un mecanismo más amplio de asambleas, su propiedad pasa al servidor, pero la propiedad de las otras asambleas permanece sin cambios. Desanclar la misma asamblea revertirá su propiedad previamente establecida.

Configurar propiedad

En experiencias con interacciones de física complejas o en casos en los que necesitas asignar control directo, puedes establecer la propiedad a través de una llamada del lado del servidor a BasePart:SetNetworkOwner().

Considere un vehículo que tenga un VehicleSeat objeto para el conductor y un Seat objeto para un pasajero, ambos incluidos en el montaje del vehículo. Con las reglas de propiedad predeterminadas, 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 entró primero. El conductor tendrá que esperar varios ciclos de red antes de que se reconozca su entrada y el vehículo se sentirá menos sensible.

El siguiente Script corrige esto asignando manualmente la propiedad de la red al conductor. En él, el VehicleSeat establece su Occupant al Humanoid 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 sale del asiento, la propiedad de la red del vehículo se revertirá a 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
-- Obtén 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)

Preocupaciones de seguridad

Roblox no puede verificar las calculaciones de física cuando un cliente tiene propiedad sobre un BasePart . Los clientes pueden explotar esto y enviar datos malos al servidor, como teletransportar el BasePart , haciéndole pasar a través de paredes o volar.

Además, los eventos BasePart.Touched están vinculados a la propiedad de la red, lo que significa que un cliente puede disparar Touched eventos en un BasePart que posee y enviarlo al servidor, incluso si el servidor no lo ve tocar nada. Por ejemplo, un cliente puede hacer un daño de espada a otro jugador en el mapa disparando el evento a través de inyecciones de script, por lo que es importante verificar la validez de dichos eventos disparados por clientes.

Consulte Tácticas de seguridad y mitigación de trucos para obtener tácticas de seguridad detalladas y tácticas de mitigación de trucos para las experiencias de Roblox.