mtx-roblox-ai / data /classes /Mouse.txt
chaman-k
chore: Cleanup
1bc170b
Mouse: Not CreatableMouse has been superseded by UserInputService and
ContextActionService, which cover a broader scope, are more feature
rich, and support cross-platform patterns better. It remains supported
because of its widespread use, but you should strongly consider using these
alternatives.
The Mouse object houses various API for pointers, primarily for buttons
and raycasting. It can be accessed through Player:GetMouse() called on
the Players.LocalPlayer in a LocalScript. It is also passed by
the Tool.Equipped event.
It is most notable for the Icon property, which changes
the cursor's appearance.
It continually raycasts the screen mouse position into the 3D world using
the TargetFilter property, storing the results of
the raycast in the Hit, Target, and
TargetSurface properties. These can be useful
for simple cases, but WorldRoot:Raycast() should be used in more
complicated raycasting scenarios.
Plugins can use use Plugin:GetMouse() to get a
PluginMouse, which behaves similarly.
-- From a LocalScript:
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local mouse = player:GetMouse()
-- Setting the mouse icon
mouse.Icon = "rbxasset://SystemCursors/Wait"
Note:
This object does not control/restrict pointer movement. For this, see
UserInputService.MouseBehavior and
UserInputService.MouseDeltaSensitivity.
If two functions are connected to same input event, such as
Button1Down, both functions will run when the
event fires. There is no concept of sinking/passing input, as events don't
support this behavior. However, ContextActionService does have this
behavior through BindAction.
While a mouse may not be available on all platforms, Mouse will still
function on mobile (touch) and console (gamepad), which don't typically have
mice or pointer hardware. For explicit cross-platform behaviors, use
UserInputService and ContextActionService.
See Input and Camera for more information on
customizing inputs in your experience.
SummaryPropertiesHit: CFrameThe CFrame of the mouse's position in 3D space.READ ONLYNOT REPLICATEDIcon: ContentThe content ID of the image used as the Mouse's icon.Origin: CFrameA CFrame positioned at the Workspace.CurrentCamera and
oriented toward the Mouse's 3D position.READ ONLYNOT REPLICATEDTarget: BasePartThe object in 3D space the mouse is pointing to.READ ONLYNOT REPLICATEDTargetFilter: InstanceDetermines an object (and its descendants) to be ignored when determining
Mouse.Hit and Mouse.Target.TargetSurface: NormalIdIndicates the NormalId of the BasePart surface at which the
mouse is pointing.READ ONLYNOT REPLICATEDUnitRay: RayA Ray directed towards the Mouse's world position,
originating from the Camera's world
position.READ ONLYNOT REPLICATEDViewSizeX: numberDescribes the width of the game window in pixels.READ ONLYNOT REPLICATEDViewSizeY: numberDescribes the height of the game window in pixels.READ ONLYNOT REPLICATEDX: numberDescribes the X (horizontal) component of the mouse's position on the
screen.READ ONLYNOT REPLICATEDY: numberDescribes the Y (vertical) component of the mouse's screen position.READ ONLYNOT REPLICATEDProperties inherited from InstanceArchivable: booleanDetermines if an Instance can be cloned using
Instance:Clone() or saved to file.ClassName: stringA read-only string representing the class this Instance belongs
to.READ ONLYNOT REPLICATEDName: stringA non-unique identifier of the Instance.Parent: InstanceDetermines the hierarchical parent of the Instance.NOT REPLICATEDRobloxLocked: booleanA deprecated property that used to protect CoreGui objects.HIDDENarchivable: booleanHIDDENNOT REPLICATEDDEPRECATEDclassName: stringREAD ONLYNOT REPLICATEDDEPRECATEDMethodsMethods inherited from InstanceAddTag(tag: string): void  Applies a tag to the instance.ClearAllChildren(): void  This function destroys all of an Instance's children.Clone(): Instance  Create a copy of an object and all its descendants, ignoring objects that
are not Archivable.Destroy(): void  Sets the Instance.Parent property to nil, locks the
Instance.Parent property, disconnects all connections, and calls
Destroy on all children.FindFirstAncestor(name: string): Instance  Returns the first ancestor of the Instance whose
Instance.Name is equal to the given name.FindFirstAncestorOfClass(className: string): Instance  Returns the first ancestor of the Instance whose
Instance.ClassName is equal to the given className.FindFirstAncestorWhichIsA(className: string): Instance  Returns the first ancestor of the Instance for whom
Instance:IsA() returns true for the given className.FindFirstChild(name: string, recursive: boolean): Instance  Returns the first child of the Instance found with the given name.FindFirstChildOfClass(className: string): Instance  Returns the first child of the Instance whose
ClassName is equal to the given className.FindFirstChildWhichIsA(className: string, recursive: boolean): Instance  Returns the first child of the Instance for whom
Instance:IsA() returns true for the given className.FindFirstDescendant(name: string): Instance  Returns the first descendant found with the given Instance.Name.GetActor(): Actor  Returns the Actor associated with the Instance, if any.GetAttribute(attribute: string): Variant  Returns the attribute which has been assigned to the given name.GetAttributeChangedSignal(attribute: string): RBXScriptSignal  Returns an event that fires when the given attribute changes.GetAttributes(): table  Returns a dictionary of string → variant pairs for each of the
Instance's attributes.GetChildren(): Objects  Returns an array containing all of the Instance's children.GetDebugId(scopeLength: number): string  NOT BROWSABLEReturns a coded string of the Instances DebugId used internally by
Roblox.GetDescendants(): Array  CUSTOM LUA STATEReturns an array containing all of the descendants of the instance.GetFullName(): string  Returns a string describing the Instance's ancestry.GetPropertyChangedSignal(property: string): RBXScriptSignal  Get an event that fires when a given property of an object changes.GetTags(): Array  Gets an array of all tags applied to the instance.HasTag(tag: string): boolean  Check whether the instance has a given tag.IsA(className: string): boolean  CUSTOM LUA STATEReturns true if an Instance's class matches or inherits from a
given class.IsAncestorOf(descendant: Instance): boolean  Returns true if an Instance is an ancestor of the given
descendant.IsDescendantOf(ancestor: Instance): boolean  Returns true if an Instance is a descendant of the given ancestor.Remove(): void  DEPRECATEDSets the object's Parent to nil, and does the same for all its
descendants.RemoveTag(tag: string): void  Removes a tag from the instance.SetAttribute(attribute: string, value: Variant): void  Sets the attribute with the given name to the given value.WaitForChild(childName: string, timeOut: number): Instance  CUSTOM LUA STATE, CAN YIELDReturns the child of the Instance with the given name. If the
child does not exist, it will yield the current thread until it does.children(): Objects  DEPRECATEDReturns an array of the object's children.clone(): Instance  DEPRECATEDdestroy(): void  DEPRECATEDfindFirstChild(name: string, recursive: boolean): Instance  DEPRECATEDgetChildren(): Objects  DEPRECATEDisA(className: string): boolean  DEPRECATED, CUSTOM LUA STATEisDescendantOf(ancestor: Instance): boolean  DEPRECATEDremove(): void  DEPRECATEDEventsButton1Down(): RBXScriptSignal  Fired when the left mouse button is pressed.Button1Up(): RBXScriptSignal  Fires when the left mouse button is released.Button2Down(): RBXScriptSignal  Fires when the right mouse button is pressed.Button2Up(): RBXScriptSignal  Fired when the right mouse button is released.Idle(): RBXScriptSignal  Fired during every heartbeat that the mouse isn't being passed to another
mouse event.Move(): RBXScriptSignal  Fired when the mouse is moved.WheelBackward(): RBXScriptSignal  Fires when the mouse wheel is scrolled backwards.WheelForward(): RBXScriptSignal  Fires when the mouse wheel is scrolled forwards.Events inherited from InstanceAncestryChanged(child: Instance, parent: Instance): RBXScriptSignal  Fires when the Instance.Parent property of the object or one of
its ancestors is changed.AttributeChanged(attribute: string): RBXScriptSignal  Fires whenever an attribute is changed on the Instance.Changed(property: string): RBXScriptSignal  Fired immediately after a property of an object changes.ChildAdded(child: Instance): RBXScriptSignal  Fires after an object is parented to this Instance.ChildRemoved(child: Instance): RBXScriptSignal  Fires after a child is removed from this Instance.DescendantAdded(descendant: Instance): RBXScriptSignal  Fires after a descendant is added to the Instance.DescendantRemoving(descendant: Instance): RBXScriptSignal  Fires immediately before a descendant of the Instance is removed.Destroying(): RBXScriptSignal  Fires immediately before the instance is destroyed via
Instance:Destroy().childAdded(child: Instance): RBXScriptSignal  DEPRECATEDPropertiesHitCFrameRead OnlyNot ReplicatedRead ParallelThis property indicates CFrame of the mouse's position in 3D
space. Note that Mouse.TargetFilter and its descendants will be
ignored.
Developers can get obtain the position of Hit like so:
local position = mouse.Hit.p
Hit is often used by Tools to fire a weapon towards the mouse in
third person.
Developers looking for the BasePart the mouse is pointing at
should use Mouse.Target.
How is Mouse.Hit calculated?
The position of the Hit CFrame is calculated as the point of intersection
between the mouse's internal Ray (an extended version of
Mouse.UnitRay) and an object in 3D space (such as a part).
The orientation of the Hit CFrame corresponds with the direction of the
Mouse.UnitRay.
local unitRayDirection = mouse.UnitRay.Direction
local mouseHitDirection = mouse.Hit.lookVector
-- unitRayDirection ≈ mouseHitDirection
-- the vectors are approximately equal
Note, the roll of the Workspace.CurrentCamera is not used when
calculating the orientation of the Hit CFrame.
The mouse's internal ray extends for 1000 studs. If the mouse is not
pointing at an object in 3D space (for example when pointing at the sky),
this property will be 1000 studs away from the
Workspace.CurrentCamera.Code SamplesThe code in this sample, when placed inside a LocalScript within
StarterPlayerScripts will draw a red laser beam between the character's head
and Mouse.Hit at all times.
Note, this beam will pass directly through obstructions in third person as the
Mouse's raycasting is done from the Workspace.CurrentCamera not the
head.Mouse.Hit Laser Beamlocal Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local player = Players.LocalPlayer
local mouse = player:GetMouse()
local beam = Instance.new("Beam")
beam.Segments = 1
beam.Width0 = 0.2
beam.Width1 = 0.2
beam.Color = ColorSequence.new(Color3.new(1, 0, 0))
beam.FaceCamera = true
local attachment0 = Instance.new("Attachment")
local attachment1 = Instance.new("Attachment")
beam.Attachment0 = attachment0
beam.Attachment1 = attachment1
beam.Parent = workspace.Terrain
attachment0.Parent = workspace.Terrain
attachment1.Parent = workspace.Terrain
local function onRenderStep()
local character = player.Character
if not character then
beam.Enabled = false
return
end
local head = character:FindFirstChild("Head")
if not head then
beam.Enabled = false
return
end
beam.Enabled = true
local origin = head.Position
local finish = mouse.Hit.Position
attachment0.Position = origin
attachment1.Position = finish
end
RunService.RenderStepped:Connect(onRenderStep)The code below visualizes the difference between Mouse.Hit and
Mouse.Origin. In order to do this, the code uses the
Vector3 positions of the hit and origin CFrame values
using .p.
The difference is that the origin is "where the mouse came from" (its origin)
and the hit is the position where the mouse hits (is when the player presses
their mouse).
This example also visualizes that the mouse origin is very similar to the
position of the CurrentCamera by printing the magnitude (distance) between
the two positions.Mouse Origin vs Mouse Hit vs CurrentCamera Positionlocal Players = game:GetService("Players")
local mouse = Players.LocalPlayer:GetMouse()
local camPos = workspace.CurrentCamera.CFrame.Position
print("Mouse.Hit:", mouse.Hit.Position)
print("camPos:", camPos)
print("Mouse.Origin:", mouse.Origin.Position)
print("Magnitude:", (mouse.Origin.Position - camPos).Magnitude)IconContentRead ParallelIcon is a property that determines the image used as the pointer. If
blank, a default arrow is used. While the cursor hovers over a
GuiButton, this property is temporarily ignored.
To hide the cursor entirely, do not use a transparent image –
instead, set UserInputService.MouseIconEnabled to false.
For getting/setting the user mouse icon in experiences, you should use
UserInputService.MouseIcon. Mouse.Icon will be deprecated
after the new API for plugins to set the mouse cursor is released.
Designing a Cursor
The following guidelines may prove useful when creating your own mouse
cursors:
The dimensions of the image used determines the size of the cursor.
The center of the image is where mouse inputs are issued.
The default mouse image is 64x64 pixels, with the mouse taking up 17x24
pixels of space.
System Cursors for PluginMouse
When using a PluginMouse retrieved from Plugin:GetMouse(),
you can use the following icons similar to your system's default cursors,
such as hands, arrows, I-beams, etc. You can use these with GUI events
like MouseEnter,
MouseLeave, and
MouseButton1Down to provide a
consistent studio experience when interacting with certain kinds of GUI
components. Note that these only work for studio plugins; they will not
work for other Mouse objects.
Look*AssetSuggested Userbxasset://SystemCursors/ArrowDefault clicking and selection.rbxasset://SystemCursors/PointingHandHovering over an active link/button.rbxasset://SystemCursors/OpenHandHovering over a draggable item.rbxasset://SystemCursors/ClosedHandDragging an item.rbxasset://SystemCursors/IBeamHovering in a text field.rbxasset://SystemCursors/SizeNSHovering over a vertical resize handle.rbxasset://SystemCursors/SizeEWHovering over a horizontal resize handle.rbxasset://SystemCursors/SizeNESWHovering over a corner resize handle.rbxasset://SystemCursors/SizeNWSEHovering over a corner resize handle.rbxasset://SystemCursors/SizeAllHovering over a multi-direction resize handle.rbxasset://SystemCursors/SplitNSHovering over a vertical "split" handle.rbxasset://SystemCursors/SplitEWHovering over a horizontal "split" handle.rbxasset://SystemCursors/ForbiddenHovering over a locked/forbidden item.rbxasset://SystemCursors/WaitIndicating an action is in progress.rbxasset://SystemCursors/BusyIndicating the system is busy.rbxasset://SystemCursors/CrossHovering over a pinpoint selection area.
* These appearances are approximations – the actual look is
dependent on your operating system.Code SamplesThis example changes the Players.LocalPlayer mouse icon to look like
the dragon image shown below.
Dragon Mouse Iconlocal Players = game:GetService("Players")
local mouse = Players.LocalPlayer:GetMouse()
mouse.Icon = "http://www.roblox.com/asset?id=163023520"OriginCFrameRead OnlyNot ReplicatedRead ParallelThe origin Mouse property is a CFrame indicating where
the mouse originated from. It is positioned at the
Workspace.CurrentCamera and oriented toward the Mouse's 3D
position.
Mouse.UnitRay starts at the same position as Origin, and extends
for a stud in the same direction.
local unitRay = mouse.UnitRay
local origin = mouse.Origin
-- unitRay.Direction = origin.p
-- unitRay.Direction ≈ origin.lookVector
For the position of the Mouse in 3D space, see Mouse.Hit.Code SamplesThe code below visualizes the difference between Mouse.Hit and
Mouse.Origin. In order to do this, the code uses the
Vector3 positions of the hit and origin CFrame values
using .p.
The difference is that the origin is "where the mouse came from" (its origin)
and the hit is the position where the mouse hits (is when the player presses
their mouse).
This example also visualizes that the mouse origin is very similar to the
position of the CurrentCamera by printing the magnitude (distance) between
the two positions.Mouse Origin vs Mouse Hit vs CurrentCamera Positionlocal Players = game:GetService("Players")
local mouse = Players.LocalPlayer:GetMouse()
local camPos = workspace.CurrentCamera.CFrame.Position
print("Mouse.Hit:", mouse.Hit.Position)
print("camPos:", camPos)
print("Mouse.Origin:", mouse.Origin.Position)
print("Magnitude:", (mouse.Origin.Position - camPos).Magnitude)TargetBasePartRead OnlyNot ReplicatedRead ParallelThe object in 3D space the mouse is pointing to.
Note:
If Mouse.TargetFilter has been set, the target filter and its
descendants will be ignored.
When the mouse is not pointing at a BasePart, for example when
it is pointing at the sky, Target will be nil.
Developers looking for the position of the mouse in 3D space should use
Mouse.Hit.
Code SamplesThe following code sample, when placed in StarterPlayerScripts will create a
tool in the player's backpack that, once equipped, will change the
BasePart.BrickColor of every BasePart the player clicks on.Color Randomizer Toollocal Players = game:GetService("Players")
local localPlayer = Players.LocalPlayer
local backpack = localPlayer:WaitForChild("Backpack")
local tool = Instance.new("Tool")
tool.RequiresHandle = false
tool.CanBeDropped = false
tool.Parent = backpack
tool.Equipped:Connect(function(mouse)
mouse.Button1Down:Connect(function()
if mouse.Target and mouse.Target.Parent then
mouse.Target.BrickColor = BrickColor.random()
end
end)
end)TargetFilterInstanceRead ParallelThis property determines an object to be ignored by the mouse when
calculating Mouse.Hit and Mouse.Target. The descendants of
the object are also ignored, so it is possible to ignore multiple objects
so long as they are a descendant of the object to which this property is
set. This property is useful when filtering models containing special
effects or decorations that should not affect Mouse.Hit or
Mouse.Target.
This property can be set to any Instance or nil, for example:
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local mouse = player:GetMouse()
mouse.TargetFilter = workspace.Model
Note that the Character of the
Players.LocalPlayer is ignored by the mouse automatically.TargetSurfaceNormalIdRead OnlyNot ReplicatedRead ParallelThis property indicates the NormalId of the BasePart
surface at which the mouse is pointing. This property is derived from the
world position of mouse (Mouse.Hit) and the part toward which the
mouse is pointing (Mouse.Target).
This property isn't meaningful when the mouse is not pointing at a part,
for example when the mouse is pointing at the sky. At the moment, this
property is set to 'Right' under these circumstances. Before using this
property, check that the mouse's target is not nil.
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local mouse = player:GetMouse()
-- Check that there exists a part at which the mouse is pointing
if mouse.Target then
print("The mouse is pointing to the " .. mouse.TargetSurface.Name .. " side of " .. mouse.Target.Name)
else
print("The mouse is not pointing at anything.")
endCode SamplesThe code in this sample, when placed in a LocalScript inside
StarterPlayerScripts will set the surface of any BasePart clicked on to a
random surface.Surface Randomizerlocal Players = game:GetService("Players")
local player = Players.LocalPlayer
local mouse = player:GetMouse()
local surfaceTypes = {
Enum.SurfaceType.Smooth,
Enum.SurfaceType.Glue,
Enum.SurfaceType.Weld,
Enum.SurfaceType.Studs,
Enum.SurfaceType.Inlet,
Enum.SurfaceType.Universal,
Enum.SurfaceType.Hinge,
Enum.SurfaceType.Motor,
}
local function onMouseClick()
-- make sure the mouse is pointing at a part
local target = mouse.Target
if not target then
return
end
local surfaceType = surfaceTypes[math.random(1, #surfaceTypes)]
local surface = mouse.TargetSurface
local propertyName = surface.Name .. "Surface"
mouse.Target[propertyName] = surfaceType
end
mouse.Button1Down:Connect(onMouseClick)UnitRayRayRead OnlyNot ReplicatedRead ParallelThe UnitRay property is a Ray directed toward the
Mouse's position in 3D space (described by Mouse.Hit). It
originates from the CFrame of the
Workspace.CurrentCamera. Like all unit rays, it has a distance
of 1.
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local mouse = player:GetMouse()
print(mouse.UnitRay.Direction.magnitude) -- Always 1ViewSizeXnumberRead OnlyNot ReplicatedRead ParallelThe ViewSizeX property describes the horizontal component of the game
window's size in pixels.Code SamplesThis code sample shows how you can create a Vector2 representing
the Mouse object's position on screen (X() and
Y()) and the size of the screen itself
(ViewSizeX() and ViewSizeY()).
Using these, you can normalize the position of the mouse on-screen such that
the top-left just under the topbar maps to (0, 0) and the bottom-right maps to
(1, 1). This normalized position is calculated and printed as the mouse moves
using the Move() event.Normalized Mouse Positionlocal Players = game:GetService("Players")
-- Note: You should use ContextActionService or UserInputService instead of
-- the Mouse object for accomplishing this task.
local player = Players.LocalPlayer
local mouse = player:GetMouse()
local function onMouseMove()
-- Construct Vector2 objects for the mouse's position and screen size
local position = Vector2.new(mouse.X, mouse.Y)
local size = Vector2.new(mouse.ViewSizeX, mouse.ViewSizeY)
-- A normalized position will map the top left (just under the topbar)
-- to (0, 0) the bottom right to (1, 1), and the center to (0.5, 0.5).
-- This is calculated by dividing the position by the total size.
local normalizedPosition = position / size
print(normalizedPosition)
end
mouse.Move:Connect(onMouseMove)ViewSizeYnumberRead OnlyNot ReplicatedRead ParallelThe ViewSizeY property describes the vertical component of the game
window's size in pixels. This length includes the space used by the
topbar.Code SamplesThis code sample shows how you can create a Vector2 representing
the Mouse object's position on screen (X() and
Y()) and the size of the screen itself
(ViewSizeX() and ViewSizeY()).
Using these, you can normalize the position of the mouse on-screen such that
the top-left just under the topbar maps to (0, 0) and the bottom-right maps to
(1, 1). This normalized position is calculated and printed as the mouse moves
using the Move() event.Normalized Mouse Positionlocal Players = game:GetService("Players")
-- Note: You should use ContextActionService or UserInputService instead of
-- the Mouse object for accomplishing this task.
local player = Players.LocalPlayer
local mouse = player:GetMouse()
local function onMouseMove()
-- Construct Vector2 objects for the mouse's position and screen size
local position = Vector2.new(mouse.X, mouse.Y)
local size = Vector2.new(mouse.ViewSizeX, mouse.ViewSizeY)
-- A normalized position will map the top left (just under the topbar)
-- to (0, 0) the bottom right to (1, 1), and the center to (0.5, 0.5).
-- This is calculated by dividing the position by the total size.
local normalizedPosition = position / size
print(normalizedPosition)
end
mouse.Move:Connect(onMouseMove)XnumberRead OnlyNot ReplicatedRead ParallelWhen detecting changes in the mouse's position on-screen, it is
recommended that you use ContextActionService:BindAction() with
UserInputType.MouseMovement or
UserInputService.InputChanged, which both describe the position of
the mouse using the Position (a
Vector3) of an InputObject, instead of using this and
related properties.
The X property describes the horizontal component of the mouse's position
on the screen. The position is measured in pixels relative to the top left
corner, under the topbar. This property can be used in conjunction with
Mouse.Y to produce a Vector2 representing the mouse's
position:
local position = Vector2.new(mouse.X, mouse.Y)
This property does not fire Changed or the signal
returned from
GetPropertyChangedSignal. Use
the Mouse.Move event instead.Code SamplesThis code sample shows how you can create a Vector2 representing
the Mouse object's position on screen (X() and
Y()) and the size of the screen itself
(ViewSizeX() and ViewSizeY()).
Using these, you can normalize the position of the mouse on-screen such that
the top-left just under the topbar maps to (0, 0) and the bottom-right maps to
(1, 1). This normalized position is calculated and printed as the mouse moves
using the Move() event.Normalized Mouse Positionlocal Players = game:GetService("Players")
-- Note: You should use ContextActionService or UserInputService instead of
-- the Mouse object for accomplishing this task.
local player = Players.LocalPlayer
local mouse = player:GetMouse()
local function onMouseMove()
-- Construct Vector2 objects for the mouse's position and screen size
local position = Vector2.new(mouse.X, mouse.Y)
local size = Vector2.new(mouse.ViewSizeX, mouse.ViewSizeY)
-- A normalized position will map the top left (just under the topbar)
-- to (0, 0) the bottom right to (1, 1), and the center to (0.5, 0.5).
-- This is calculated by dividing the position by the total size.
local normalizedPosition = position / size
print(normalizedPosition)
end
mouse.Move:Connect(onMouseMove)YnumberRead OnlyNot ReplicatedRead ParallelWhen detecting changes in the mouse's position on-screen, it is
recommended that you use ContextActionService:BindAction() with
UserInputType.MouseMovement or
UserInputService.InputChanged, which both describe the position of
the mouse using the Position (a
Vector3) of an InputObject, instead of using this and
related properties.
The Y property describes the vertical component of the mouse's position on
the screen. The position is measured in pixels relative to the top left
corner, under the topbar. This property can be used in conjunction with
Mouse.X to produce a Vector2 representing the mouse's
position:
local position = Vector2.new(mouse.X, mouse.Y)
This property does not fire Changed or the signal
returned from
GetPropertyChangedSignal. Use
the Mouse.Move event instead.Code SamplesThis code sample shows how you can create a Vector2 representing
the Mouse object's position on screen (X() and
Y()) and the size of the screen itself
(ViewSizeX() and ViewSizeY()).
Using these, you can normalize the position of the mouse on-screen such that
the top-left just under the topbar maps to (0, 0) and the bottom-right maps to
(1, 1). This normalized position is calculated and printed as the mouse moves
using the Move() event.Normalized Mouse Positionlocal Players = game:GetService("Players")
-- Note: You should use ContextActionService or UserInputService instead of
-- the Mouse object for accomplishing this task.
local player = Players.LocalPlayer
local mouse = player:GetMouse()
local function onMouseMove()
-- Construct Vector2 objects for the mouse's position and screen size
local position = Vector2.new(mouse.X, mouse.Y)
local size = Vector2.new(mouse.ViewSizeX, mouse.ViewSizeY)
-- A normalized position will map the top left (just under the topbar)
-- to (0, 0) the bottom right to (1, 1), and the center to (0.5, 0.5).
-- This is calculated by dividing the position by the total size.
local normalizedPosition = position / size
print(normalizedPosition)
end
mouse.Move:Connect(onMouseMove)Properties inherited from InstanceArchivablebooleanRead ParallelThis property determines whether an object should be
included when the game is published or saved, or when
Instance:Clone() is called on one of the object's ancestors.
Calling Clone directly on an object will return nil if the cloned object
is not archivable. Copying an object in Studio (using the 'Duplicate' or
'Copy' options) will ignore the Archivable property and set Archivable to
true for the copy.
local part = Instance.new("Part")
print(part:Clone()) --> Part
part.Archivable = false
print(part:Clone()) --> nilClassNamestringRead OnlyNot ReplicatedRead ParallelA read-only string representing the class this Instance belongs
to.
This property can be used with various other functions of Instance that
are used to identify objects by type, such as Instance:IsA() or
Instance:FindFirstChildOfClass().
Note this property is read only and cannot be altered by scripts.
Developers wishing to change an Instance's class will instead have
to create a new Instance.
Unlike Instance:IsA(), ClassName can be used to check if an object
belongs to a specific class ignoring class inheritance. For example:
for _, child in ipairs(game.Workspace:GetChildren()) do
if child.ClassName == "Part" then
print("Found a Part")
-- will find Parts in model, but NOT TrussParts, WedgeParts, etc
end
endNamestringRead ParallelA non-unique identifier of the Instance.
This property is an identifier that describes an object. Names are not
necessarily unique identifiers however; multiple children of an object may
share the same name. Names are used to keep the object hierarchy
organized, along with allowing scripts to access specific objects.
The name of an object is often used to access the object through the data
model hierarchy using the following methods:
local baseplate = workspace.Baseplate
local baseplate = workspace["Baseplate"]
local baseplate = workspace:FindFirstChild("BasePlate")
In order to make an object accessible using the dot operator, an object's
Name must follow a certain syntax. The objects name must start with an
underscore or letter. The rest of the name can only contain letters,
numbers, or underscores (no other special characters). If an objects name
does not follow this syntax it will not be accessible using the dot
operator and Lua will not interpret its name as an identifier.
If more than one object with the same name are siblings then any attempt
to index an object by that name will return the only one of the objects
found similar to Instance:FindFirstChild(), but not always the
desired object. If a specific object needs to be accessed through code, it
is recommended to give it a unique name, or guarantee that none of its
siblings share the same name as it.
Note, a full name showing the instance's hierarchy can be obtained using
Instance:GetFullName().ParentInstanceNot ReplicatedRead ParallelThe Parent property determines the hierarchical parent of the
Instance. The following terminology is commonly used when talking
about how this property is set:
An object is a child (parented to) another object when its
Parent is set to that object.
The descendants of an Instance are the children of that
object, plus the descendants of the children as well.
The ancestors of an Instance are all the objects that the
Instance is a descendant of.
It is from this property that many other API members get their name, such
as GetChildren and
FindFirstChild.
The Remove function sets this property to nil.
Calling Destroy will set the Parent of an
Instance and all of its descendants to nil, and also lock
the Parent property. An error is raised when setting the Parent of a
destroyed object.
This property is also used to manage whether an object exists in the game
or needs removed. As long as an objects parent is in the
DataModel, is stored in a variable, or is referenced by another
objects property, then the object remains in the game. Otherwise, the
object will automatically be removed. The top level DataModel
object (the one referred to as the game by scripts) has no parent, but
always has a reference held to it by the game engine, and exists for the
duration of a session.
Newly created objects using Instance.new() will not have a
parent, and usually will not be visible or function until one is set. The
most elementary creation of an object has two steps: creating the object,
then setting its parent.
-- Create a part and parent it to the workspace
local part = Instance.new("Part")
part.Parent = workspace
-- Instance new can also take Parent as a second parameter
Instance.new("NumberValue", workspace)
Object Replication
An object created by server will not replicate to clients until it is
parented to some object that is replicated. When creating an object then
setting many properties, it's recommended to set Parent last. This
ensures the object replicates once, instead of replicating many property
changes.
local part = Instance.new("Part") -- Avoid using the second parameter here
part.Anchored = true
part.BrickColor = BrickColor.new("Really red")
-- Potentially many other property changes could go here here...
-- Always set parent last!
part.Parent = workspace
However, if you were parenting your parts to a Model whose parent
hasn't been set yet, then setting the parent first would not matter as the
model would not have replicated yet.RobloxLockedbooleanHiddenPlugin SecurityRead ParallelThis property used to protect objects in the CoreGui service from
being altered by users in an unauthorized manner. It has been deprecated
and does not do anything.archivablebooleanHiddenNot ReplicatedDEPRECATEDRead ParallelDEPRECATEDThis deprecated property is a variant of Instance.Archivable which
should be used instead.classNamestringRead OnlyNot ReplicatedDEPRECATEDRead ParallelDEPRECATEDThis deprecated property is a variant of Instance.ClassName which
should be used instead.MethodsMethods inherited from InstanceAddTagvoidThis method applies a tag to the instance, with no effect if the tag is
already applied. Successfully adding a tag will fire a signal created by
CollectionService:GetInstanceAddedSignal() with the given tag.
Note that when tagging an instance, it's common that some resources are
used to give the tag its functionality, for example event connections or
tables. To prevent memory leaks, it's a good idea to clean these up
(disconnect, set to nil, etc.) when no longer needed for a tag. Do this
when calling Instance:RemoveTag(), calling
Instance:Destroy(), or in a function connected to a signal
returned by CollectionService:GetInstanceRemovedSignal().Parameterstag: stringReturnsvoidClearAllChildrenvoidThis function destroys all of an Instance's children.
As Instance:Destroy() also calls itself on the children of an
object it is used on, this function will destroy all descendants.
Alternatives to ClearAllChildren
If the developer does not wish to destroy all descendants, they should use
Instance:GetChildren() or Instance:GetDescendants() to
loop through an object and select what to destroy. For example, the
following code sample will destroy all parts in an object.
for _, instance in pairs(object:GetDescendants()) do
if instance:IsA("BasePart") then
instance:Destroy()
end
endReturnsvoidCode SamplesThis example creates a Part and adds a few sparkle objects to the part. Then
it calls Part:ClearAllChildren() to remove all of the children.Instance:ClearAllChildrenlocal part = Instance.new("Part")
-- add some sparkles
for _ = 1, 3 do
local sparkles = Instance.new("Sparkles")
sparkles.Parent = part
end
print("Part has", #part:GetChildren(), "children")
--> Part has 3 children
part:ClearAllChildren()
print("Part has", #part:GetChildren(), "children")
--> Part has 0 childrenCloneInstanceClone creates a copy of an object and all of its descendants, ignoring
all objects that are not Archivable. The copy
of the root object is returned by this function and its
Parent is set to nil.
If a reference property such as ObjectValue.Value is set in a
cloned object, the value of the copy's property depends on original's
value:
If a reference property refers to an object that was also cloned, an
internal reference, the copy will refer to the copy.
If a reference property refers to an object that was not cloned, an
external reference, the same value is maintained in the copy.
This function is typically used to create models that can be regenerated.
First, get a reference to the original object. Then, make a copy of the
object and insert the copy by setting its Parent
to the Workspace or one of its descendants. Finally, when it's
time to regenerate the model, Destroy the copy
and clone a new one from the original like before.ReturnsInstanceCode SamplesThis code first references an existing object in the original variable.
Then, it makes a copy of the object, sets the parent to that of the original,
and finally moves the copy to (0, 50, 0).Clone Example-- Get a reference to an existing object
local original = workspace.Model
-- Create the model copy
local copy = original:Clone()
-- Parent the copy to the same parent as the original
copy.Parent = original.Parent
-- Move the copy so it's not overlapping the original
copy:SetPrimaryPartCFrame(CFrame.new(0, 50, 0))DestroyvoidSets the Instance.Parent property to nil, locks the
Instance.Parent property, disconnects all connections, and calls
Destroy on all children. This function is the correct way to dispose of
objects that are no longer required. Disposing of unneeded objects is
important, since unnecessary objects and connections in a place use up
memory (this is called a memory leak) which can lead to serious
performance issues over time.
Tip: After calling Destroy on an object, set any variables referencing
the object (or its descendants) to nil. This prevents your code from
accessing anything to do with the object.
local part = Instance.new("Part")
part.Name = "Hello, world"
part:Destroy()
-- Don't do this:
print(part.Name) --> "Hello, world"
-- Do this to prevent the above line from working:
part = nil
Once an Instance has been destroyed by this method it cannot be
reused because the Instance.Parent property is locked. To
temporarily remove an object, set Parent it to nil
instead. For example:
object.Parent = nil
wait(2)
object.Parent = workspace
To Destroy an object after a set amount of time, use
Debris:AddItem().ReturnsvoidCode SamplesInstance:Destroylocal Part = workspace.Part
Part:Destroy()
Part.Parent = workspace --> The Parent property of Part is lockedFindFirstAncestorInstanceWrite ParallelReturns the first ancestor of the Instance whose
Instance.Name is equal to the given name.
This function works upwards, meaning it starts at the Instance's
immediate Instance.Parent and works up towards the
DataModel. If no matching ancestor is found, it returns nil.
The following code snippet would find the first ancestor of the object
named 'Car'.
local car = object:FindFirstAncestor("Car")
For variants of this function that find ancestors of a specific class,
please see Instance:FindFirstAncestorOfClass() and
Instance:FindFirstAncestorWhichIsA().Parametersname: stringThe Instance.Name to be looked for.ReturnsInstanceThe Instance found.FindFirstAncestorOfClassInstanceWrite ParallelReturns the first ancestor of the Instance whose
Instance.ClassName is equal to the given className.
This function works upwards, meaning it starts at the Instance's
immediate Instance.Parent and works up towards the
DataModel. If no matching ancestor is found, it returns nil.
A common use of this function is finding the Model a
BasePart belongs to. For example:
local model = part:FindFirstAncestorOfClass("Model")
This function is a variant of Instance:FindFirstAncestor() which
checks the Instance.ClassName property rather than
Instance.Name. Instance:FindFirstAncestorWhichIsA() also
exists, using the Instance:IsA() method instead to respect class
inheritance.ParametersclassName: stringThe Instance.ClassName to be looked for.ReturnsInstanceThe Instance found.FindFirstAncestorWhichIsAInstanceWrite ParallelReturns the first ancestor of the Instance for whom
Instance:IsA() returns true for the given className.
This function works upwards, meaning it starts at the Instance's
immediate Instance.Parent and works up towards the
DataModel. If no matching ancestor is found, it returns nil.
Unlike Instance:FindFirstAncestorOfClass(), this function uses
Instance:IsA() which respects class inheritance. For example:
print(part:IsA("Part")) --> true
print(part:IsA("BasePart")) --> true
print(part:IsA("Instance")) --> true
Therefore, the following code sample will return the first
BasePart ancestor, regardless of if it is a WedgePart,
MeshPart or Part.
local part = object:FindFirstAncestorWhichIsA("BasePart")
See also, Instance:FindFirstAncestor().ParametersclassName: stringThe Instance.ClassName to be looked for.ReturnsInstanceThe Instance found.FindFirstChildInstanceWrite ParallelReturns the first child of the Instance with the given name,
or nil if no such child exists. If the optional recursive argument is
true, this function searches all descendants rather than only the
immediate children of the Instance.
Checking the Existence of an Object
FindFirstChild is necessary if you need to verify an object exists before
continuing. Attempting to index a child by name using the dot operator
throws an error if the child doesn't exist.
-- The following line errors if Part doesn't exist in the Workspace:
workspace.Part.Transparency = 0.5
Use FindFirstChild to first check for Part, then use an if-statement to
run code that needs it.
local part = workspace:FindFirstChild("Part")
if part then
part.Transparency = 0.5
end
Finding a Child Whose Name Matches a Property
Sometimes the Name of an object is the same as that
of a property of its Parent. When using the dot
operator, properties take precedence over children if they share a name.
In the following example, a Folder called "Color" is added to a
Part, which also has the Part.Color property.
Part.Color refers to the Color3, not the Folder.
local part = Instance.new("Part")
local folder = Instance.new("Folder")
folder.Name = "Color"
folder.Parent = part
local c = part.Color --> A Color3
local c2 = part:FindFirstChild("Color") --> The Folder
A benefit of using FindFirstChild() in
this way is that the introduction of new properties does not impose a risk
on your code.
Performance Note
FindFirstChild() takes about 20% longer
than using the dot operator and almost 8 times longer than simply storing
a reference to an object. Therefore, you should avoid calling it in
performance-dependent code such as in tight loops or functions connected
to RunService.Heartbeat and RunService.RenderStepped.
Instead, store the result in a variable, or consider using
ChildAdded or
WaitForChild() to detect when a child of a
given name becomes available.Parametersname: stringThe Instance.Name to be searched for.recursive: booleanWhether or not the search should be conducted recursively.Default Value: falseReturnsInstanceThe Instance found.Code SamplesThe below would look in Workspace for an object name "Brick". If found, it
will change the name of the object to "Foo".Instance:FindFirstChildlocal found = workspace:FindFirstChild("Brick")
if found then
found.Name = "Foo"
endFindFirstChildOfClassInstanceWrite ParallelReturns the first child of the Instance whose
ClassName is equal to the given className.
If no matching child is found, this function returns nil.
Unlike Instance:FindFirstChildWhichIsA() this function uses only
returns objects whose class matches the given className, ignoring class
inheritance.
Developers looking for a child by name should use
Instance:FindFirstChild() instead.ParametersclassName: stringThe Instance.ClassName to be looked for.ReturnsInstanceThe Instance found.Code SamplesInstance:FindFirstChildOfClasslocal Players = game:GetService("Players")
local player = Players.LocalPlayer
local character = player.Character or player.CharacterAdded:Wait()
local humanoid
while not humanoid do
humanoid = character:FindFirstChildOfClass("Humanoid")
if not humanoid then
character.ChildAdded:Wait()
end
endFindFirstChildWhichIsAInstanceWrite ParallelReturns the first child of the Instance for whom
Instance:IsA() returns true for the given className.
If no matching child is found, this function returns nil. If the optional
recursive argument is true, this function searches all descendants rather
than only the immediate children of the Instance.
Unlike Instance:FindFirstChildOfClass(), this function uses
Instance:IsA() which respects class inheritance. For example:
print(part:IsA("Part")) --> true
print(part:IsA("BasePart")) --> true
print(part:IsA("Instance")) --> true
Therefore, the following code sample will return the first
BasePart child, regardless of if it is a WedgePart,
MeshPart or Part.
local part = object:FindFirstChildWhichIsA("BasePart")
Developers looking for a child by name, should use
Instance:FindFirstChild() instead.ParametersclassName: stringThe Instance.ClassName to be searched for.recursive: booleanWhether or not the search should be conducted recursively.Default Value: falseReturnsInstanceThe Instance found.FindFirstDescendantInstanceWrite ParallelReturns the first descendant found with the given Instance.Name.Parametersname: stringThe Instance.Name to search for.ReturnsInstanceThe Instance found.GetActorActorWrite ParallelIf the Instance is an Actor, the Actor itself is
returned. Otherwise, its closest ancestor Actor is returned. If no
ancestor is an Actor, the result is nil.ReturnsActorThe Actor found.GetAttributeVariantWrite ParallelThis function returns the attribute which has been assigned to the given
name. If no attribute has been assigned then nil is returned.
For example, the following code snippet will set the value of the
instance's InitialPostion attribute. Note that this code sample does not
define Instance:
local initialPosition = instance:GetAttribute("InitialPosition")
See also:
Instance:SetAttribute(), sets the attribute with the given name
to the given value
Instance:GetAttributes(), returns a dictionary of string →
variant pairs for each of the instance's attributes
Instance.AttributeChanged, fires whenever an attribute is
changed on the instance
Instance:GetAttributeChangedSignal(), returns an event that
fires when the given attribute changes
Parametersattribute: stringThe name of the attribute being retrieved.ReturnsVariantThe attribute which has been assigned to the given name. If no
attribute has been assigned then nil is returned.GetAttributeChangedSignalRBXScriptSignalThis function returns an event that behaves exactly like the Changed
event, except that the event only fires when the given attribute changes.
It's generally a good idea to use this method instead of a connection to
Changed with a function that checks the attribute name. Subsequent calls
to this method on the same object with the same attribute name return the
same event.
It is similar to Instance:GetPropertyChangedSignal() but for
attributes.
For example, the following code snippet will return a signal that fires
the function Instance.AttributeChanged when the instance's
InitialPosition attribute changes. Note that this code sample does not
define Instance:
local function attributeChanged()
print("Attribute changed")
end
instance:GetAttributeChangedSignal("InitialPosition"):Connect(attributeChanged)
See also:
Instance:SetAttribute(), sets the attribute with the given name
to the given value
Instance:GetAttribute(), returns the attribute which has been
assigned to the given name
Instance:GetAttributes(), returns a dictionary of string →
variant pairs for each of the instance's attributes
Instance.AttributeChanged, fires whenever an attribute is
changed on the instance
Parametersattribute: stringThe name of the specified attribute for which the change signal is
being returned.ReturnsRBXScriptSignalAn event that fires when the given attribute changes.GetAttributestableWrite ParallelThis function returns a dictionary of string → variant pairs for each
attribute where the string is the name of the attribute and the variant is
a non-nil value.
For example, the following code snippet will print an instance's
attributes and values. Note that this code sample does not define
Instance:
local attributes = instance:GetAttributes()
for name, value in pairs(attributes) do
print(name .. " " .. value)
end
See also:
Instance:SetAttribute(), sets the attribute with the given name
to the given value
Instance:GetAttribute(), returns the attribute which has been
assigned to the given name
Instance.AttributeChanged, fires whenever an attribute is
changed on the instance
Instance:GetAttributeChangedSignal(), returns an event that
fires when the given attribute changes
ReturnstableA dictionary of string → variant pairs for each attribute where the
string is the name of the attribute and the variant is a non-nil
value.GetChildrenObjectsWrite ParallelReturns an array (a numerically indexed table) containing all of the
Instance's direct children, or every Instance whose
Parent is equal to the object. The array can be
iterated upon using either a numeric or generic for-loop:
-- Numeric for-loop example
local children = workspace:GetChildren()
for i = 1, #children do
local child = children[i]
print(child.Name .. " is child number " .. i)
end
-- Generic for-loop example
local children = workspace:GetChildren()
for i, child in ipairs(children) do
print(child.Name .. " is child number " .. i)
end
The children are sorted by the order in which their
Parent property was set to the object.
See also the GetDescendants function.ReturnsObjectsAn array containing the Instance's children.Code SamplesThe below would print the name of all objects currently in Workspace when ran.Instance:GetChildrenlocal children = workspace:GetChildren()
for i = 1, #children do
print(i, children[i].Name)
endGetDebugIdstringNot BrowsablePlugin SecurityReturns a coded string of the Instances DebugId used internally by
Roblox.
Note:
This item is protected. Attempting to use it in a Script or
LocalScript will cause an error
A debug ID is an ID used in debugging processes. It allows a debugger to
read each instruction before an application processes it. All objects in
Roblox act like processes and each run instructions (or 'code') that can
be debugged if needed
This can be helpful for plugins which need to distinguish similar
objects from one-another (such as objects that share the same name)
ParametersscopeLength: numberThe scope length.Default Value: 4ReturnsstringThe Debug ID string.Code SamplesInstance:GetDebugIdprint(workspace:GetDebugId()) --> 39FA_12
print(workspace:GetDebugId(10)) --> 39FA2FEF4D_12
print(workspace:GetDebugId(math.huge)) --> 12GetDescendantsArrayCustom Lua StateWrite ParallelThe GetDescendants function of an object returns an array that
contains all of the descendants of that object. Unlike
Instance:GetChildren(), which only returns the immediate children
of an object, GetDescendants will find every child of the object, every
child of those children, and so on.
The arrays returned by GetDescendants are arranged so that parents come
earlier than their children. Refer to the following example of a
Model in the Workspace:
Inside this model are three parts (C, D, and E) and another model
(InnerModel). Inside the inner model are two more parts (A and B). Calling
GetDescendants on the first model and printing the contents of the
returned array would print the first level of children (InnerModel, C, D,
and E) before A and B.
local descendants = game.Workspace.Model:GetDescendants()
-- Loop through all of the descendants of the model and
-- print out their name
for index, descendant in pairs(descendants) do
print(descendant.Name)
end
-- Prints:
-- C
-- D
-- E
-- InnerModel
-- A
-- BReturnsArrayAn array containing the Instance's descendants.Code SamplesGetDescendants is often used to do something to all the descendants that are a
particular type of object. The code in this example uses GetDescendants and
Instance:IsA() to find all of the parts in the workspace and turns
them green.Instance:GetDescendantslocal descendants = workspace:GetDescendants()
-- Loop through all of the descendants of the Workspace. If a
-- BasePart is found, the code changes that parts color to green
for _, descendant in pairs(descendants) do
if descendant:IsA("BasePart") then
descendant.BrickColor = BrickColor.Green()
end
endGetFullNamestringWrite ParallelReturns a string describing the Instance's ancestry. The string is
a concatenation of the Name of the object and its
ancestors, separated by periods. The DataModel (game) is not
considered. For example, a Part in the Workspace may
return Workspace.Part.
When called on an Instance that is not a descendant of the
DataModel, this function considers all ancestors up to and
including the topmost one without a Parent.
This function is useful for logging and debugging. You shouldn't attempt
to parse the returned string for any useful operation; this function does
not escape periods (or any other symbol) in object names. In other words,
although its output often appears to be a valid Lua identifier, it is not
guaranteed.ReturnsstringThe full name of the Instance.Code SamplesThis code sample demonstrates the behavior of Instance:GetFullName().
It shows how the function behaves when called on an object not in the
DataModel hierarchy, and it also shows how the return value does not escape
special characters.Instance:GetFullName-- Create a simple hierarchy
local model = Instance.new("Model")
local part = Instance.new("Part")
part.Parent = model
local fire = Instance.new("Fire")
fire.Parent = part
print(fire:GetFullName()) --> Model.Part.Fire
model.Parent = workspace
print(fire:GetFullName()) --> Workspace.Model.Part.Fire
part.Name = "Hello, world"
print(fire:GetFullName()) --> Workspace.Model.Hello, world.FireThis code sample re-implements the Instance:GetFullName() function in
Lua.Instance:GetFullName Lua Implementationlocal function getFullName(object)
local result = object.Name
object = object.Parent
while object and object ~= game do
-- Prepend parent name
result = object.Name .. "." .. result
-- Go up the hierarchy
object = object.Parent
end
return result
end
print(getFullName(workspace.Camera)) --> Workspace.CameraGetPropertyChangedSignalRBXScriptSignalThis method returns an event that behaves exactly like the Changed
event, except that the event only fires when the given property changes.
It's generally a good idea to use this method instead of a connection to
Changed with a function that checks the property name. Subsequent calls
to this method on the same object with the same property name return the
same event.
print(object:GetPropertyChangedSignal("Name") == object:GetPropertyChangedSignal("Name")) --> always true
ValueBase objects, such as IntValue and
StringValue, use a modified Changed event that fires with the
contents of the Value property. As such, this method provides a way to
detect changes in other properties of those objects. For example, to
detect changes in the Name property of an IntValue, use
IntValue:GetPropertyChangedSignal("Name"):Connect(someFunc) since the
Changed event of IntValue objects only detect changes on the
Value property.Parametersproperty: stringThe property to connect to.ReturnsRBXScriptSignalA signal that fires whenever the property changes.Code SamplesThis code sample demonstrates how to save a value before a changed event fires
on it in order to get more information about a change.Old-to-New Values with Changedlocal part = Instance.new("Part")
local currentColor = part.BrickColor
local function onBrickColorChanged()
local newColor = part.BrickColor
print("Color changed from", currentColor.Name, "to", newColor.Name)
currentColor = newColor
end
part:GetPropertyChangedSignal("BrickColor"):Connect(onBrickColorChanged)
part.BrickColor = BrickColor.new("Really red")
part.BrickColor = BrickColor.new("Really blue")This code sample demonstrates the equivalence of the Changed event and event
returned by GetPropertyChangedSignal.Changed and GetPropertyChangedSignallocal part = Instance.new("Part")
local function onBrickColorChanged()
print("My color is now " .. part.BrickColor.Name)
end
local function onChanged(property)
if property == "BrickColor" then
onBrickColorChanged()
end
end
part:GetPropertyChangedSignal("BrickColor"):Connect(onBrickColorChanged)
part.Changed:Connect(onChanged)
-- Trigger some changes (because we connected twice,
-- both of these will cause two calls to onBrickColorChanged)
part.BrickColor = BrickColor.new("Really red")
part.BrickColor = BrickColor.new("Institutional white")GetTagsArrayWrite ParallelThis method returns an array of the tags applied to the given instance, as
strings. You can add tags either in Studio in the
Properties window or at runtime with
AddTag().
This method is useful when you want to do something with multiple tags on
an instance at once. However, it is inefficient to use this method to
check for the existence of a single tag; instead, use
HasTag() to check for a specific tag.ReturnsArrayHasTagbooleanWrite ParallelThis method returns true if the provided tag has been added to the
object. You can add tags either in Studio in the
Properties window or at runtime with
AddTag().Parameterstag: stringReturnsbooleanIsAbooleanCustom Lua StateWrite ParallelIsA returns true if the Instance's class is equivalent to or a
subclass of a given class. This function is similar to the
instanceof operators in other languages, and is a form of
type introspection. To
ignore class inheritance, test the ClassName
property directly instead. For checking native Lua data types (number,
string, etc) use the functions type and typeof.
Most commonly, this function is used to test if an object is some kind of
part, such as Part or WedgePart, which inherits from
BasePart (an abstract class). For example, if your goal is to
change all of a Character's limbs to the same
color, you might use GetChildren to iterate
over the children, then use IsA to filter non-BasePart objects
which lack the BrickColor property:
local function paintFigure(character, color)
-- Iterate over the child objects of the character
for _, child in pairs(character:GetChildren()) do
-- Filter out non-part objects, such as Shirt, Pants and Humanoid
-- R15 use MeshPart and R6 use Part, so we use BasePart here to detect both:
if child:IsA("BasePart") then
child.BrickColor = color
end
end
end
paintFigure(game.Players.Player.Character, BrickColor.new("Bright blue"))
Since all classes inherit from Instance, calling
object:IsA("Instance") will always return true.ParametersclassName: stringThe class against which the Instance's class will be checked.
Case-sensitive.ReturnsbooleanDescribes whether the Instance's class matched or is a subclass of the
given class.Code SamplesUsage of IsA to test class inheritance:Instance:IsAprint(workspace:IsA("Instance")) --> true
print(workspace:IsA("Workspace")) --> true
print(game:IsA("workspace")) --> false
print(game:IsA("DataModel")) --> trueIsAncestorOfbooleanWrite ParallelReturns true if an Instance is an ancestor of the given
descendant.
An Instance is considered the ancestor of an object if the
object's Instance.Parent or one of it's parent's
Instance.Parent is set to the Instance.
See also, Instance:IsDescendantOf().Parametersdescendant: InstanceThe descendant Instance.ReturnsbooleanTrue if the Instance is an ancestor of the given descendant.Code SamplesInstance:IsAncestorOfprint(workspace:IsAncestorOf(workspace.Player.HumanoidRootPart)) --> trueIsDescendantOfbooleanWrite ParallelReturns true if an Instance is a descendant of the given ancestor.
An Instance is considered the descendant of an object if the
Instance's parent or one of its parent's parent is set to the
object.
Note, DataModel is a descendant of nil. This means IsDescendantOf
cannot be used with a parameter of nil to check if an object has been
removed.
See also, Instance:IsAncestorOf().Parametersancestor: InstanceThe ancestor Instance.ReturnsbooleanTrue if the Instance is a descendant of the given ancestor.Code SamplesInstance:IsDescendantOflocal part = Instance.new("Part")
print(part:IsDescendantOf(game))
--> false
part.Parent = workspace
print(part:IsDescendantOf(game))
--> true
part.Parent = game
print(part:IsDescendantOf(game))
--> trueRemovevoidDEPRECATEDDEPRECATEDThis item is deprecated in favor of Instance:Destroy() and
Instance:ClearAllChildren(). If you must remove an object from the
game, and wish to use the object later, set its Parent property to nil
instead of using this method.The Remove function sets the object's Instance.Parent to nil, and
does the same for all its descendants.
If the object is referenced before being removed it is possible to
retrieve the object at a later point.ReturnsvoidCode SamplesThe following code demonstrates how a part can be re-added to the DataModel
after being removed:Instance:Removelocal part = Instance.new("Part")
part.Parent = workspace
print(part.Parent) --> Workspace
part:Remove()
print(part.Parent) --> nil
part.Parent = workspace
print(part.Parent) --> WorkspaceRemoveTagvoidThis method removes a tag from an instance. It will not throw an error if
the object does not have the tag. Successfully removing a tag will fire a
signal created by CollectionService:GetInstanceRemovedSignal()
with the given tag.
Note that when tagging an instance, it's common that some resources are
used to give the tag its functionality, for example event connections or
tables. To prevent memory leaks, it's a good idea to clean these up
(disconnect, set to nil, etc.) when no longer needed for a tag.Parameterstag: stringReturnsvoidSetAttributevoidThis function sets the attribute with the given name to the given value.
If the value given is nil, then the attribute will be removed (since nil
is returned by default).
For example, the following code snippet will set the instance's
InitialPosition attribute to Vector3.new(0, 0, 0).
Note that this code sample does not define Instance:
instance:SetAttribute("InitialPosition", Vector3.new(0, 0, 0))
Limitations
Naming requirements and restrictions:
Names must only use alphanumeric characters and underscore
No spaces or unique symbols are allowed
Strings must be 100 characters or less
Names are not allowed to start with RBX unless the caller is a Roblox
core-script (reserved for Roblox)
When attempting to set an attribute to an unsupported type, an error will
be thrown.
See also:
Instance:GetAttribute(), returns the attribute which has been
assigned to the given name
Instance:GetAttributes(), returns a dictionary of string →
variant pairs for each of the instance's attributes
Instance.AttributeChanged, fires whenever an attribute is
changed on the instance
Instance:GetAttributeChangedSignal(), returns an event that
fires when the given attribute changes
Parametersattribute: stringThe name of the attribute being set.value: VariantThe value that the specified attribute is being set to.ReturnsvoidWaitForChildInstanceCustom Lua StateCan YieldReturns the child of the Instance with the given name. If the
child does not exist, it will yield the current thread until it does. If
the timeOut parameter is specified, this method will time out after the
specified number of seconds and return nil.
Primary Usage
WaitForChild() is extremely important when
working on code run by the client in a LocalScript. The Roblox
engine does not guarantee the time or order in which objects are
replicated from the server to the client. Additionally, if an experience
has Workspace.StreamingEnabled set to true,
BaseParts that are far away from the player's character
may not be streamed to the client, potentially causing scripts to break
when indexing objects that do not yet exist on the client.
Notes
This function does not yield if a child with the given name exists when
the call is made.
Instance:FindFirstChild() is a more efficient alternative to
WaitForChild() for objects that are
assumed to exist.
If a call to this method exceeds 5 seconds without returning, and no
timeOut parameter has been specified, a warning will be printed to the
output that the thread may yield indefinitely. This warning takes the
following form where X is the parent's name and Y is the child's
name:
Infinite yield possible on 'X:WaitForChild("Y")'
ParameterschildName: stringThe Instance.Name to be looked for.timeOut: numberAn optional time out parameter.ReturnsInstanceThe Instance found.Code SamplesThe following code waits for an instance named "Part" to be added to
Workspace.Instance:WaitForChildlocal part = workspace:WaitForChild("Part")
print(part.Name .. " has been added to the Workspace")childrenObjectsDEPRECATEDDEPRECATEDThis item has been superseded by Instance:GetChildren() which
should be used in all new work.The children function returns an array of the object's children.ReturnsObjectsArray of child objects/instances.cloneInstanceDEPRECATEDDEPRECATEDThis deprecated function is a variant of Instance:Clone() which
should be used instead.ReturnsInstancedestroyvoidDEPRECATEDDEPRECATEDThis deprecated function is a variant of Instance:Destroy() which
should be used instead.ReturnsvoidfindFirstChildInstanceDEPRECATEDDEPRECATEDThis deprecated function is a variant of Instance:FindFirstChild()
which should be used instead.Parametersname: stringrecursive: booleanDefault Value: falseReturnsInstancegetChildrenObjectsDEPRECATEDDEPRECATEDThis deprecated function is a variant of Instance:GetChildren()
which should be used instead.ReturnsObjectsisAbooleanDEPRECATEDCustom Lua StateDEPRECATEDThis deprecated function is a variant of Instance:IsA() which
should be used instead.ParametersclassName: stringReturnsbooleanisDescendantOfbooleanDEPRECATEDDEPRECATEDThis deprecated function is a variant of Instance:IsDescendantOf()
which should be used instead.Parametersancestor: InstanceReturnsbooleanremovevoidDEPRECATEDDEPRECATEDThis deprecated function is a variant of Instance:Remove() which
has also been deprecated. Neither function should be used in new work.ReturnsvoidEventsButton1DownThe Button1Down even fires when the player presses their left mouse
button.
This can also be accessed from a Tool. For example, when placed in
a LocalScript, the code below prints Button1Down whenever the left
mouse button is pressed:
local Tool = script.Parent --make sure this is a Tool object
Tool.Equipped:Connect(function(Mouse)
Mouse.Button1Down:Connect(function()
print("Button1Down")
end)
end)
Developers can find out the position of the mouse in world-space, and if
it is pointing at any BasePart, using the Mouse.Hit and
Mouse.Target properties.
For information on how to obtain the mouse object, please see the
Mouse page.
Note, developers are recommended to use UserInputService instead
of the Mouse object in new work.Code SamplesThe following code sample, when placed in StarterPlayerScripts will create a
tool in the player's backpack that, once equipped, will change the
BasePart.BrickColor of every BasePart the player clicks on.Color Randomizer Toollocal Players = game:GetService("Players")
local localPlayer = Players.LocalPlayer
local backpack = localPlayer:WaitForChild("Backpack")
local tool = Instance.new("Tool")
tool.RequiresHandle = false
tool.CanBeDropped = false
tool.Parent = backpack
tool.Equipped:Connect(function(mouse)
mouse.Button1Down:Connect(function()
if mouse.Target and mouse.Target.Parent then
mouse.Target.BrickColor = BrickColor.random()
end
end)
end)Button1UpFires when the left mouse button is released.
For information on how to obtain the Mouse object, please see the
Mouse page.
Developers can find out the position of the mouse in world-space, and if
it is pointing at any BasePart using the Mouse.Hit and
Mouse.Target properties.
Note, developers are recommended to use UserInputService instead
of the Mouse object in new work.Code SamplesThe follow example changes the BasePart.BrickColor of every BasePart
the player clicks and releases their mouse on.
In order for a part to change color, the player's mouse must be over the part
both when the player presses their left mouse button down and when the player
releases their left mouse button.Color Randomizer Tool (Button1Up)local Players = game:GetService("Players")
local player = Players.LocalPlayer
local mouse = player:GetMouse()
local target = nil
local function button1Down()
target = mouse.Target
end
local function button1Up()
if target == mouse.Target then
target.BrickColor = BrickColor.random()
end
end
mouse.Button1Down:Connect(button1Down)
mouse.Button1Up:Connect(button1Up)Button2DownThe Button2Down even fires when the player presses their right mouse
button.
This can also be accessed from a Tool. For example, when placed in
a LocalScript, the code below prints Button2Down whenever the
right mouse button is pressed:
local Tool = script.Parent --make sure this is a Tool object
Tool.Equipped:Connect(function(Mouse)
Mouse.Button2Down:Connect(function()
print("Button2Down")
end)
end).
Developers can find out the position of the mouse in world-space, and if
it is pointing at any BasePart, using the Mouse.Hit and
Mouse.Target properties.
For information on how to obtain the mouse object, please see the
Mouse page.
Note, developers are recommended to use UserInputService instead
of the Mouse object in new work.Code SamplesThe following code sample, when placed in StarterPlayerScripts will create a
tool in the player's backpack that, once equipped, will change the
BasePart.BrickColor of every BasePart the player clicks on.Color Randomizer Toollocal Players = game:GetService("Players")
local localPlayer = Players.LocalPlayer
local backpack = localPlayer:WaitForChild("Backpack")
local tool = Instance.new("Tool")
tool.RequiresHandle = false
tool.CanBeDropped = false
tool.Parent = backpack
tool.Equipped:Connect(function(mouse)
mouse.Button2Down:Connect(function()
if mouse.Target and mouse.Target.Parent then
mouse.Target.BrickColor = BrickColor.random()
end
end)
end)Button2UpFired when the right mouse button is released.
mouse.Button2Up:Connect(function()
print("button 2 up!")
end
For information on how to obtain the Mouse object, please see the
Mouse page.
Developers can find out the position of the mouse in world-space, and if
it is pointing at any BasePart using the Mouse.Hit and
Mouse.Target properties.
Note, developers are recommended to use UserInputService instead
of the Mouse object in new work.Code SamplesThe follow example changes the BasePart.BrickColor of every BasePart
the player clicks and releases their right mouse button on.
In order for a part to change color, the player's mouse must be over the part
both when the player presses their right mouse button down and when the player
releases their right mouse button.Color Randomizer Tool (Button2Up)local Players = game:GetService("Players")
local mouse = Players.LocalPlayer:GetMouse()
local target = nil
mouse.Button2Down:Connect(function()
target = mouse.Target
end)
mouse.Button2Up:Connect(function()
if target == mouse.Target then
target.BrickColor = BrickColor.random()
end
end)IdleFired during every heartbeat that the mouse isn't being passed to another
mouse event.
Note, this event should not be used to determine when the mouse is still.
As it fires every heartbeat it will fire between Mouse.Move
events.
For information on how to obtain the Mouse object, please see the
Mouse page.
Developers can find out the position of the mouse in world-space, and if
it is pointing at any BasePart using the Mouse.Hit and
Mouse.Target properties.
Note, developers are recommended to use UserInputService instead
of the Mouse object in new work.Code SamplesThis example demonstrates how mouse events are passed during each frameMouse.Idlelocal Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local player = Players.LocalPlayer
local mouse = player:GetMouse()
local events = {
"Button1Down",
"Button1Up",
"Button2Down",
"Button2Up",
"Idle",
"Move",
"WheelBackward",
"WheelForward",
"KeyDown",
"KeyUp",
}
local currentEvent
local frame = 0
local function processInput()
frame = frame + 1
print("Frame", frame, "- mouse event was passed to", currentEvent)
end
for _, event in pairs(events) do
mouse[event]:Connect(function()
currentEvent = event
end)
end
RunService:BindToRenderStep("ProcessInput", Enum.RenderPriority.Input.Value, processInput)MoveFired when the mouse is moved.
Note, this event is fired when the mouse's position is updated, therefore
it will fire repeatedly while being moved.
For information on how to obtain the Mouse object, please see the
Mouse page.
Developers can find out the position of the mouse in world-space, and if
it is pointing at any BasePart using the Mouse.Hit and
Mouse.Target properties.
mouse.Move:Connect(function()
local position = mouse.Hit.p
local target = mouse.Target
print(target, position)
end)
Note, developers are recommended to use UserInputService instead
of the Mouse object in new work.Code SamplesThe example below allows the local player to move
parts with their mouse.
When the player presses their left mouse button over a part, that part is the
mouse's target and becomes the point. Until the player
releases their left mouse button, that part will move to the mouse's world
position when the player moves their mouse.
Note that the Mouse.TargetFilter property allows the code to ignore
the part being moved when determining the mouse's world position.
The code should work as expected when placed in a LocalScript.Move Parts with the Mouselocal Players = game:GetService("Players")
local player = Players.LocalPlayer
local mouse = player:GetMouse()
local point
local down
local function selectPart()
if mouse.Target and not mouse.Target.Locked then
point = mouse.Target
mouse.TargetFilter = point
down = true
end
end
local function movePart()
if down and point then
local posX, posY, posZ = mouse.Hit.X, mouse.Hit.Y, mouse.Hit.Z
point.Position = Vector3.new(posX, posY, posZ)
end
end
local function deselectPart()
down = false
point = nil
mouse.TargetFilter = nil
end
mouse.Button1Down:Connect(selectPart)
mouse.Button1Up:Connect(deselectPart)
mouse.Move:Connect(movePart)WheelBackwardThe WheelBackward event fires when the mouse wheel is scrolled backwards.
Possible uses for this event include toggling a gun's scope in a first
person shooter (FPS) or zooming the player's camera.
This can be used alongside the scrolling forward event,
Mouse.WheelForward.
For information on how to obtain the Mouse object, please see the
Mouse page.
Note, developers are recommended to use UserInputService instead
of the Mouse object in new work.Code SamplesThe below example assumes that you have already got the player's mouse (and
set it as a variable named 'mouse'), whether by use of a Tool,
HopperBin or the Player:GetMouse() method. It will print
"Wheel went backwards!" when the player scrolls backwards.Mouse.WheelBackwardlocal Players = game:GetService("Players")
local player = Players.LocalPlayer
local mouse = player:GetMouse()
local function onWheelBackward()
print("Wheel went backwards!")
end
mouse.WheelBackward:Connect(onWheelBackward)WheelForwardThe WheelForward event fires when the mouse wheel is scrolled forwards.
Possible uses for this event include toggling a gun's scope in a first
person shooter (FPS) or zooming the player's camera.
This can be used alongside the scrolling backward event,
Mouse.WheelBackward.
For information on how to obtain the Mouse object, please see the
Mouse page.
Note, developers are recommended to use UserInputService instead
of the Mouse object in new work.Code SamplesThe below example assumes that you have already got the player's mouse (and
set it as a variable named 'mouse'), whether by use of a Tool, HopperBin
or the Player:GetMouse() method. It will print "Wheel went forward!"
when the player scrolls forwards.Mouse.WheelForwardlocal Players = game:GetService("Players")
local player = Players.LocalPlayer
local mouse = player:GetMouse()
local function onWheelBackward()
print("Wheel went forward!")
end
mouse.WheelForward:Connect(onWheelBackward)Events inherited from InstanceAncestryChangedFires when the Instance.Parent property of the object or one of
its ancestors is changed.
This event includes two parameters, child and parent. Child refers
to the Instance whose Instance.Parent was actually
changed. Parent refers to this Instance's new
Instance.Parent.
You can use this event to track the deletion of an instance in Studio,
such as manual deletion in the Explorer or through a plugin. If you need
to detect when an instance is destroyed using Instance:Destroy(),
use the Instance.Destroying event instead.Parameterschild: InstanceThe Instance whose Instance.Parent has been changed.parent: InstanceThe new Instance.Parent of the Instance whose
Instance.Parent was changed.Code SamplesThe below example would print "Part is now a child of Model".Instance.AncestryChangedlocal part = Instance.new("Part")
part.Parent = workspace
local function onAncestryChanged(child, parent)
print(child.Name .. " is now a child of " .. parent.Name)
end
part.AncestryChanged:Connect(onAncestryChanged)
part.Parent = workspace.ModelAttributeChangedThis event fires whenever an attribute is changed on the instance. This
includes when an attribute is set to nil. The name of the attribute that
has been changed is passed to the connected function.
For example, the following code snippet will connect the
AttributeChanged function to fire whenever one of Instance's
attributes changes. Note that this code sample does not define
Instance:
local function attributeChanged(attributeName)
print(attributeName, "changed")
end
instance.AttributeChanged:Connect(attributeChanged)
See also:
Instance:SetAttribute(), sets the attribute with the given name
to the given value
Instance:GetAttribute(), returns the attribute which has been
assigned to the given name
Instance:GetAttributes(), returns a dictionary of string →
variant pairs for each of the instance's attributes
Instance:GetAttributeChangedSignal(), returns an event that
fires when the given attribute changes
Parametersattribute: stringThe name of the attribute that has been changed.ChangedThe Changed event fires right after most properties change on objects. It
is possible to find the present value of a changed property by using
object[property]. To get the value of a property before it changes, you
must have stored the value of the property before it changed.
If you are only interested in listening to the change of a specific
property, consider using the GetPropertyChangedSignal method instead to
get an event that only fires when a given property changes.
This event does not fire for physics-related changes, like when the
CFrame, Velocity, RotVelocity, Position, Orientation
and CFrame properties of a BasePart change due to
gravity. To detect changes in these properties, consider using a
physics-based event like RunService.Stepped or
BasePart.Touched. A while-true-do loop can also work.
For "-Value" objects, this event behaves differently: it only fires when
the Value property changes. See individual pages for IntValue,
StringValue, etc for more information. To detect other changes in
these objects, you must use GetPropertyChangedSignal instead.Parametersproperty: stringThe name of the property that changed.Code SamplesThis sample demonstrates the subtleties of the Changed event on normal objects
and "-Value" objects.Changed Event-- Demonstrate the Changed event by creating a Part
local part = Instance.new("Part")
part.Changed:Connect(print)
-- This fires Changed with "Transparency"
part.Transparency = 0.5
-- Similarly, this fires Changed with "Number"
part.Name = "SomePart"
-- Since changing BrickColor will also change other
-- properties at the same time, this line fires Changed
-- with "BrickColor", "Color3" and "Color3uint16".
part.BrickColor = BrickColor.Red()
-- A NumberValue holds a double-precision floating-point number
local vNumber = Instance.new("NumberValue")
vNumber.Changed:Connect(print)
-- This fires Changed with 123.456 (not "Value")
vNumber.Value = 123.456
-- This does not fire Changed
vNumber.Name = "SomeNumber"
-- A StringValue stores one string
local vString = Instance.new("StringValue")
vString.Changed:Connect(print)
-- This fires Changed with "Hello" (not "Value")
vString.Value = "Hello"This code sample demonstrates the Changed event firing within a parent object.Change Detectorlocal object = script.Parent
local function onChanged(property)
-- Get the current value of the property
local value = object[property]
-- Print a message saying what changed
print(object:GetFullName() .. "." .. property .. " (" .. typeof(value) .. ") changed to " .. tostring(value))
end
object.Changed:Connect(onChanged)
-- Trigger a simple change in the object (add an underscore to the name)
object.Name = "_" .. object.NameChildAddedFires after an object is parented to this Instance.
Note, when using this function on a client to detect objects created by
the server it is necessary to use Instance:WaitForChild() when
indexing these object's descendants. This is because the object and its
descendants are not guaranteed to replicate from the server to the client
simultaneously. For example:
workspace.ChildAdded:Connect(function(child)
-- need to use WaitForChild as descendants may not have replicated yet
local head = child:WaitForChild("Head")
end)
Note, this function only works for immediate children of the
Instance. For a function that captures all descendants, use
Instance.DescendantAdded.
See also, Instance.ChildRemoved.Parameterschild: InstanceThe Instance that has been added.Code SamplesThis snippet prints the names of objects as they are added to the Workspace:Instance.ChildAddedlocal function onChildAdded(instance)
print(instance.Name .. " added to the workspace")
end
workspace.ChildAdded:Connect(onChildAdded)
local part = Instance.new("Part")
part.Parent = workspace --> Part added to the WorkspaceChildRemovedFires after a child is removed from this Instance.
Removed refers to when an object's parent is changed from this
Instance to something other than this Instance. Note, this
event will also fire when a child is destroyed (using
Instance:Destroy()) as the destroy function sets an object's
parent to nil.
This function only works for immediate children of the Instance.
For a function that captures all descendants, use
Instance.DescendantRemoving.
See also Instance.ChildAdded.Parameterschild: InstanceThe Instance that has been removed.Code SamplesThis snippet prints the names of objects as they are removed from the
Workspace:Instance.ChildRemovedlocal function onChildRemoved(instance)
print(instance.Name .. " removed from the workspace")
end
workspace.ChildRemoved:Connect(onChildRemoved)
local part = Instance.new("Part")
part.Parent = workspace
task.wait(2)
part:Destroy()DescendantAddedThe DescendantAdded event fires after a descendant is added to the
Instance.
As DescendantAdded fires for every descendant, parenting an object to the
Instance will fire the event for this object and all of its
descendants individually.
Developers only concerned with the immediate children of the
Instance should use Instance.ChildAdded instead.
See also Instance.DescendantRemoving.Parametersdescendant: InstanceThe Instance that has been added.Code SamplesThis following example will print the name of any object that is added to the
Workspace:Instance.DescendantAddedlocal function onDescendantAdded(descendant)
print(descendant)
end
workspace.DescendantAdded:Connect(onDescendantAdded)
local part = Instance.new("Part")
part.Parent = workspaceDescendantRemovingDescendantRemoving fires immediately before the
Parent of a descendant of the Instance
changes such that the object is no longer a descendant of the Instance.
Destroy and Remove
change an object's Parent to nil, so calling these on a descendant of an
object will therefore cause this event to fire.
Since this event fires before the descendant's removal, the Parent of the
descendant will be unchanged, i.e., it will still be a descendant at the
time of this event firing. If the descendant is also a child of the
object, It will also fire before ChildRemoved. There is no similar event
called "DescendantRemoved".
If a descendant has children, this event fires with the descendant first
followed by its descendants.
Example
The example below should help clarify how DescendantRemoving fires when
there are several objects involved.
Calling Remove on PartA would cause
DescendantRemoving to fire on both ModelA and Model, in that
order.
Setting the Parent of PartA to ModelB
would cause DescendantRemoving to fire on ModelA but not Model
(as Model would still be an ancestor of PartA).
Calling Destroy on ModelA would cause
DescendantRemoving to fire multiple times on several objects:
On Model with ModelA, PartA then FireA.
On ModelA, with PartA then FireA.
On PartA with FireA.
Warning
This event fires with the descendant object that is being removed.
Attempting to set the Parent of the descendant
being removed to something else will fail with the following warning:
"Something unexpectedly tried to set the parent of X to Y while trying to
set the parent of X. Current parent is Z", where X is the removing
descendant, Y is the ignored parent setting, and Z is the original parent
of X. Below is an example that demonstrates this:
workspace.DescendantRemoving:Connect(function(descendant)
-- Don't manipulate the parent of descendant in this function!
-- This event fires BECAUSE the parent of descendant was manipulated,
-- and the change hasn't happened yet, i.e. this function fires before that happens.
-- Therefore, it is problematic to change the parent like this:
descendant.Parent = game
end)
local part = Instance.new("Part")
part.Parent = workspace
part.Parent = nil -- This triggers DescendantRemoving on Workspace:
--> Something unexpectedly tried to set the parent of Part to NULL while trying to set the parent of Part. Current parent is Workspace.
See also DescendantAdded.Parametersdescendant: InstanceThe Instance that is being removed.Code SamplesThe following example prints the name of any descendant as it is being removed
from the Workspace:Instance.DescendantRemovingworkspace.DescendantRemoving:Connect(function(descendant)
print(descendant.Name .. " is currently parented to " .. tostring(descendant.Parent))
end)
local part = Instance.new("Part")
part.Parent = workspace
part.Parent = nil
--> Part is currently parented to Workspace
print(part.Parent)
--> nilDestroyingThe Destroying event fires immediately before the Instance or one of its
ancestors is destroyed with Instance.Destroy().
The Instance will never be deleted from memory while a connected function
is still using it. However, if the function yields at any point, the
Instance and its descendants will be parented to nil.
When deleting an instance in Studio, such as manually deleting through the
Explorer or through a plugin, the instance isn't destroyed. Instead, the
parent is set to nil which you can track with
Instance.AncestryChanged.Code SamplesThis sample demonstrates how an Instance being destroyed remains in place
until the connected function yields.Using the Destroying Eventlocal part = Instance.new("Part", workspace)
local function onPartDestroying()
print("Before yielding:", part:GetFullName(), #part:GetChildren())
task.wait()
print("After yielding:", part:GetFullName(), #part:GetChildren())
end
part.Destroying:Connect(onPartDestroying)
part:Destroy()childAddedDEPRECATEDDEPRECATEDThis deprecated event is a variant of Instance.ChildAdded which
should be used instead.Parameterschild: Instance