Une collision se produit lorsque deux objets 3D entrent en contact dans le monde 3D. Pour la gestion de collision personnalisée, BasePart a un ensemble de événements de collision et filtrage de collision techniques, afin que vous puissiez contrôler lesquels les assemblages physiques s'entendent avec d'autres.
Événements de collision
Les événements de collision se produisent lorsque deux Class.BasePart|BaseParts touchent ou arrêtent de toucher dans le monde 3D. Vous pouvez détecter ces collisions via les BaseParts et Class.BasePart.Touch
- La propriété CanTouch d'une partie détermine si elle déclenche des événements de collision. Si elle est réglée sur false, ni Class.BasePart.Touched|Touched ni 1> Class.BasePart.TouchEnded|TouchEnded ne s'lancer.
- La propriété CanCollide d'une partie affecte si elle va physiquement coller avec d'autres parties et causer des forces à agir sur elles. Même si CanCollide est désactivé pour
- Les événements Touched et TouchEnded ne se déclenchent que comme résultat d'un mouvement physique, non pas à partir d'une Class.BasePart.Position|Position ou d'un changement 1> Class.Base
- La classe de niveau supérieur Terrain hérite de BasePart, vous pouvez donc attribuer un groupe de collision à 1> Class.Terrain pour déterminer si d'autres 4> Class.BasePart|BaseParts4> collent avec 7>Terrain7> voxels.
Touché
L'événement Touched se déclenche lorsqu'un BasePart entre en contact avec un autre, ou avec un terrain voxel. Il ne s'enflamme
Le code suivant montre comment l'événement Touched peut être connecté à une fonction personnalisée onTouched(). Notez que l'événement envoie l'argument otherPart à la fonction, ce qui indique que l'autre partie impliquée dans la collision.
Collision de parties
local part = workspace.Part
local function onTouched(otherPart)
print(part.Name .. " collided with " .. otherPart.Name)
end
part.Touched:Connect(onTouched)
Notez que l'événement Touched peut se déclencher plusieurs fois rapidement en succession basée sur des collisions physiques subtiles, telles que lorsqu'un objet en mouvement "s'est posé" dans une position de repos ou lorsqu'une collision implique un modèle de 多重模型
Collision de partie avec un temps de recharge
local part = workspace.Part
local COOLDOWN_TIME = 1
local function onTouched(otherPart)
if not part:GetAttribute("Touched") then
print(part.Name .. " collided with " .. otherPart.Name)
part:SetAttribute("Touched", true) -- Définir l'attribut à vrai
task.wait(COOLDOWN_TIME) -- Attendez la durée de recharge
part:SetAttribute("Touched", false) -- Réinitialiser l'attribut
end
end
part.Touched:Connect(onTouched)
Touché terminé
L'événement TouchEnded déclenche lorsque l'ensemble des limites de collision d'un BasePart sort des limites d'
Le code suivant montre comment l'événement TouchEnded peut être connecté à une fonction personnalisée onTouchEnded(). Comme Touched, l'événement envoie l'argument 1> otherPart1> à la fonction, ce qui indique la partie touchée.
Détection de non-collision
local part = workspace.Part
local function onTouchEnded(otherPart)
print(part.Name .. " is no longer touching " .. otherPart.Name)
end
part.TouchEnded:Connect(onTouchEnded)
Filtre de collision
Le filtrage de collision définit les parties physiques qui entrent en collision avec d'autres. Vous pouvez configurer le filtrage pour de nombreux objets via groupes de collision ou vous pouvez contrôler les collisions sur une base partie à part avec instances Class.NoCollisionConstraint.
Groupes de collision
Les groupes de collision vous permettent d'assigner Class.BasePart|BaseParts à des groupes dédiés et de spécifier si oui ou non ils collent avec ceux dans d'autres groupes. Les parties dans les groupes non collisionnent passer l'une par l'autre complètement, même si les deux parties ont leur propriété BaseParts définie sur CanCollide.
Vous pouvez facilement configurer des groupes de collision via le éditeur de groupes de collision, accessible en cliquant sur le bouton Collision de groupes dans l'onglet modèle.
L'éditeur fonctionne dans either affichage de liste qui préfère doking au côté gauche ou droit de Studio, ou dans une plus grande affichage de table qui préfère doking au sommet ou en bas.
Enregistrement des groupes
L'éditeur inclut un groupe de collision par défaut qui ne peut pas être renommé ou supprimé. Tous les Class.BasePart|BaseParts appartiennent automatiquement à ce groupe par défaut s'ils ne sont pas affectés à un autre groupe, ce qui signifie qu'ils s'effaceront avec tous les autres objets dans le BaseParts groupe.
Pour créer un nouveau groupe de collision :
Cliquez sur le bouton Ajouter un groupe en haut du panneau de l'éditeur, entrez un nouveau nom de groupe, et appuyez sur Entrer. Le nouveau groupe apparaît dans les deux colonnes de la liste de voir, ou dans la colonne de gauche et de la rangée supérieure de la table de voir.
Répétez le processus si nécessaire, en choisissant un nom unique et descriptif pour chaque groupe. Remarquez que vous pouvez modifier le nom d'un groupe pendant le développement en cliquant dans son champ, ou en sélectionnant et en cliquant sur le bouton renommer .
Configuration des collisions de groupe
Par défaut, les objets de tous les groupes entrent en collision avec les uns des autres. Pour empêcher les objets d'un groupe de se chevaucher avec les objets d'un autre groupe, désélectionnez la case dans la rangée/ colonne respective.
Dans l'exemple suivant, les objets dans le groupe Cubes ne pas se heurter aux objets dans le groupes portes .
Attribution d'objets aux groupes
Pour attribuer des objets aux groupes que vous avez enregistrés à l'aide de l'éditeur Studio :
Sélectionnez un ou plus BaseParts qui peuvent être qualifiés comme faisant partie d'un groupe de collision.
Attribuez-les au groupe en cliquant sur le bouton ⊕ pour sa rangée. Les objets peuvent appartenir à un seul groupe de collision à la fois, donc les placer dans un nouveau groupe les supprime de leur groupe actuel.
Une fois attribué, le nouveau groupe est reflété sous la propriété CollisionGroup de l'objet.
Groupe de collision sélectionnable Studio
Les outils dans Studio utilisent le système de filtrage de collision pour déterminer les objets qui sont des candidats à la sélection lorsque vous cliquez dans la fenêtre de jeu3D. Les objets dont le groupe de collision attribué ne fait pas pas collider avec StudioSelectable seront ignorés.
Par exemple, si vous avez des points de contrôle dans une expérience de course dont les zones efficaces sont définies par de grandes parties transparentes, vous pouvez les attribuer à un groupe de collision Checkpoints et ensuite les rendre non collisionnables avec StudioSelectable afin qu'ils ne se gagnent pas en chemin lorsque vous éditez la géométrie de base.
Pour le code des plugins, il est recommandé de attribuer StudioSelectable comme filtre de groupe de collision de votre Datatype.RaycastParams lorsque vous trouvez des parties sous le curseur. Cela permet à vos plugins de correspondre aux mécanismes de sélection que les créateurs ont appris à attendre des outils Studio intégrés.
Recommandé choix de plugin Raycast
local UserInputService = game:GetService("UserInputService")local raycastParams = RaycastParams.new()raycastParams.CollisionGroup = "StudioSelectable" -- Pour suivre la conventionraycastParams.BruteForceAllSlow = true -- Pour que les parties avec CanQuery de « faux » puissent être sélectionnéeslocal mouseLocation = UserInputService:GetMouseLocation()local mouseRay = workspace.CurrentCamera:ViewportPointToRay(mouseLocation.X, mouseLocation.Y)local filteredSelectionHit = workspace:Raycast(mouseRay.Origin, mouseRay.Direction * 10000, raycastParams)
Filtre de pièce à pièce
Pour éviter les collisions entre deux parties spécifiques sans configurer Groupes de collision, tels que entre la roue d'un véhicule et son châssis, considérez la contrainte Pas de collision. Les avantages incluent :
- Les groupes de collision et/ou les scripts de configuration ne sont pas requis, vous pouvez donc facilement créer et partager des modèles avec des filtres de collision personnalisés.
- Les parties connectées ne s'entreront pas en collision, mais elles peuvent toujours se coller avec d'autres objets.
Désactivation des collisions de personnages
Les personnages de joueur Roblox entrent en collision par défaut. Cela peut entraîner une expérience de partieintéressante mais non prévue, telle que des personnages sautant l'un sur l'autre pour atteindre des zones spécifiques. Si ce comportement est indésirable, vous pouvez le prévenir en suivant le Script dans ServerScriptService.
Script - Désactiver les collisions de personnages
local PhysicsService = game:GetService("PhysicsService")
local Players = game:GetService("Players")
PhysicsService:RegisterCollisionGroup("Characters")
PhysicsService:CollisionGroupSetCollidable("Characters", "Characters", false)
local function onDescendantAdded(descendant)
-- Définir un groupe de collision pour n'importe quelle partie descendant
if descendant:IsA("BasePart") then
descendant.CollisionGroup = "Characters"
end
end
local function onCharacterAdded(character)
-- Traiter les descendants existants et nouveaux pour le paramètre physique
for _, descendant in character:GetDescendants() do
onDescendantAdded(descendant)
end
character.DescendantAdded:Connect(onDescendantAdded)
end
Players.PlayerAdded:Connect(function(player)
-- Détectez quand le personnage du joueur est ajouté
player.CharacterAdded:Connect(onCharacterAdded)
end)
Collisions de modèles
Model objets sont des conteneurs pour les parties plutôt que d'hériter de BasePart , soient donc incapables de se connecter directement à BasePart.Touched
L'exemple de code suivant connecte tous les BaseParts d'un modèle multi-partie à des événements de collision et suit le nombre total de collisions avec d'autres parties.
Collision de modèle
local model = script.Parent
local numTouchingParts = 0
local function onTouched(otherPart)
-- Ignorer les instances du modèle se rejoignant à lui-même
if otherPart:IsDescendantOf(model) then return end
-- Augmenter le nombre de parties de modèle touchées
numTouchingParts += 1
print(model.Name, "intersected with", otherPart.Name, "| Model parts touching:", numTouchingParts)
end
local function onTouchEnded(otherPart)
-- Ignorer les instances du modèle se déployant pas avec lui
if otherPart:IsDescendantOf(model) then return end
-- Réduisez le nombre de parties de modèle touchées
numTouchingParts -= 1
print(model.Name, "un-intersected from", otherPart.Name, "| Model parts touching:", numTouchingParts)
end
for _, child in model:GetChildren() do
if child:IsA("BasePart") then
child.Touched:Connect(onTouched)
child.TouchEnded:Connect(onTouchEnded)
end
end
Collisions de modèles maillés et solides
MeshPart and PartOperation (les parties jointes par modélisation solide ) sont des sous-Classes de 0> Class.BasePart</
La propriété CollisionFidelity a les options suivantes, dans l'ordre de la fidélité et de l'impact des collisions du plus bas au plus haut :
- Boîte de collision de zone de boîte de — Crée une boîte de modélisationde collision de zone, idéale pour les objets de taille ou non interactifs.
- Coque — Génère une coque convexe, idéale pour les objets avec moins d'indentations ou de cavités prononcées.
- Par défaut — Produit une forme de collision approximée qui prend en charge la concavité, adaptée aux objets complexes avec des besoins d'interaction semi-détails.
- PreciseConvexDecomposition — Offre la plus grande fidélité mais n'est toujours pas une représentation 1 : 1 du visuel. Cette option a le coût de performance le plus élevé et prend plus de temps pour que le moteur puisse calculer.
Pour plus d'informations sur l'impact de la fidélité de la collision et comment les mitiger, voir optimisation des performances. Pour une expérience de marche en détail sur la façon de choisir une option de fidélité de collision qui équilibre vos besoins de précision et vos exigences de performance, voir ici.