Afin de prendre en charge des mécanismes physiques complexes tout en visant une expérience fluide et réactive pour les joueurs, le moteur de physique Roblox utilise un système de physique distribuée dans lequel les calculs sont distribués entre le serveur et tous les clients connectés.Dans ce système, le moteur attribue la propriété réseau de réplication physique à un client ou un serveur pour diviser le travail de calcul de la physique.
Les clients expérimentent plus d'interactions physiques réactives avec des parties qu'ils posséder, puisqu'il n'y a pas de latence de la communication avec le serveur.La propriété réseau améliore également les performances du serveur car les calculs de physique peuvent être répartis entre les clients individuels, ce qui permet au serveur de prioriser d'autres tâches.
Propriété de BasePart
Par défaut, le serveur conserve la propriété de tout BasePart .De plus, le serveur possède toujours un ancrage BaseParts et vous ne pouvez pas modifier manuellement leur propriété.
Sur la base de la capacité matérielle d'un client et de la proximité du joueur avec une partie non ancrée , le moteur attribue automatiquement la propriété de cette partie au client.Ainsi, les parties proches du personnage d'un joueur sont plus susceptibles de devenir la propriété du joueur.
Propriété d'assemblage
Si un mécanisme basé sur la physique n'a pas de parties ancrées, définir la propriété sur une assemblage dans ce mécanisme définit la même propriété pour chaque assemblage dans le mécanisme.
Si vous ancrez une assemblage solitaire qui n'est pas une partie d'un mécanisme plus large, sa propriété va au serveur, puisque le serveur possède toujours une assemblage ancrée BaseParts .Lors du déancrage de la même assemblage, son état de propriété précédent est perdu et il revient à la manipulation automatique par le moteur.
Si vous ancrez une assemblage dans un mécanisme plus large d'assemblages, sa propriété va au serveur, mais la propriété des autres assemblages reste inchangée.Déancrer la même assemblage révertit sa propriété précédemment définie.
Définir la propriété
Dans les expériences avec des interactions de physique complexes ou dans les cas où vous devez attribuer un contrôle direct, vous pouvez définir la propriété via un appel côté serveur à BasePart:SetNetworkOwner().
Considérez un véhicule qui a un objet VehicleSeat pour le conducteur et un objet Seat pour un passager, tous deux inclus dans l'assemblage du véhicule.Avec les règles de propriété par défaut, si un personnage de joueur se trouve dans le Seat (passager) puis qu'un autre joueur saute dans le VehicleSeat (conducteur), le passager gagne la propriété physique de l'ensemble du véhicule parce qu'il est entré en premier.Le conducteur devra attendre plusieurs cycles réseau avant que son entrée soit reconnue et que le véhicule se sente moins réactif.
Les corrections suivantes Script corrigent cela en attribuant manuellement la propriété réseau au pilote.Dans ce, le VehicleSeat définit son Occupant sur le Humanoid qui y est assis, de sorte que le script écoute l'événement du siège Changed pour capturer lorsqu'un joueur s'assied sur le siège.Lorsque le conducteur quitte le siège, la propriété du réseau du véhicule est rétablie automatiquement avec 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
-- Obtenir le joueur du personnage
local player = Players:GetPlayerFromCharacter(humanoid.Parent)
if player then
vehicleSeat:SetNetworkOwner(player)
end
else
-- Réinitialiser la propriété lorsque le siège est inoccupé
vehicleSeat:SetNetworkOwnershipAuto()
end
end
end)
Visualisation de la propriété
Pour aider au débogage de la propriété réseau, Studio peut rendre des contours colorés autour des objets lors du test de jeu.
Couleur de contour | Avertissement | |
---|---|---|
(vert) | Votre client possède la partie et la simule. | |
(rouge) | La partie se trouve dans une "zone tampon" où votre client la simule, mais elle appartient toujours à autre chose.Votre client peut obtenir la propriété après cela, ou il peut le rejeter. | |
(blanc/gris) | Le serveur ou un autre client possède la partie par le biais de la propriété réseau automatique ou par une désignation explicite à travers part:SetNetworkOwner() . |
Pour activer la visualisation de la propriété réseau :
Cliquez sur le bouton options de visualisation dans le coin supérieur droit de la fenêtre de jeu3D.
Dans le menu déroulant, activez propriétaires de réseau .
Préoccupations de sécurité
Roblox ne peut pas vérifier les calculs de physique lorsqu'un client a la propriété sur un BasePart.Les clients peuvent en profiter et envoyer des données incorrectes au serveur, comme téléporter le BasePart , le faire passer à travers les murs ou voler.
En outre, les événements BasePart.Touched sont liés à la propriété du réseau, ce qui signifie qu'un client peut déclencher des événements Touched sur un BasePart qu'il possède et l'envoyer au serveur, même si le serveur ne le touche rien.Par exemple, un client peut faire des dégâts d'épée à un autre joueur sur la carte en tirant l'événement via des injections de script, il est donc important de vérifier la validité de ces événements tirés par les clients.
Voir tactiques de sécurité et de mitigation de tricherie pour des tactiques de sécurité détaillées et des tactiques de mitigation des tricheries pour les expériences Roblox.