Para soportar mecanismos físicos complejos mientras se busca una experiencia suave y reactiva para los jugadores, el motor de física de Roblox 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 físicamente simulada a un cliente o servidor para dividir el trabajo de la calculación de física.
Los clientes experimentan más interacciones de física reactivas con partes que en posesión, ya que no hay demora en 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 los clientes individuales, permitiendo que el servidor priorice otras tareas.
Propiedad de BasePart
Por defecto, el servidor mantiene la propiedad de cualquier BasePart .Además, el servidor siempre posee anclado BaseParts y no puedes cambiar manualmente su propiedad.
Basado en la capacidad de hardware de un cliente y la proximidad del jugador a una parte sin anclar , el motor asigna automáticamente la propiedad de esa parte al cliente.Por lo tanto, las partes cerca del personaje de un jugador es más probable que se conviertan en propiedad del jugador.
Propiedad de montaje
Si un mecanismo basado en físicas no tiene partes ancladas, establecer la propiedad en una ensambladora dentro de ese mecanismo establece la misma propiedad para cada ensamblaje en el mecanismo.
Si anclas una solitaria asamblea que no es parte de un mecanismo más amplio, su propiedad va al servidor, ya que el servidor siempre posee anclado BaseParts .Al desanclar la misma asamblea, se pierde su estado de propiedad anterior y se revertirá al manejo automático por parte del motor.
Si anclas una asamblea dentro de un mecanismo más amplio de asambleas, su propiedad va al servidor, pero la propiedad de las otras asambleas se mantiene sin cambios.Desanclar la misma asamblea revertirá su propiedad previamente establecida.
Establecer la 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().
Considera un vehículo que tiene un objeto VehicleSeat para el conductor y un objeto Seat para un pasajero, ambos incluidos en la montura 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 entraron primero.El conductor tendrá que esperar varios ciclos de red antes de que se reconozca su entrada y el vehículo se sentirá menos reactivo.
Los siguientes Script correcciones arreglan esto asignando manualmente la propiedad de la red al conductor.En él, el establece su en el que se sienta, por lo que el script escucha el evento del asiento de para capturar cuando un jugador se sienta en el asiento.Cuando el conductor abandona el asiento, la propiedad de 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
-- Obtener al jugador del personaje
local player = Players:GetPlayerFromCharacter(humanoid.Parent)
if player then
vehicleSeat:SetNetworkOwner(player)
end
else
-- Reiniciar la propiedad cuando el asiento está desocupado
vehicleSeat:SetNetworkOwnershipAuto()
end
end
end)
Visualizar la propiedad
Para ayudar con la depuración de propiedad de la red, Studio puede renderizar contornos coloreados alrededor de los objetos durante las pruebas de 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 amortiguación" donde tu cliente la está simulando, pero aún pertenece a algo más.Tu cliente podría obtener la propiedad después de esto, o puede rechazarlo. | |
(blanco/gris) | El servidor o otro cliente posee la parte a través de la propiedad de red automática o de una asignación explícita a través de part:SetNetworkOwner(). |
Para habilitar la visualización de propiedad de red:
Haga clic en el botón opciones de visualización en la esquina superior derecha del ventanilla3D.
En el menú desplegable, activa propietarios de red .
Preocupaciones de seguridad
Roblox no puede verificar las calculaciones de física cuando un cliente tiene la propiedad sobre un BasePart .Los clientes pueden aprovechar esto y enviar datos malos al servidor, como teletransportar el BasePart , haciéndolo pasar por 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 eventos Touched en una BasePart que posee y enviarlos al servidor, incluso si el servidor no los ve tocar nada.Por ejemplo, un cliente puede hacer daño de espada a otro jugador en el mapa disparando el evento a través de inyecciones de scripts, por lo que es importante verificar la validez de tales eventos disparados por los clientes.
Vea Tácticas de seguridad y mitigación de trampas para tácticas de seguridad detalladas y tácticas de mitigación de trampas para experiencias de Roblox.