Explosion

Afficher les obsolètes

*Ce contenu est traduit en utilisant l'IA (Beta) et peut contenir des erreurs. Pour consulter cette page en anglais, clique ici.

Une explosion applique une force à BaseParts à l'intérieur de l'explosion BlastRadius .Cette force brise JointInstances et WeldConstraints entre les parties et tue Humanoid des caractères non protégés par un ForceField .Constraints ne sera pas brisé par une explosion.

Si un Explosion est parentisé n'importe où dans le modèle de données pendant que l'expérience est en cours d'exécution, il se déclenche immédiatement et, dans quelques secondes, il devient non parenté.Il n'est pas détruit avec Instance:Destroy() dans ce cas, donc les connexions ne se déconnectent pas et le parent n'est pas verrouillé.Comme pour toutes les instances, garder une référence forte à Explosion empêchera sa collecte en tant que déchet.

Notez qu'un Explosion doit être un descendant de Workspace pour que les visualisations d'explosion jouent et que les effets physiques/dommage aient un impact.

Effets d'explosion

Humanoids sont tués par des explosions, car l'explosion brise le articulationde cou du personnage Model.L'éducation d'un ForceField à un modèle protégera tous ses enfants de l'effet de mort par explosion.

Si vous ne voulez pas que les jointures entre BaseParts soient rompues ou si vous voulez implémenter votre propre formule pour endommager Humanoids, il est recommandé de définir DestroyJointRadiusPercent à 0 et d'utiliser l'événement Hit pour gérer le résultat de l'explosion.

Les explosions peuvent également être configurées pour endommager Terrain , créer des cratères, comme configuré par la propriété ExplosionType.

Notez que l'effet d'une explosion n'est pas perturbé par des obstacles, ce qui signifie que les parties/terrains protégés derrière d'autres parties/terrains seront toujours affectés.

Échantillons de code

This code sample includes a brief snippet that creates a large explosion in the game at 0, 10, 0.

Explosion Instantiation

local explosion = Instance.new("Explosion")
explosion.BlastRadius = 60
explosion.ExplosionType = Enum.ExplosionType.Craters -- damages terrain
explosion.Position = Vector3.new(0, 10, 0)
explosion.Parent = workspace

Résumé

Propriétés

Évènements

Propriétés

BlastPressure

Lecture parallèle

Utilisé pour déterminer la quantité de force appliquée à BaseParts capturée dans le Explosion.BlastRadius.

Actuellement, ce niveau de force appliqué ne varie pas en fonction de la distance de Explosion.Position .Unanchored BaseParts accélérera de manière égale à partir de l'origine indépendamment de la distance fournie qu'ils se trouvent dans le rayon d'explosion.

La pression d'explosion détermine l'accélération des parties dues à une explosion.Il ne détermine pas le degré auquel les jointures sont cassées.Lorsque Explosion.DestroyJointRadiusPercent est égal à 1, tous les joints entre les parties dans le Explosion.BlastRadius seront détruits à condition que la pression d'explosion soit supérieure à 0.

La pression d'explosion ne détermine pas non plus la quantité de dommages infligés à Terrain .Si la pression d'explosion fournie est supérieure à 0 et que Explosion.ExplosionType n'est pas défini sur Enum.ExplosionType.NoCraters la taille du cratère créé est déterminée exclusivement par le Explosion.BlastRadius.

Le réglage de la pression d'explosion à 0 élimine l'effet de l'explosion et est utile lorsque les développeurs veulent programmer leur propre comportement personnalisé pour les explosions en utilisant l'événement Explosion.Hit.

Échantillons de code

This sample contains a simple function that creates a custom explosion. The custom explosion will not break joints as Explosion.DestroyJointRadiusPercent is equal to 0. This means Humanoids will not be instantly killed as their neck joints are broken. In this example explosion.BlastPressure is equal to zero so as not to apply force or damage terrain but this can be changed.

The Explosion.Hit event is used to listen for contact. Once contact has been made the code will look for the parent model of the BasePart hit by the explosion. If that model exists, hasn't already been damaged and has a Humanoid in it damage will be applied based on distance from the explosion's origin.

Custom Explosion

local function customExplosion(position, radius, maxDamage)
local explosion = Instance.new("Explosion")
explosion.BlastPressure = 0 -- this could be set higher to still apply velocity to parts
explosion.DestroyJointRadiusPercent = 0 -- joints are safe
explosion.BlastRadius = radius
explosion.Position = position
-- set up a table to track the models hit
local modelsHit = {}
-- listen for contact
explosion.Hit:Connect(function(part, distance)
local parentModel = part.Parent
if parentModel then
-- check to see if this model has already been hit
if modelsHit[parentModel] then
return
end
-- log this model as hit
modelsHit[parentModel] = true
-- look for a humanoid
local humanoid = parentModel:FindFirstChild("Humanoid")
if humanoid then
local distanceFactor = distance / explosion.BlastRadius -- get the distance as a value between 0 and 1
distanceFactor = 1 - distanceFactor -- flip the amount, so that lower == closer == more damage
humanoid:TakeDamage(maxDamage * distanceFactor) -- TakeDamage to respect ForceFields
end
end
end)
explosion.Parent = game.Workspace
-- Roblox removes explosions after a few seconds, but does not destroy them.
-- To ensure our .Hit connection gets disconnected, destroy the explosion once it's removed.
explosion.AncestryChanged:Connect(function()
if not explosion.Parent then
explosion:Destroy()
end
end)
end
customExplosion(Vector3.new(0, 10, 0), 12, 50)

BlastRadius

Lecture parallèle

Cette propriété détermine le rayon du Explosion , en studs. Cette propriété accepte toute valeur entre 0 et 100.

Ce rayon détermine la zone d'effet de l'explosion, pas la taille des visuels d'explosion.La taille de l'effet visuel de l'explosion est la même indépendamment de BlastRadius (même si BlastRadius est 0).

BaseParts dans le rayon d'explosion sera affecté par l'explosion.C'est-à-dire, si Explosion.BlastPressure est supérieur à 0, la force sera appliquée aux parties.Le degré dans lequel les jointures sont brisées dans le rayon d'explosion dépend de Explosion.DestroyJointRadiusPercent .Explosion.Hit lancera pour tout chaque BasePart dans le rayon.

BaseParts sont considérés dans Explosion.BlastRadius même s'ils ne sont qu'en partie à portée.

Échantillons de code

This code sample includes a brief snippet that creates a large explosion in the game at 0, 10, 0.

Explosion Instantiation

local explosion = Instance.new("Explosion")
explosion.BlastRadius = 60
explosion.ExplosionType = Enum.ExplosionType.Craters -- damages terrain
explosion.Position = Vector3.new(0, 10, 0)
explosion.Parent = workspace

DestroyJointRadiusPercent

Lecture parallèle

Utilisé pour définir la proportion du Explosion.BlastRadius, entre 0 et 1, dans laquelle toutes les jonctions seront détruites.Tout ce qui est en dehors de cette plage n'aura que la force Explosion appliquée à lui.

Par exemple, si Explosion.BlastRadius est réglé sur 100 et que DestroyJointRadiusPercent est réglé sur 0,5, tous les joints dans un rayon de 50 studs seraient cassés.Toutes les jonctions entre les gammes de 50 et 100 studs ne seraient pas détruites, mais la force Explosion serait toujours appliquée à la BaseParts.

Cette propriété permet aux développeurs de rendre Explosions 'non létal' à Humanoids en définissant DestroyJointRadiusPercent à 0.Cela signifie que la jointure du cou ne sera pas cassée lorsque les personnages entreront en contact avec le Explosion.

Échantillons de code

This sample includes an example of how Explosions can be made non lethal to player characters.

Non lethal explosions

local function onDescendantAdded(instance)
if instance:IsA("Explosion") then
local explosion = instance
explosion.DestroyJointRadiusPercent = 0
local destroyJointRadiusPercent = 1
explosion.Hit:Connect(function(part, distance)
-- check the part is in range to break joints
if distance <= destroyJointRadiusPercent * explosion.BlastRadius then
-- make sure the part does not belong to a character
if not game.Players:GetPlayerFromCharacter(part.Parent) then
part:BreakJoints()
end
end
end)
end
end
workspace.DescendantAdded:Connect(onDescendantAdded)

This sample contains a simple function that creates a custom explosion. The custom explosion will not break joints as Explosion.DestroyJointRadiusPercent is equal to 0. This means Humanoids will not be instantly killed as their neck joints are broken. In this example explosion.BlastPressure is equal to zero so as not to apply force or damage terrain but this can be changed.

The Explosion.Hit event is used to listen for contact. Once contact has been made the code will look for the parent model of the BasePart hit by the explosion. If that model exists, hasn't already been damaged and has a Humanoid in it damage will be applied based on distance from the explosion's origin.

Custom Explosion

local function customExplosion(position, radius, maxDamage)
local explosion = Instance.new("Explosion")
explosion.BlastPressure = 0 -- this could be set higher to still apply velocity to parts
explosion.DestroyJointRadiusPercent = 0 -- joints are safe
explosion.BlastRadius = radius
explosion.Position = position
-- set up a table to track the models hit
local modelsHit = {}
-- listen for contact
explosion.Hit:Connect(function(part, distance)
local parentModel = part.Parent
if parentModel then
-- check to see if this model has already been hit
if modelsHit[parentModel] then
return
end
-- log this model as hit
modelsHit[parentModel] = true
-- look for a humanoid
local humanoid = parentModel:FindFirstChild("Humanoid")
if humanoid then
local distanceFactor = distance / explosion.BlastRadius -- get the distance as a value between 0 and 1
distanceFactor = 1 - distanceFactor -- flip the amount, so that lower == closer == more damage
humanoid:TakeDamage(maxDamage * distanceFactor) -- TakeDamage to respect ForceFields
end
end
end)
explosion.Parent = game.Workspace
-- Roblox removes explosions after a few seconds, but does not destroy them.
-- To ensure our .Hit connection gets disconnected, destroy the explosion once it's removed.
explosion.AncestryChanged:Connect(function()
if not explosion.Parent then
explosion:Destroy()
end
end)
end
customExplosion(Vector3.new(0, 10, 0), 12, 50)

ExplosionType

Lecture parallèle

Cette propriété détermine comment le Explosion interagira avec le Terrain. Il s'agit d'une valeur Enum.ExplosionType et peut être définie sur l'une des trois options.

  • Pas de cratères - Les explosions ne feront pas de dégâts au terrain
  • Cratères - Les explosions créeront des cratères sur le terrain
  • CratersAndDebris - Redondant, se comporte de la même manière que les cratères

Si ExplosionType est réglé pour créer des cratères dans Terrain, le rayon du cratère sera environ égal au Explosion.BlastRadius.Les cratères sont créés dans tous les matériaux Terrain autres que l'eau.La taille du cratère n'est pas influencée par le matériau, bien que certains matériaux créent des bords plus rugueux que d'autres.

Échantillons de code

This code sample includes an example of how the Explosion.ExplosionType property can be used to stop Explosions from damaging terrain. It is recommended to set the ExplosionType to NoCraters at the point of Explosion instantiation, but if that is not practical the code below will work.

Stop Explosions from Damaging Terrain

local function onDescendantAdded(instance)
if instance:IsA("Explosion") then
instance.ExplosionType = Enum.ExplosionType.NoCraters
instance:GetPropertyChangedSignal("ExplosionType"):Connect(function()
instance.ExplosionType = Enum.ExplosionType.NoCraters
end)
end
end
workspace.DescendantAdded:Connect(onDescendantAdded)

LocalTransparencyModifier

Caché
Non répliqué
Lecture parallèle

Position

Lecture parallèle

Cette propriété est la position du centre du Explosion . Elle est définie dans l'espace mondial et n'est pas influencée par le parent Explosion .

BaseParts sera influencé par le Explosion s'il se trouve à moins de Explosion.BlastRadius studs de la position de l'explosion.

L'effet d'une explosion est instantané.Cela signifie que bien que la position d'une explosion puisse être modifiée après qu'elle ait été définie, elle ne peut pas affecter deux zones différentes.Une fois qu'une explosion a été « détonée », peu après l'avoir parenté à un descendant du Workspace, elle ne le fera plus.Dans certains cas, l'effet visuel de l'explosion se déplacera mais il n'aura aucun effet.

Pour cette raison, une nouvelle explosion doit être créée si le développeur souhaite que l'explosion apparaisse à une position différente.

Échantillons de code

This code sample includes a brief snippet that creates a large explosion in the game at 0, 10, 0.

Explosion Instantiation

local explosion = Instance.new("Explosion")
explosion.BlastRadius = 60
explosion.ExplosionType = Enum.ExplosionType.Craters -- damages terrain
explosion.Position = Vector3.new(0, 10, 0)
explosion.Parent = workspace

TimeScale

Lecture parallèle

Une valeur entre 0 et 1 qui contrôle la vitesse de l'effet de particule.À 1, il fonctionne à une vitesse normale, à 0,5 il fonctionne à moitié vitesse, et à 0, il gèle le temps.

Visible

Lecture parallèle

Cette propriété détermine si l'effet visuel d'un Explosion est affiché ou non.

Lorsque Visible est réglé sur false, l'explosion affectera toujours BaseParts dans son Explosion.BlastRadius, la seule différence est qu'elle ne sera pas vue.

Une utilisation pour cette propriété serait pour un développeur de créer ses propres effets d'explosion personnalisés en utilisant un ParticleEmitter , tout en conservant la fonctionnalité par défaut Explosion .

Échantillons de code

This sample includes a function that will create an Explosion but replace the default Explosion visuals but those of a ParticleEmitter.

Explosion Custom Visuals

local function customExplosion(position)
local explosion = Instance.new("Explosion")
explosion.Position = position
explosion.Visible = false
local attachment = Instance.new("Attachment")
attachment.Position = position
attachment.Parent = workspace.Terrain
local particleEmitter = Instance.new("ParticleEmitter")
particleEmitter.Enabled = false
particleEmitter.Parent = attachment
particleEmitter.Speed = NumberRange.new(5, 30)
particleEmitter.SpreadAngle = Vector2.new(-90, 90)
explosion.Parent = workspace
particleEmitter:Emit(20)
task.delay(5, function()
if attachment then
attachment:Destroy()
end
end)
end
customExplosion(Vector3.new(0, 10, 0))

Méthodes

Évènements

Hit

S'enflamme lorsque le Explosion frappe un BasePart à l'intérieur de son Explosion.BlastRadius . Retourne la partie frappée avec la distance de la partie de Explosion.Position .

Notez que l'effet d'un Explosion n'est pas perturbé par des obstacles, ce qui signifie que les parties protégées derrière d'autres parties seront toujours touchées, même si la BasePart qu'elles sont protégées derrière est ancrée.

Cet événement se déclenchera également lorsque Explosion.BlastPressure est égal à zéro.Cela signifie que les développeurs peuvent programmer leur propre comportement personnalisé pour les explosions en éliminant l'influence de l'explosion sur BaseParts et Terrain.

Notez que cet événement se déclenchera pour chaque BasePart coup.Cela signifie qu'il peut tirer plusieurs fois pour le même personnage de joueur (comme le personnage Model est composé de plusieurs parties).Pour cette raison, lors du traitement des dommages personnalisés en utilisant l'événement Explosion.Hit, il est recommandé d'implémenter un contrôle pour voir si le personnage a déjà été frappé par le Explosion.

Paramètres

part: BasePart

Le BasePart frappé par le Explosion.

distance: number

La distance du coup à partir de Explosion.Position .


Échantillons de code

This sample contains a simple function that creates a custom explosion. The custom explosion will not break joints as Explosion.DestroyJointRadiusPercent is equal to 0. This means Humanoids will not be instantly killed as their neck joints are broken. In this example explosion.BlastPressure is equal to zero so as not to apply force or damage terrain but this can be changed.

The Explosion.Hit event is used to listen for contact. Once contact has been made the code will look for the parent model of the BasePart hit by the explosion. If that model exists, hasn't already been damaged and has a Humanoid in it damage will be applied based on distance from the explosion's origin.

Custom Explosion

local function customExplosion(position, radius, maxDamage)
local explosion = Instance.new("Explosion")
explosion.BlastPressure = 0 -- this could be set higher to still apply velocity to parts
explosion.DestroyJointRadiusPercent = 0 -- joints are safe
explosion.BlastRadius = radius
explosion.Position = position
-- set up a table to track the models hit
local modelsHit = {}
-- listen for contact
explosion.Hit:Connect(function(part, distance)
local parentModel = part.Parent
if parentModel then
-- check to see if this model has already been hit
if modelsHit[parentModel] then
return
end
-- log this model as hit
modelsHit[parentModel] = true
-- look for a humanoid
local humanoid = parentModel:FindFirstChild("Humanoid")
if humanoid then
local distanceFactor = distance / explosion.BlastRadius -- get the distance as a value between 0 and 1
distanceFactor = 1 - distanceFactor -- flip the amount, so that lower == closer == more damage
humanoid:TakeDamage(maxDamage * distanceFactor) -- TakeDamage to respect ForceFields
end
end
end)
explosion.Parent = game.Workspace
-- Roblox removes explosions after a few seconds, but does not destroy them.
-- To ensure our .Hit connection gets disconnected, destroy the explosion once it's removed.
explosion.AncestryChanged:Connect(function()
if not explosion.Parent then
explosion:Destroy()
end
end)
end
customExplosion(Vector3.new(0, 10, 0), 12, 50)