Explosion

Mostrar obsoleto

*Este conteúdo é traduzido por IA (Beta) e pode conter erros. Para ver a página em inglês, clique aqui.

Uma Explosão aplica força a BaseParts dentro da explosão BlastRadius.Essa força quebra JointInstances e WeldConstraints entre partes e mata Humanoid personagens não protegidos por um ForceField .Constraints não será quebrada por uma explosão.

Se um Explosion for pai em qualquer lugar do modelo de dados enquanto a experiência estiver em execução, ele será imediatamente desativado e, dentro de alguns segundos, se tornará não pai.Não é destruído com Instance:Destroy() neste caso, então as conexões não se desconectam e o pai não é bloqueado.Como em todas as instâncias, manter uma referência forte a Explosion vai impedi-la de ser coletada em lixo.

Observe que um Explosion deve ser um descendente de Workspace para que os visuais de explosão sejam reproduzidos e os efeitos físicos/danosos tenham um impacto.

Efeitos de Explosão

Humanoids são mortos por explosões, pois a explosão quebra a junta de articulaçãodo personagem Model.Parentar um ForceField para um modelo protegerá todos os seus filhos do efeito de morte de explosão.

Se você não quiser que as articulações entre e sejam quebradas ou quiser implementar sua própria fórmula para danificar , é recomendado que você defina para 0 e use o evento para lidar com o resultado da explosão.

Explosões também podem ser configuradas para danificar Terrain , criando crateras, como configurado através da propriedade ExplosionType.

Observe que o efeito de uma explosão não é perturbado por obstáculos, significando que partes/terreno protegidas por outras partes/terreno ainda serão afetadas.

Amostras de código

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

Resumo

Propriedades

Eventos

Propriedades

BlastPressure

Ler Parallel

Usado para determinar a quantidade de força aplicada a BaseParts capturada no Explosion.BlastRadius.

Atualmente, esse nível de força aplicado não varia com base na distância de Explosion.Position .Desancorado BaseParts vai acelerar igualmente longe da origem, independentemente da distância, desde que esteja dentro do raio de explosão.

A pressão de explosão determina a aceleração das peças devido a uma explosão.Não determina o grau em que as articulações são quebradas.Quando Explosion.DestroyJointRadiusPercent é igual a 1, todas as juntas entre as peças no Explosion.BlastRadius serão destruídas, desde que a Pressão de Explosão seja maior que 0.

A pressão de explosão também não determina a quantidade de dano dada a Terrain .Fornecido BlastPressure é maior que 0 e Explosion.ExplosionType não está definido para Enum.ExplosionType.NoCraters o tamanho do crater criado é determinado exclusivamente pelo Explosion.BlastRadius .

Definir a pressão de explosão para 0 elimina o efeito da explosão e é útil quando os desenvolvedores querem programar seu próprio comportamento personalizado para explosões usando o evento Explosion.Hit.

Amostras de código

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

Ler Parallel

Essa propriedade determina o raio do Explosion , em studs. Essa propriedade aceita qualquer valor entre 0 e 100.

Este raio determina a área de efeito da Explosão, não o tamanho dos visuais da Explosão.O tamanho do efeito visual da Explosão é o mesmo, independentemente do BlastRadius (mesmo que o BlastRadius seja 0).

BaseParts dentro do Raio de Explosão será afetado pela explosão.Ou seja, se Explosion.BlastPressure for maior que 0, a força será aplicada às peças.O grau em que as articulações são quebradas dentro do BlastRadius depende de Explosion.DestroyJointRadiusPercent .Explosion.Hit disparará para qualquer a cada BasePart dentro do raio.

BaseParts são considerados dentro de Explosion.BlastRadius mesmo que estejam apenas parcialmente dentro do alcance.

Amostras de código

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

Ler Parallel

Usado para definir a proporção do Explosion.BlastRadius, entre 0 e 1, dentro da qual todas as juntas serão destruídas.Qualquer coisa fora deste alcance só terá a força Explosion aplicada a ele.

Por exemplo, se Explosion.BlastRadius for definido como 100 e DestroyJointRadiusPercent for definido como 0.5, quaisquer juntas dentro de um raio de 50 metros seriam quebradas.Quaisquer juntas entre os intervalos de 50 e 100 metros não seriam destruídas, mas a força Explosion ainda seria aplicada ao BaseParts.

Essa propriedade permite que os desenvolvedores façam Explosions 'não letal' para Humanoids ao definir DestroyJointRadiusPercent para 0.Isso significa que a articulação do pescoço não será quebrada quando os personagens entrarem em contato com o Explosion.

Amostras de código

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

Ler Parallel

Essa propriedade determina como o Explosion interagirá com o Terrain. É um valor Enum.ExplosionType e pode ser definido para uma das três opções.

  • Sem Crateras - Explosões não vão danificar o Terreno
  • Crateras - Explosões criarão crateras no Terreno
  • CratersAndDebris - Redundante, se comporta da mesma forma que Craters

Se ExplosionType for definido para criar crateras em Terrain, o raio da cratera será aproximadamente igual ao Explosion.BlastRadius.Crateras são criadas em todos os Terrain materiais que não sejam água.O tamanho do crater não é influenciado pelo material, embora alguns materiais criem bordas mais rugosas do que outros.

Amostras de código

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

Oculto
Não replicado
Ler Parallel

Position

Ler Parallel

Essa propriedade é a posição do centro do Explosion . Ela é definida no espaço mundial e não é influenciada pelo pai Explosion.

BaseParts será influenciado pelo Explosion se estiver dentro de Explosion.BlastRadius metros da posição da explosão.

O efeito de uma explosão é instantâneo.Isso significa que, embora a posição de uma explosão possa ser alterada depois de definida, ela não pode afetar duas áreas diferentes.Uma vez que uma explosão foi "detonada", pouco tempo depois de parentá-la para um descendente do Workspace, ela não o fará novamente.Em alguns casos, o efeito visual da explosão se moverá, mas não terá efeito.

Por esse motivo, deve ser criada uma nova explosão se o desenvolvedor quiser que uma explosão apareça em uma posição diferente.

Amostras de código

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

Ler Parallel

Um valor entre 0 e 1 que controla a velocidade do efeito de partículas.Em 1, ele funciona a velocidade normal, em 0.5 funciona a metade da velocidade e em 0 congela o tempo.

Visible

Ler Parallel

Essa propriedade determina se o efeito visual de um Explosion é mostrado ou não.

Quando Visível é definido como falso, a explosão ainda afetará BaseParts em seu Explosion.BlastRadius, a única diferença é que não será vista.

Um uso para esta propriedade seria para um desenvolvedor criar seus próprios efeitos de explosão personalizados usando um ParticleEmitter, enquanto mantém a funcionalidade padrão Explosion.

Amostras de código

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étodos

Eventos

Hit

Dispara quando o Explosion atinge um BasePart dentro de seu Explosion.BlastRadius . Retorna a parte atingida junto com a distância da parte de Explosion.Position .

Observe que o efeito de um Explosion não é perturbado por obstáculos, isso significa que partes protegidas atrás de outras partes ainda serão atingidas, mesmo que o BasePart que elas estão protegidas atrás esteja ancorado.

Este evento também será disparado quando Explosion.BlastPressure for igual a zero.Isso significa que os desenvolvedores podem programar seu próprio comportamento personalizado para explosões eliminando a influência da explosão em BaseParts e Terrain.

Observe que este evento disparará a cada BasePart golpe.Isso significa que pode disparar várias vezes para o mesmo personagem de jogador (como o personagem Model é composto por várias partes).Por essa razão, ao lidar com dano personalizado usando o evento Explosion.Hit, é recomendado implementar uma verificação para verificar se o personagem já foi atingido pelo Explosion.

Parâmetros

part: BasePart

O BasePart atingido pelo Explosion .

distance: number

A distância do golpe de Explosion.Position .


Amostras de código

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)