Explosion

Visualizza obsoleti

*Questo contenuto è tradotto usando AI (Beta) e potrebbe contenere errori. Per visualizzare questa pagina in inglese, clicca qui.

Un'esplosione applica la forza a BaseParts all'interno dell'esplosione di BlastRadius .Questa forza rompe JointInstances e WeldConstraints tra le parti e uccide Humanoid i personaggi non protetti da un ForceField .Constraints non verrà rotto da un'esplosione.

Se un Explosion è parented ovunque nel modello di dati mentre l'esperienza è in esecuzione, si attiva immediatamente e, entro pochi secondi, diventa non parented.Non viene distrutto con Instance:Destroy() in questo caso, quindi le connessioni non si disconnettono e il padre non viene bloccato.Come per tutte le istanze, mantenere un riferimento forte a Explosion impedirà che venga raccolto in garbage.

Nota che un Explosion deve essere un discendente di Workspace per i visual dell'esplosione per giocare e gli effetti fisici/danneggianti hanno un impatto.

Effetti di esplosione

Humanoids vengono uccisi dalle esplosioni, poiché l'esplosione rompe il carattere Model della giunta del collo.L'adozione di un ForceField a un modello proteggerà tutti i suoi figli dall'effetto di morte dell'esplosione.

Se non vuoi che le giunzioni tra e vengano rotte o vuoi implementare la tua formula per danneggiare , è consigliato impostare a 0 e utilizzare l'evento per gestire il risultato dell'esplosione.

Le esplosioni possono anche essere configurate per danneggiare Terrain , creando crateri, come configurato attraverso la ProprietàExplosionType.

Si noti che l'effetto di un'esplosione non è disturbato dagli ostacoli, il che significa che le parti/terreno scuddate dietro ad altre parti/terreno saranno ancora interessate.

Campioni di codice

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

Sommario

Proprietà

Eventi

Proprietà

BlastPressure

Lettura Parallela

Utilizzato per determinare la quantità di forza applicata a BaseParts catturata nel Explosion.BlastRadius .

Attualmente questo livello di forza applicata non varia in base alla distanza da Explosion.Position .Unanchored BaseParts accelererà allo stesso modo lontano dall'origine indipendentemente dalla distanza fornita che sono all'interno del raggio di esplosione.

La pressione di esplosione determina l'accelerazione delle parti a causa di un'esplosione.Non determina il grado in cui le articolazioni sono rotte.Quando Explosion.DestroyJointRadiusPercent è uguale a 1 tutte le giunzioni tra le parti nella Explosion.BlastRadius saranno distrutte a patto che la Pressione di Esplosione sia maggiore di 0.

Anche la pressione di esplosione non determina la quantità di danni dati a Terrain .Fornito BlastPressure è maggiore di 0 e Explosion.ExplosionType non è impostato su Enum.ExplosionType.NoCraters la dimensione del cratere creato è determinata esclusivamente dal Explosion.BlastRadius .

Impostare la pressione di esplosione a 0 elimina l'effetto dell'esplosione e è utile quando gli sviluppatori vogliono programmare il proprio comportamento personalizzato per le esplosioni utilizzando l'evento Explosion.Hit.

Campioni di codice

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

Lettura Parallela

Questa proprietà determina il raggio del Explosion , in studs. Questa proprietà accetta qualsiasi valore tra 0 e 100.

Questo raggio determina l'area d'effetto dell'esplosione, non la dimensione dei visual dell'esplosione.La dimensione dell'effetto visivo dell'esplosione è la stessa indipendentemente dal BlastRadius (anche se BlastRadius è 0).

BaseParts all'interno del BlastRadius sarà interessato dall'esplosione.Cioè, se Explosion.BlastPressure è maggiore di 0, la forza verrà applicata alle parti.Il grado in cui le articolazioni vengono rotte all'interno del BlastRadius dipende da Explosion.DestroyJointRadiusPercent .Explosion.Hit spara per ogni ogni BasePart all'interno del raggio.

BaseParts sono considerati all'interno di Explosion.BlastRadius anche se sono solo parzialmente a portata.

Campioni di codice

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

Lettura Parallela

Utilizzato per impostare la proporzione del Explosion.BlastRadius, tra 0 e 1, all'interno del quale verranno distrutti tutti i giunti.Tutto al di fuori di questo intervallo avrà solo la forza Explosion applicata ad esso.

Ad esempio, se Explosion.BlastRadius è impostato su 100 e DestroyJointRadiusPercent è impostato su 0.5, qualsiasi articolazione all'interno di un raggio di 50 studs verrebbe rotto.Qualsiasi articolazione tra i range di 50 e 100 stud non verrebbe distrutta, ma la forza Explosion sarebbe ancora applicata al BaseParts.

Questa proprietà consente agli sviluppatori di rendere Explosions 'non letale' a Humanoids impostando DestroyJointRadiusPercent a 0.Questo significa che il punto di connessione del collo non verrà rotto quando i personaggi entreranno in contatto con il Explosion .

Campioni di codice

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

Lettura Parallela

Questa proprietà determina il modo in cui il Explosion interagirà con il Terrain . È un valore Enum.ExplosionType e può essere impostato su una delle tre opzioni.

  • NoCraters - Le esplosioni non danneggeranno il terreno
  • Crateri - Le esplosioni creeranno crateri nel Terreno
  • Crateri e detriti - Redondante, si comporta allo stesso modo dei crateri

Se ExplosionType è impostato per creare crateri in Terrain , il raggio del cratere sarà approssimativamente uguale al Explosion.BlastRadius .I crateri vengono creati in tutti i Terrain materiali diversi dall'acqua.La dimensione del cratere non è influenzata dal materiale, anche se alcuni materiali creano bordi più grezzi di altri.

Campioni di codice

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

Nascosto
Non Replicato
Lettura Parallela

Position

Lettura Parallela

Questa proprietà è la posizione del centro del Explosion . È definita nello spazio mondiale e non è influenzata dal parentExplosion .

BaseParts sarà influenzato dal Explosion se si trova all'interno di Explosion.BlastRadius studs della posizione dell'esplosione.

L'effetto di un'esplosione è istantaneo.Questo significa che anche se la posizione di un'esplosione può essere cambiata dopo essere stata impostata non può influenzare due aree diverse.Una volta che un'esplosione è stata "detonata", poco dopo averla parentizzata a un discendente del Workspace, non lo farà di nuovo.In alcuni casi l'effetto visivo dell'esplosione si muoverà ma non avrà alcun effetto.

Per questo motivo dovrebbe essere creata una nuova esplosione se lo sviluppatore vuole che un'esplosione appaia in una posizione diversa.

Campioni di codice

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

Lettura Parallela

Un valore tra 0 e 1 che controlla la velocità dell'effetto delle particelle.A 1 esegue a velocità normale, a 0.5 esegue a metà velocità e a 0 congela il tempo.

Visible

Lettura Parallela

Questa proprietà determina se l'effetto visivo di un Explosion viene mostrato o meno.

Quando Visible è impostato su false, l'esplosione influirà ancora su BaseParts in suo Explosion.BlastRadius, la sola differenza è che non sarà vista.

Un uso per questa proprietà sarebbe per un sviluppatore creare i propri effetti di esplosione personalizzati utilizzando un ParticleEmitter , mantenendo la funzionalità predefinita Explosion .

Campioni di codice

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))

Metodi

Eventi

Hit

Si accende quando il Explosion colpisce un BasePart all'interno del suo Explosion.BlastRadius . Ritorna la parte colpita insieme alla distanza della parte da Explosion.Position .

Si noti che l'effetto di un Explosion non viene interrotto dagli ostacoli, questo significa che le parti scuddate dietro ad altre parti verranno ancora colpite, anche se la BasePart che sono scudate dietro è ancorata.

Questo evento si attiverà anche quando Explosion.BlastPressure è uguale a zero.Questo significa che gli sviluppatori possono programmare il proprio comportamento personalizzato per le esplosioni eliminando l'influenza dell'esplosione su BaseParts e Terrain .

Nota che questo evento si attiverà per ogni BasePart colpo.Questo significa che può sparare più volte per lo stesso personaggio del giocatore (come il personaggio Model è composto da più parti).Per questo motivo, quando si tratta di danni personalizzati utilizzando l'evento Explosion.Hit , è consigliato implementare un controllo per vedere se il personaggio è già stato colpito dal Explosion .

Parametri

part: BasePart

Il BasePart colpito dal Explosion.

distance: number

La distanza del colpo da Explosion.Position .


Campioni di codice

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)