Explosion

Pokaż przestarzałe

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

Wybuch zastosuje siłę do BaseParts wewnątrz wybuchu BlastRadius.Siła ta łamie JointInstances i WeldConstraints między częściami i zabija Humanoid postacie nie chronione przez ForceField .Constraints nie zostanie zniszczony przez eksplozję.

Jeśli Explosion jest powiązany w dowolnym miejscu modelu danych podczas uruchamiania doświadczenia, natychmiast się uruchamia i w ciągu kilku sekund staje się niepowiązany.Nie jest zniszczony za pomocą Instance:Destroy() w tym przypadku, więc połączenia nie są odłączane, a rodzic nie jest zamykany.Podobnie jak w przypadku wszystkich instancji, utrzymanie silnego odniesienia an Explosion uniemożliwi jego gromadzenie odpadów.

Zauważ, że Explosion musi być potomkiem Workspace dla wizualizacji eksplozji, aby grały i miały wpływ fizyczne/uszkadzające efekty.

Efekty wybuchu

Humanoids zostają zabite przez eksplozje, ponieważ eksplozja łamie łącze szyi znaku Model.Wychowanie ForceField do modelu ochroni wszystkie jego dzieci przed efektem zabójstwa wybuchu.

Jeśli nie chcesz, aby połączenia między BaseParts były złamane lub chcesz wdrożyć własną formułę uszkodzenia Humanoids, zaleca się ustawienie DestroyJointRadiusPercent na 0 i wykorzystanie wydarzenia Hit do obsługi wyniku wybuchu.

Wybuchy mogą być również skonfigurowane, aby zadać obrażenia Terrain, tworząc kratery, jak skonfigurowano za pomocą właściwości ExplosionType.

Zauważ, że efekt wybuchu nie jest zakłócony przez przeszkody , co oznacza, że części/tereny osłonięte za innymi częściami/terenami nadal będą dotknięte.

Przykłady kodu

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

Podsumowanie

Właściwości

Zdarzenia

Właściwości

BlastPressure

Odczyt równoległy

Używany do określenia ilości siły zastosowanej do BaseParts złapanej w Explosion.BlastRadius.

Obecnie poziom zastosowanej siły nie zmienia się w zależności od odległości od Explosion.Position.Niezakotwiczone BaseParts nie będzie przyspieszać równie daleko od źródła, niezależnie od dystansu, o ile znajdują się w promieniu wybuchu.

Ciśnienie wybuchu określa przyspieszenie części z powodu wybuchu.Nie określa stopnia, w jakim są złamane stawy.Gdy Explosion.DestroyJointRadiusPercent jest równy 1, wszystkie połączenia między częściami w Explosion.BlastRadius zostaną zniszczone, o ile BlastPressure jest większy niż 0.

Także ciśnienie wybuchu nie określa ilości obrażeń przekazanych Terrain .Dostarczone ciśnienie wybuchu jest większe niż 0 i Explosion.ExplosionType nie jest ustawione na Enum.ExplosionType.NoCraters rozmiar kraty utworzonej jest wyłącznie przez Explosion.BlastRadius .

Ustawienie ciśnienia wybuchu do 0 eliminuje efekt wybuchu i jest użyteczne, gdy programiści chcą zaprogramować własne niestandardowe zachowanie dla wybuchów za pomocą wydarzenia Explosion.Hit.

Przykłady kodu

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

Odczyt równoległy

Właściwość ta określa promień Explosion , w szpilkach. Ta właściwość akceptuje dowolną wartość pomiędzy 0 a 100.

Ten promień określa obszar działania wybuchu, a nie rozmiar wizualizacji wybuchu.Rozmiar wizualnego efektu wybuchu jest taki sam niezależnie od BlastRadius (nawet jeśli BlastRadius wynosi 0).

BaseParts w obrębie promienia wybuchu będzie dotknięty wybuchem.Oznacza to, że jeśli Explosion.BlastPressure jest większy niż 0, zostanie zastosowana siła do części.Stopień, w jakim stawy są złamane w obrębie BlastRadius, zależy od Explosion.DestroyJointRadiusPercent .Explosion.Hit będzie strzelać za każdym razem BasePart w promieniu.

BaseParts są rozważane w ramach Explosion.BlastRadius nawet jeśli są tylko częściowo w zasięgu.

Przykłady kodu

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

Odczyt równoległy

Używany do ustawienia proporcji Explosion.BlastRadius , pomiędzy 0 a 1, w której wszystkie stawy zostaną zniszczone.Wszystko poza tym zakresem będzie miało zastosowaną tylko siłę Explosion .

Na przykład, jeśli Explosion.BlastRadius jest ustawione na 100, a DestroyJointRadiusPercent jest ustawione na 0,5, wszystkie stawy w promieniu 50 ćwieków zostaną zniszczone.Żadne stawy między zakresem 50 a 100 szpilkami nie zostaną zniszczone, ale siła Explosion nadal zostanie zastosowana do BaseParts.

Właściwość ta pozwala programistom uczynić Explosions "nieśmiertelne" do Humanoids poprzez ustawienie DestroyJointRadiusPercent na 0.Oznacza to, że stawka szyjna nie zostanie złamana, gdy postacie wejdą w kontakt z Explosion.

Przykłady kodu

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

Odczyt równoległy

Właściwość ta określa, w jaki sposób Explosion będzie interakcjonować z Terrain. Jest to wartość Enum.ExplosionType i można ją ustawić na jedną z trzech opcji.

  • Brak kraterów - Wybuchy nie zaszkodzą terenowi
  • Kratery - Wybuchy utworzą kratery na terenie
  • Kratery i odpady - Redundantne, zachowują się tak samo jak Kratery

Jeśli ExplosionType jest ustawiony na tworzenie kraterów w Terrain, promień krateru będzie przybliżony do Explosion.BlastRadius.Kratery są tworzone we wszystkich Terrain materiałach innych niż woda.Rozmiar kraty nie jest wpływany przez materiał, choć niektóre materiały tworzą bardziej wymyślone krawędzie niż inne.

Przykłady kodu

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

Ukryte
Bez replikacji
Odczyt równoległy

Position

Odczyt równoległy

Właściwość ta jest pozycją centrum Explosion . Jest definiowana w przestrzeni świata i nie jest wpływana przez rodzica Explosion.

BaseParts będzie wpływać na Explosion jeśli znajdują się w odległości Explosion.BlastRadius od pozycji wybuchu.

Efekt wybuchu jest natychmiastowy.Oznacza to, że choć pozycja wybuchu może zostać zmieniona po jej ustawieniu, nie może wpłynąć na dwa różne obszary.Po wybuchu "zdetonowanym", krótko po rodzicielstwie go do potomka Workspace, nie zrobi tego ponownie.W niektórych przypadkach efekt wizualny wybuchu się poruszy, ale nie będzie miał żadnego wpływu.

Z tego powodu należy utworzyć nową eksplozję, jeśli programista chce, aby eksplozja pojawiła się w innej pozycji.

Przykłady kodu

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

Odczyt równoległy

Wartość pomiędzy 0 a 1, która kontroluje prędkość efektu cząstek.Na 1 uruchamia się z normalną prędkością, na 0.5 uruchamia się z połową prędkości, a na 0 zamraża czas.

Visible

Odczyt równoległy

Właściwość ta decyduje, czy efekt wizualny Explosion zostanie wyświetlony, czy nie.

Gdy Widoczny jest ustawiony na fałsz, eksplozja nadal będzie wpływać na BaseParts w jej Explosion.BlastRadius, jedyną różnicą jest to, że nie będzie widoczna.

Jednym z użyć tej właściwości byłoby dla programisty wykonanie własnych niestandardowych efektów wybuchu za pomocą ParticleEmitter , zachowując domyślną funkcjonalność Explosion.

Przykłady kodu

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

Metody

Zdarzenia

Hit

Wypala się, gdy Explosion trafi w BasePart w jego Explosion.BlastRadius . Powraca część uderzona wraz z odległością części od Explosion.Position .

Zauważ, że efekt Explosion nie jest zakłócony przez przeszkody, oznacza to, że części osłonięte za innymi częściami nadal będą uderzane, nawet jeśli BasePart są osłonięte za innymi częściami, są zakotwiczone.

To wydarzenie zostanie uruchomione również wtedy, gdy Explosion.BlastPressure jest równe zero.Oznacza to, że programiści mogą zaprogramować własne niestandardowe zachowanie dla wybuchów poprzez wyeliminowanie wpływu wybuchu na BaseParts i Terrain.

Zauważ, że to wydarzenie zostanie uruchomione za każdy BasePart trafienie.Oznacza to, że może strzelać wielokrotnie dla tej samej postaci gracza (ponieważ postać Model składa się z wielu części).Z tego powodu, gdy radzisz sobie z niestandardowymi obrażeniami za pomocą wydarzenia Explosion.Hit, zaleca się wdrożenie kontroli, aby sprawdzić, czy postać została już uderzona przez Explosion.

Parametry

part: BasePart

Uderzenie BasePart przez Explosion.

distance: number

Odległość trafienia z Explosion.Position.


Przykłady kodu

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)