MouseService ============ Not Creatable Service Not Replicated Summary ------- ### Properties Properties inherited from Instance [](#Archivable)Archivable: [boolean](/docs/luau/booleans) Determines if an [Instance](/docs/reference/engine/classes/Instance) can be cloned using [Instance:Clone()](/docs/reference/engine/classes/Instance#Clone) or saved to file. [](#ClassName)ClassName: [string](/docs/luau/strings) A read-only string representing the class this [Instance](/docs/reference/engine/classes/Instance) belongs to. READ ONLY NOT REPLICATED [](#Name)Name: [string](/docs/luau/strings) A non-unique identifier of the [Instance](/docs/reference/engine/classes/Instance). [](#Parent)Parent: [Instance](/docs/reference/engine/classes/Instance) Determines the hierarchical parent of the [Instance](/docs/reference/engine/classes/Instance). NOT REPLICATED [](#RobloxLocked)RobloxLocked: [boolean](/docs/luau/booleans) A deprecated property that used to protect [CoreGui](/docs/reference/engine/classes/CoreGui) objects. HIDDEN [](#archivable)archivable: [boolean](/docs/luau/booleans) HIDDEN NOT REPLICATED DEPRECATED [](#className)className: [string](/docs/luau/strings) READ ONLY NOT REPLICATED DEPRECATED ### Methods Methods inherited from Instance [](#AddTag)AddTag(tag: [string](/docs/luau/strings)): void   * * * Applies a tag to the instance. [](#ClearAllChildren)ClearAllChildren(): void   * * * This function destroys all of an [Instance](/docs/reference/engine/classes/Instance)'s children. [](#Clone)Clone(): [Instance](/docs/reference/engine/classes/Instance)   * * * Create a copy of an object and all its descendants, ignoring objects that are not [Archivable](/docs/reference/engine/classes/Instance#Archivable). [](#Destroy)Destroy(): void   * * * Sets the [Instance.Parent](/docs/reference/engine/classes/Instance#Parent) property to nil, locks the [Instance.Parent](/docs/reference/engine/classes/Instance#Parent) property, disconnects all connections, and calls Destroy on all children. [](#FindFirstAncestor)FindFirstAncestor(name: [string](/docs/luau/strings)): [Instance](/docs/reference/engine/classes/Instance)   * * * Returns the first ancestor of the [Instance](/docs/reference/engine/classes/Instance) whose [Instance.Name](/docs/reference/engine/classes/Instance#Name) is equal to the given name. [](#FindFirstAncestorOfClass)FindFirstAncestorOfClass(className: [string](/docs/luau/strings)): [Instance](/docs/reference/engine/classes/Instance)   * * * Returns the first ancestor of the [Instance](/docs/reference/engine/classes/Instance) whose [Instance.ClassName](/docs/reference/engine/classes/Instance#ClassName) is equal to the given className. [](#FindFirstAncestorWhichIsA)FindFirstAncestorWhichIsA(className: [string](/docs/luau/strings)): [Instance](/docs/reference/engine/classes/Instance)   * * * Returns the first ancestor of the [Instance](/docs/reference/engine/classes/Instance) for whom [Instance:IsA()](/docs/reference/engine/classes/Instance#IsA) returns true for the given className. [](#FindFirstChild)FindFirstChild(name: [string](/docs/luau/strings), recursive: [boolean](/docs/luau/booleans)): [Instance](/docs/reference/engine/classes/Instance)   * * * Returns the first child of the [Instance](/docs/reference/engine/classes/Instance) found with the given name. [](#FindFirstChildOfClass)FindFirstChildOfClass(className: [string](/docs/luau/strings)): [Instance](/docs/reference/engine/classes/Instance)   * * * Returns the first child of the [Instance](/docs/reference/engine/classes/Instance) whose [ClassName](/docs/reference/engine/classes/Instance#ClassName) is equal to the given className. [](#FindFirstChildWhichIsA)FindFirstChildWhichIsA(className: [string](/docs/luau/strings), recursive: [boolean](/docs/luau/booleans)): [Instance](/docs/reference/engine/classes/Instance)   * * * Returns the first child of the [Instance](/docs/reference/engine/classes/Instance) for whom [Instance:IsA()](/docs/reference/engine/classes/Instance#IsA) returns true for the given className. [](#FindFirstDescendant)FindFirstDescendant(name: [string](/docs/luau/strings)): [Instance](/docs/reference/engine/classes/Instance)   * * * Returns the first descendant found with the given [Instance.Name](/docs/reference/engine/classes/Instance#Name). [](#GetActor)GetActor(): [Actor](/docs/reference/engine/classes/Actor)   * * * Returns the [Actor](/docs/reference/engine/classes/Actor) associated with the Instance, if any. [](#GetAttribute)GetAttribute(attribute: [string](/docs/luau/strings)): Variant   * * * Returns the attribute which has been assigned to the given name. [](#GetAttributeChangedSignal)GetAttributeChangedSignal(attribute: [string](/docs/luau/strings)): [RBXScriptSignal](/docs/reference/engine/datatypes/RBXScriptSignal)   * * * Returns an event that fires when the given attribute changes. [](#GetAttributes)GetAttributes(): [table](/docs/luau/tables)   * * * Returns a dictionary of string → variant pairs for each of the [Instance](/docs/reference/engine/classes/Instance)'s attributes. [](#GetChildren)GetChildren(): [Objects](/docs/luau/tuples)   * * * Returns an array containing all of the [Instance](/docs/reference/engine/classes/Instance)'s children. [](#GetDebugId)GetDebugId(scopeLength: [number](/docs/luau/numbers)): [string](/docs/luau/strings)  NOT BROWSABLE * * * Returns a coded string of the [Instance](/docs/reference/engine/classes/Instance)s DebugId used internally by Roblox. [](#GetDescendants)GetDescendants(): [Array](/docs/luau/tables)  CUSTOM LUA STATE * * * Returns an array containing all of the descendants of the instance. [](#GetFullName)GetFullName(): [string](/docs/luau/strings)   * * * Returns a string describing the [Instance](/docs/reference/engine/classes/Instance)'s ancestry. [](#GetPropertyChangedSignal)GetPropertyChangedSignal(property: [string](/docs/luau/strings)): [RBXScriptSignal](/docs/reference/engine/datatypes/RBXScriptSignal)   * * * Get an event that fires when a given property of an object changes. [](#GetTags)GetTags(): [Array](/docs/luau/tables)   * * * Gets an array of all tags applied to the instance. [](#HasTag)HasTag(tag: [string](/docs/luau/strings)): [boolean](/docs/luau/booleans)   * * * Check whether the instance has a given tag. [](#IsA)IsA(className: [string](/docs/luau/strings)): [boolean](/docs/luau/booleans)  CUSTOM LUA STATE * * * Returns true if an [Instance](/docs/reference/engine/classes/Instance)'s class matches or inherits from a given class. [](#IsAncestorOf)IsAncestorOf(descendant: [Instance](/docs/reference/engine/classes/Instance)): [boolean](/docs/luau/booleans)   * * * Returns true if an [Instance](/docs/reference/engine/classes/Instance) is an ancestor of the given descendant. [](#IsDescendantOf)IsDescendantOf(ancestor: [Instance](/docs/reference/engine/classes/Instance)): [boolean](/docs/luau/booleans)   * * * Returns true if an [Instance](/docs/reference/engine/classes/Instance) is a descendant of the given ancestor. [](#Remove)Remove(): void  DEPRECATED * * * Sets the object's Parent to nil, and does the same for all its descendants. [](#RemoveTag)RemoveTag(tag: [string](/docs/luau/strings)): void   * * * Removes a tag from the instance. [](#SetAttribute)SetAttribute(attribute: [string](/docs/luau/strings), value: Variant): void   * * * Sets the attribute with the given name to the given value. [](#WaitForChild)WaitForChild(childName: [string](/docs/luau/strings), timeOut: [number](/docs/luau/numbers)): [Instance](/docs/reference/engine/classes/Instance)  CUSTOM LUA STATE, CAN YIELD * * * Returns the child of the [Instance](/docs/reference/engine/classes/Instance) with the given name. If the child does not exist, it will yield the current thread until it does. [](#children)children(): [Objects](/docs/luau/tuples)  DEPRECATED * * * Returns an array of the object's children. [](#clone)clone(): [Instance](/docs/reference/engine/classes/Instance)  DEPRECATED * * * [](#destroy)destroy(): void  DEPRECATED * * * [](#findFirstChild)findFirstChild(name: [string](/docs/luau/strings), recursive: [boolean](/docs/luau/booleans)): [Instance](/docs/reference/engine/classes/Instance)  DEPRECATED * * * [](#getChildren)getChildren(): [Objects](/docs/luau/tuples)  DEPRECATED * * * [](#isA)isA(className: [string](/docs/luau/strings)): [boolean](/docs/luau/booleans)  DEPRECATED, CUSTOM LUA STATE * * * [](#isDescendantOf)isDescendantOf(ancestor: [Instance](/docs/reference/engine/classes/Instance)): [boolean](/docs/luau/booleans)  DEPRECATED * * * [](#remove)remove(): void  DEPRECATED * * * ### Events Events inherited from Instance [](#AncestryChanged)AncestryChanged(child: [Instance](/docs/reference/engine/classes/Instance), parent: [Instance](/docs/reference/engine/classes/Instance)): [RBXScriptSignal](/docs/reference/engine/datatypes/RBXScriptSignal)   * * * Fires when the [Instance.Parent](/docs/reference/engine/classes/Instance#Parent) property of the object or one of its ancestors is changed. [](#AttributeChanged)AttributeChanged(attribute: [string](/docs/luau/strings)): [RBXScriptSignal](/docs/reference/engine/datatypes/RBXScriptSignal)   * * * Fires whenever an attribute is changed on the [Instance](/docs/reference/engine/classes/Instance). [](#Changed)Changed(property: [string](/docs/luau/strings)): [RBXScriptSignal](/docs/reference/engine/datatypes/RBXScriptSignal)   * * * Fired immediately after a property of an object changes. [](#ChildAdded)ChildAdded(child: [Instance](/docs/reference/engine/classes/Instance)): [RBXScriptSignal](/docs/reference/engine/datatypes/RBXScriptSignal)   * * * Fires after an object is parented to this [Instance](/docs/reference/engine/classes/Instance). [](#ChildRemoved)ChildRemoved(child: [Instance](/docs/reference/engine/classes/Instance)): [RBXScriptSignal](/docs/reference/engine/datatypes/RBXScriptSignal)   * * * Fires after a child is removed from this [Instance](/docs/reference/engine/classes/Instance). [](#DescendantAdded)DescendantAdded(descendant: [Instance](/docs/reference/engine/classes/Instance)): [RBXScriptSignal](/docs/reference/engine/datatypes/RBXScriptSignal)   * * * Fires after a descendant is added to the [Instance](/docs/reference/engine/classes/Instance). [](#DescendantRemoving)DescendantRemoving(descendant: [Instance](/docs/reference/engine/classes/Instance)): [RBXScriptSignal](/docs/reference/engine/datatypes/RBXScriptSignal)   * * * Fires immediately before a descendant of the [Instance](/docs/reference/engine/classes/Instance) is removed. [](#Destroying)Destroying(): [RBXScriptSignal](/docs/reference/engine/datatypes/RBXScriptSignal)   * * * Fires immediately before the instance is destroyed via [Instance:Destroy()](/docs/reference/engine/classes/Instance#Destroy). [](#childAdded)childAdded(child: [Instance](/docs/reference/engine/classes/Instance)): [RBXScriptSignal](/docs/reference/engine/datatypes/RBXScriptSignal)  DEPRECATED * * * Properties ---------- Properties inherited from Instance ### Archivable [boolean](/docs/luau/booleans) [Read Parallel](/docs/scripting/multithreading) This property determines whether an [object](/docs/reference/engine/classes/Instance) should be included when the game is published or saved, or when [Instance:Clone()](/docs/reference/engine/classes/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()) --> nil ### ClassName [string](/docs/luau/strings) Read Only Not Replicated [Read Parallel](/docs/scripting/multithreading) A read-only string representing the class this [Instance](/docs/reference/engine/classes/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()](/docs/reference/engine/classes/Instance#IsA) or [Instance:FindFirstChildOfClass()](/docs/reference/engine/classes/Instance#FindFirstChildOfClass). Note this property is read only and cannot be altered by scripts. Developers wishing to change an [Instance](/docs/reference/engine/classes/Instance)'s class will instead have to create a new [Instance](/docs/reference/engine/classes/Instance). Unlike [Instance:IsA()](/docs/reference/engine/classes/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 end ### Name [string](/docs/luau/strings) [Read Parallel](/docs/scripting/multithreading) A non-unique identifier of the [Instance](/docs/reference/engine/classes/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()](/docs/reference/engine/classes/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()](/docs/reference/engine/classes/Instance#GetFullName). ### Parent [Instance](/docs/reference/engine/classes/Instance) Not Replicated [Read Parallel](/docs/scripting/multithreading) The Parent property determines the hierarchical parent of the [Instance](/docs/reference/engine/classes/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](/docs/reference/engine/classes/Instance) are the children of that object, plus the descendants of the children as well. * The ancestors of an [Instance](/docs/reference/engine/classes/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](/docs/reference/engine/classes/Instance#GetChildren) and [FindFirstChild](/docs/reference/engine/classes/Instance#FindFirstChild). The [Remove](/docs/reference/engine/classes/Instance#Remove) function sets this property to nil. Calling [Destroy](/docs/reference/engine/classes/Instance#Destroy) will set the Parent of an [Instance](/docs/reference/engine/classes/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](/docs/reference/engine/classes/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](/docs/reference/engine/classes/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()](/docs/reference/engine/datatypes/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](/docs/reference/engine/classes/Model) whose parent hasn't been set yet, then setting the parent first would not matter as the model would not have replicated yet. ### RobloxLocked [boolean](/docs/luau/booleans) Hidden Plugin Security [Read Parallel](/docs/scripting/multithreading) This property used to protect objects in the [CoreGui](/docs/reference/engine/classes/CoreGui) service from being altered by users in an unauthorized manner. It has been deprecated and does not do anything. ### archivable [boolean](/docs/luau/booleans) Hidden Not Replicated DEPRECATED [Read Parallel](/docs/scripting/multithreading) DEPRECATED This deprecated property is a variant of [Instance.Archivable](/docs/reference/engine/classes/Instance#Archivable) which should be used instead. ### className [string](/docs/luau/strings) Read Only Not Replicated DEPRECATED [Read Parallel](/docs/scripting/multithreading) DEPRECATED This deprecated property is a variant of [Instance.ClassName](/docs/reference/engine/classes/Instance#ClassName) which should be used instead. Methods ------- Methods inherited from Instance ### AddTag void This 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()](/docs/reference/engine/classes/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()](/docs/reference/engine/classes/Instance#RemoveTag), calling [Instance:Destroy()](/docs/reference/engine/classes/Instance#Destroy), or in a function connected to a signal returned by [CollectionService:GetInstanceRemovedSignal()](/docs/reference/engine/classes/CollectionService#GetInstanceRemovedSignal). #### Parameters tag: [string](/docs/luau/strings) #### Returns void ### ClearAllChildren void This function destroys all of an [Instance](/docs/reference/engine/classes/Instance)'s children. As [Instance:Destroy()](/docs/reference/engine/classes/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()](/docs/reference/engine/classes/Instance#GetChildren) or [Instance:GetDescendants()](/docs/reference/engine/classes/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 end #### Returns void #### Code Samples This 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:ClearAllChildren * * * local 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 children ### Clone [Instance](/docs/reference/engine/classes/Instance) Clone creates a copy of an object and all of its descendants, ignoring all objects that are not [Archivable](/docs/reference/engine/classes/Instance#Archivable). The copy of the root object is returned by this function and its [Parent](/docs/reference/engine/classes/Instance#Parent) is set to nil. If a reference property such as [ObjectValue.Value](/docs/reference/engine/classes/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](/docs/reference/engine/classes/Instance#Parent) to the [Workspace](/docs/reference/engine/classes/Workspace) or one of its descendants. Finally, when it's time to regenerate the model, [Destroy](/docs/reference/engine/classes/Instance#Destroy) the copy and clone a new one from the original like before. #### Returns [Instance](/docs/reference/engine/classes/Instance) #### Code Samples This 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)) ### Destroy void Sets the [Instance.Parent](/docs/reference/engine/classes/Instance#Parent) property to nil, locks the [Instance.Parent](/docs/reference/engine/classes/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](/docs/reference/engine/classes/Instance) has been destroyed by this method it cannot be reused because the [Instance.Parent](/docs/reference/engine/classes/Instance#Parent) property is locked. To temporarily remove an object, set [Parent](/docs/reference/engine/classes/Instance#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()](/docs/reference/engine/classes/Debris#AddItem). #### Returns void #### Code Samples Instance:Destroy * * * local Part = workspace.Part Part:Destroy() Part.Parent = workspace --> The Parent property of Part is locked ### FindFirstAncestor [Instance](/docs/reference/engine/classes/Instance) [Write Parallel](/docs/scripting/multithreading) Returns the first ancestor of the [Instance](/docs/reference/engine/classes/Instance) whose [Instance.Name](/docs/reference/engine/classes/Instance#Name) is equal to the given name. This function works upwards, meaning it starts at the [Instance](/docs/reference/engine/classes/Instance)'s immediate [Instance.Parent](/docs/reference/engine/classes/Instance#Parent) and works up towards the [DataModel](/docs/reference/engine/classes/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()](/docs/reference/engine/classes/Instance#FindFirstAncestorOfClass) and [Instance:FindFirstAncestorWhichIsA()](/docs/reference/engine/classes/Instance#FindFirstAncestorWhichIsA). #### Parameters name: [string](/docs/luau/strings) The [Instance.Name](/docs/reference/engine/classes/Instance#Name) to be looked for. #### Returns [Instance](/docs/reference/engine/classes/Instance) The [Instance](/docs/reference/engine/classes/Instance) found. ### FindFirstAncestorOfClass [Instance](/docs/reference/engine/classes/Instance) [Write Parallel](/docs/scripting/multithreading) Returns the first ancestor of the [Instance](/docs/reference/engine/classes/Instance) whose [Instance.ClassName](/docs/reference/engine/classes/Instance#ClassName) is equal to the given className. This function works upwards, meaning it starts at the [Instance](/docs/reference/engine/classes/Instance)'s immediate [Instance.Parent](/docs/reference/engine/classes/Instance#Parent) and works up towards the [DataModel](/docs/reference/engine/classes/DataModel). If no matching ancestor is found, it returns nil. A common use of this function is finding the [Model](/docs/reference/engine/classes/Model) a [BasePart](/docs/reference/engine/classes/BasePart) belongs to. For example: * * * local model = part:FindFirstAncestorOfClass("Model") This function is a variant of [Instance:FindFirstAncestor()](/docs/reference/engine/classes/Instance#FindFirstAncestor) which checks the [Instance.ClassName](/docs/reference/engine/classes/Instance#ClassName) property rather than [Instance.Name](/docs/reference/engine/classes/Instance#Name). [Instance:FindFirstAncestorWhichIsA()](/docs/reference/engine/classes/Instance#FindFirstAncestorWhichIsA) also exists, using the [Instance:IsA()](/docs/reference/engine/classes/Instance#IsA) method instead to respect class inheritance. #### Parameters className: [string](/docs/luau/strings) The [Instance.ClassName](/docs/reference/engine/classes/Instance#ClassName) to be looked for. #### Returns [Instance](/docs/reference/engine/classes/Instance) The [Instance](/docs/reference/engine/classes/Instance) found. ### FindFirstAncestorWhichIsA [Instance](/docs/reference/engine/classes/Instance) [Write Parallel](/docs/scripting/multithreading) Returns the first ancestor of the [Instance](/docs/reference/engine/classes/Instance) for whom [Instance:IsA()](/docs/reference/engine/classes/Instance#IsA) returns true for the given className. This function works upwards, meaning it starts at the [Instance](/docs/reference/engine/classes/Instance)'s immediate [Instance.Parent](/docs/reference/engine/classes/Instance#Parent) and works up towards the [DataModel](/docs/reference/engine/classes/DataModel). If no matching ancestor is found, it returns nil. Unlike [Instance:FindFirstAncestorOfClass()](/docs/reference/engine/classes/Instance#FindFirstAncestorOfClass), this function uses [Instance:IsA()](/docs/reference/engine/classes/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](/docs/reference/engine/classes/BasePart) ancestor, regardless of if it is a [WedgePart](/docs/reference/engine/classes/WedgePart), [MeshPart](/docs/reference/engine/classes/MeshPart) or [Part](/docs/reference/engine/classes/Part). * * * local part = object:FindFirstAncestorWhichIsA("BasePart") See also, [Instance:FindFirstAncestor()](/docs/reference/engine/classes/Instance#FindFirstAncestor). #### Parameters className: [string](/docs/luau/strings) The [Instance.ClassName](/docs/reference/engine/classes/Instance#ClassName) to be looked for. #### Returns [Instance](/docs/reference/engine/classes/Instance) The [Instance](/docs/reference/engine/classes/Instance) found. ### FindFirstChild [Instance](/docs/reference/engine/classes/Instance) [Write Parallel](/docs/scripting/multithreading) Returns the first child of the [Instance](/docs/reference/engine/classes/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](/docs/reference/engine/classes/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](/docs/reference/engine/classes/Instance#Name) of an object is the same as that of a property of its [Parent](/docs/reference/engine/classes/Instance#Parent). When using the dot operator, properties take precedence over children if they share a name. In the following example, a [Folder](/docs/reference/engine/classes/Folder) called "Color" is added to a [Part](/docs/reference/engine/classes/Part), which also has the [Part.Color](/docs/reference/engine/classes/Part#Color) property. [Part.Color](/docs/reference/engine/classes/Part#Color) refers to the [Color3](/docs/reference/engine/datatypes/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()](/docs/reference/engine/classes/Instance#FindFirstChild) in this way is that the introduction of new properties does not impose a risk on your code. #### Performance Note [FindFirstChild()](/docs/reference/engine/classes/Instance#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](/docs/reference/engine/classes/RunService#Heartbeat) and [RunService.RenderStepped](/docs/reference/engine/classes/RunService#RenderStepped). Instead, store the result in a variable, or consider using [ChildAdded](/docs/reference/engine/classes/Instance#ChildAdded) or [WaitForChild()](/docs/reference/engine/classes/Instance#WaitForChild) to detect when a child of a given name becomes available. #### Parameters name: [string](/docs/luau/strings) The [Instance.Name](/docs/reference/engine/classes/Instance#Name) to be searched for. recursive: [boolean](/docs/luau/booleans) Whether or not the search should be conducted recursively. Default Value: false #### Returns [Instance](/docs/reference/engine/classes/Instance) The [Instance](/docs/reference/engine/classes/Instance) found. #### Code Samples The below would look in Workspace for an object name "Brick". If found, it will change the name of the object to "Foo". Instance:FindFirstChild * * * local found = workspace:FindFirstChild("Brick") if found then found.Name = "Foo" end ### FindFirstChildOfClass [Instance](/docs/reference/engine/classes/Instance) [Write Parallel](/docs/scripting/multithreading) Returns the first child of the [Instance](/docs/reference/engine/classes/Instance) whose [ClassName](/docs/reference/engine/classes/Instance#ClassName) is equal to the given className. If no matching child is found, this function returns nil. Unlike [Instance:FindFirstChildWhichIsA()](/docs/reference/engine/classes/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()](/docs/reference/engine/classes/Instance#FindFirstChild) instead. #### Parameters className: [string](/docs/luau/strings) The [Instance.ClassName](/docs/reference/engine/classes/Instance#ClassName) to be looked for. #### Returns [Instance](/docs/reference/engine/classes/Instance) The [Instance](/docs/reference/engine/classes/Instance) found. #### Code Samples Instance:FindFirstChildOfClass * * * local 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 end ### FindFirstChildWhichIsA [Instance](/docs/reference/engine/classes/Instance) [Write Parallel](/docs/scripting/multithreading) Returns the first child of the [Instance](/docs/reference/engine/classes/Instance) for whom [Instance:IsA()](/docs/reference/engine/classes/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](/docs/reference/engine/classes/Instance). Unlike [Instance:FindFirstChildOfClass()](/docs/reference/engine/classes/Instance#FindFirstChildOfClass), this function uses [Instance:IsA()](/docs/reference/engine/classes/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](/docs/reference/engine/classes/BasePart) child, regardless of if it is a [WedgePart](/docs/reference/engine/classes/WedgePart), [MeshPart](/docs/reference/engine/classes/MeshPart) or [Part](/docs/reference/engine/classes/Part). * * * local part = object:FindFirstChildWhichIsA("BasePart") Developers looking for a child by name, should use [Instance:FindFirstChild()](/docs/reference/engine/classes/Instance#FindFirstChild) instead. #### Parameters className: [string](/docs/luau/strings) The [Instance.ClassName](/docs/reference/engine/classes/Instance#ClassName) to be searched for. recursive: [boolean](/docs/luau/booleans) Whether or not the search should be conducted recursively. Default Value: false #### Returns [Instance](/docs/reference/engine/classes/Instance) The [Instance](/docs/reference/engine/classes/Instance) found. ### FindFirstDescendant [Instance](/docs/reference/engine/classes/Instance) [Write Parallel](/docs/scripting/multithreading) Returns the first descendant found with the given [Instance.Name](/docs/reference/engine/classes/Instance#Name). #### Parameters name: [string](/docs/luau/strings) The [Instance.Name](/docs/reference/engine/classes/Instance#Name) to search for. #### Returns [Instance](/docs/reference/engine/classes/Instance) The [Instance](/docs/reference/engine/classes/Instance) found. ### GetActor [Actor](/docs/reference/engine/classes/Actor) [Write Parallel](/docs/scripting/multithreading) If the [Instance](/docs/reference/engine/classes/Instance) is an [Actor](/docs/reference/engine/classes/Actor), the [Actor](/docs/reference/engine/classes/Actor) itself is returned. Otherwise, its closest ancestor [Actor](/docs/reference/engine/classes/Actor) is returned. If no ancestor is an [Actor](/docs/reference/engine/classes/Actor), the result is nil. #### Returns [Actor](/docs/reference/engine/classes/Actor) The [Actor](/docs/reference/engine/classes/Actor) found. ### GetAttribute Variant [Write Parallel](/docs/scripting/multithreading) This 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](/docs/reference/engine/classes/Instance): * * * local initialPosition = instance:GetAttribute("InitialPosition") See also: * [Instance:SetAttribute()](/docs/reference/engine/classes/Instance#SetAttribute), sets the attribute with the given name to the given value * [Instance:GetAttributes()](/docs/reference/engine/classes/Instance#GetAttributes), returns a dictionary of string → variant pairs for each of the instance's attributes * [Instance.AttributeChanged](/docs/reference/engine/classes/Instance#AttributeChanged), fires whenever an attribute is changed on the instance * [Instance:GetAttributeChangedSignal()](/docs/reference/engine/classes/Instance#GetAttributeChangedSignal), returns an event that fires when the given attribute changes #### Parameters attribute: [string](/docs/luau/strings) The name of the attribute being retrieved. #### Returns Variant The attribute which has been assigned to the given name. If no attribute has been assigned then nil is returned. ### GetAttributeChangedSignal [RBXScriptSignal](/docs/reference/engine/datatypes/RBXScriptSignal) This 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()](/docs/reference/engine/classes/Instance#GetPropertyChangedSignal) but for attributes. For example, the following code snippet will return a signal that fires the function [Instance.AttributeChanged](/docs/reference/engine/classes/Instance#AttributeChanged) when the instance's InitialPosition attribute changes. Note that this code sample does not define [Instance](/docs/reference/engine/classes/Instance): * * * local function attributeChanged() print("Attribute changed") end instance:GetAttributeChangedSignal("InitialPosition"):Connect(attributeChanged) See also: * [Instance:SetAttribute()](/docs/reference/engine/classes/Instance#SetAttribute), sets the attribute with the given name to the given value * [Instance:GetAttribute()](/docs/reference/engine/classes/Instance#GetAttribute), returns the attribute which has been assigned to the given name * [Instance:GetAttributes()](/docs/reference/engine/classes/Instance#GetAttributes), returns a dictionary of string → variant pairs for each of the instance's attributes * [Instance.AttributeChanged](/docs/reference/engine/classes/Instance#AttributeChanged), fires whenever an attribute is changed on the instance #### Parameters attribute: [string](/docs/luau/strings) The name of the specified attribute for which the change signal is being returned. #### Returns [RBXScriptSignal](/docs/reference/engine/datatypes/RBXScriptSignal) An event that fires when the given attribute changes. ### GetAttributes [table](/docs/luau/tables) [Write Parallel](/docs/scripting/multithreading) This 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](/docs/reference/engine/classes/Instance): * * * local attributes = instance:GetAttributes() for name, value in pairs(attributes) do print(name .. " " .. value) end See also: * [Instance:SetAttribute()](/docs/reference/engine/classes/Instance#SetAttribute), sets the attribute with the given name to the given value * [Instance:GetAttribute()](/docs/reference/engine/classes/Instance#GetAttribute), returns the attribute which has been assigned to the given name * [Instance.AttributeChanged](/docs/reference/engine/classes/Instance#AttributeChanged), fires whenever an attribute is changed on the instance * [Instance:GetAttributeChangedSignal()](/docs/reference/engine/classes/Instance#GetAttributeChangedSignal), returns an event that fires when the given attribute changes #### Returns [table](/docs/luau/tables) 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. ### GetChildren [Objects](/docs/luau/tuples) [Write Parallel](/docs/scripting/multithreading) Returns an array (a numerically indexed table) containing all of the [Instance](/docs/reference/engine/classes/Instance)'s direct children, or every [Instance](/docs/reference/engine/classes/Instance) whose [Parent](/docs/reference/engine/classes/Instance#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](/docs/reference/engine/classes/Instance#Parent) property was set to the object. See also the [GetDescendants](/docs/reference/engine/classes/Instance#GetDescendants) function. #### Returns [Objects](/docs/luau/tuples) An array containing the [Instance](/docs/reference/engine/classes/Instance)'s children. #### Code Samples The below would print the name of all objects currently in Workspace when ran. Instance:GetChildren * * * local children = workspace:GetChildren() for i = 1, #children do print(i, children[i].Name) end ### GetDebugId [string](/docs/luau/strings) Not Browsable Plugin Security Returns a coded string of the [Instance](/docs/reference/engine/classes/Instance)s DebugId used internally by Roblox. Note: * This item is protected. Attempting to use it in a [Script](/docs/reference/engine/classes/Script) or [LocalScript](/docs/reference/engine/classes/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) #### Parameters scopeLength: [number](/docs/luau/numbers) The scope length. Default Value: 4 #### Returns [string](/docs/luau/strings) The Debug ID string. #### Code Samples Instance:GetDebugId * * * print(workspace:GetDebugId()) --> 39FA_12 print(workspace:GetDebugId(10)) --> 39FA2FEF4D_12 print(workspace:GetDebugId(math.huge)) --> 12 ### GetDescendants [Array](/docs/luau/tables) Custom Lua State [Write Parallel](/docs/scripting/multithreading) The GetDescendants function of an object returns an array that contains all of the descendants of that object. Unlike [Instance:GetChildren()](/docs/reference/engine/classes/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](/docs/reference/engine/classes/Model) in the [Workspace](/docs/reference/engine/classes/Workspace): ![Workspace Descendants](https://prod.docsiteassets.roblox.com/assets/legacy/GetDescendantsExample.png) 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 -- B #### Returns [Array](/docs/luau/tables) An array containing the [Instance](/docs/reference/engine/classes/Instance)'s descendants. #### Code Samples GetDescendants 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()](/docs/reference/engine/classes/Instance#IsA) to find all of the parts in the workspace and turns them green. Instance:GetDescendants * * * local 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 end ### GetFullName [string](/docs/luau/strings) [Write Parallel](/docs/scripting/multithreading) Returns a string describing the [Instance](/docs/reference/engine/classes/Instance)'s ancestry. The string is a concatenation of the [Name](/docs/reference/engine/classes/Instance#Name) of the object and its ancestors, separated by periods. The [DataModel](/docs/reference/engine/classes/DataModel) (game) is not considered. For example, a [Part](/docs/reference/engine/classes/Part) in the [Workspace](/docs/reference/engine/classes/Workspace) may return [Workspace.Part](/docs/reference/engine/classes/Workspace#Part). When called on an [Instance](/docs/reference/engine/classes/Instance) that is not a descendant of the [DataModel](/docs/reference/engine/classes/DataModel), this function considers all ancestors up to and including the topmost one without a [Parent](/docs/reference/engine/classes/Instance#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. #### Returns [string](/docs/luau/strings) The full name of the [Instance](/docs/reference/engine/classes/Instance). #### Code Samples This code sample demonstrates the behavior of [Instance:GetFullName()](/docs/reference/engine/classes/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.Fire This code sample re-implements the [Instance:GetFullName()](/docs/reference/engine/classes/Instance#GetFullName) function in Lua. Instance:GetFullName Lua Implementation * * * local 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.Camera ### GetPropertyChangedSignal [RBXScriptSignal](/docs/reference/engine/datatypes/RBXScriptSignal) This 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](/docs/reference/engine/classes/ValueBase) objects, such as [IntValue](/docs/reference/engine/classes/IntValue) and [StringValue](/docs/reference/engine/classes/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](/docs/reference/engine/classes/IntValue), use IntValue:GetPropertyChangedSignal("Name"):Connect(someFunc) since the Changed event of [IntValue](/docs/reference/engine/classes/IntValue) objects only detect changes on the Value property. #### Parameters property: [string](/docs/luau/strings) The property to connect to. #### Returns [RBXScriptSignal](/docs/reference/engine/datatypes/RBXScriptSignal) A signal that fires whenever the property changes. #### Code Samples This 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 Changed * * * local 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 GetPropertyChangedSignal * * * local 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") ### GetTags [Array](/docs/luau/tables) [Write Parallel](/docs/scripting/multithreading) This method returns an array of the tags applied to the given instance, as strings. You can add tags either in Studio in the [Properties](https://prod.docsiteassets.roblox.com/studio/properties.md) window or at runtime with [AddTag()](/docs/reference/engine/classes/Instance#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()](/docs/reference/engine/classes/Instance#HasTag) to check for a specific tag. #### Returns [Array](/docs/luau/tables) ### HasTag [boolean](/docs/luau/booleans) [Write Parallel](/docs/scripting/multithreading) This method returns true if the provided tag has been added to the object. You can add tags either in Studio in the [Properties](https://prod.docsiteassets.roblox.com/studio/properties.md) window or at runtime with [AddTag()](/docs/reference/engine/classes/Instance#AddTag). #### Parameters tag: [string](/docs/luau/strings) #### Returns [boolean](/docs/luau/booleans) ### IsA [boolean](/docs/luau/booleans) Custom Lua State [Write Parallel](/docs/scripting/multithreading) IsA returns true if the [Instance](/docs/reference/engine/classes/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](https://en.wikipedia.org/wiki/Type_introspection). To ignore class inheritance, test the [ClassName](/docs/reference/engine/classes/Instance#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](/docs/reference/engine/classes/Part) or [WedgePart](/docs/reference/engine/classes/WedgePart), which inherits from [BasePart](/docs/reference/engine/classes/BasePart) (an abstract class). For example, if your goal is to change all of a [Character](/docs/reference/engine/classes/Player#Character)'s limbs to the same color, you might use [GetChildren](/docs/reference/engine/classes/Instance#GetChildren) to iterate over the children, then use IsA to filter non-[BasePart](/docs/reference/engine/classes/BasePart) objects which lack the [BrickColor](/docs/reference/engine/datatypes/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](/docs/reference/engine/classes/Instance), calling object:IsA("Instance") will always return true. #### Parameters className: [string](/docs/luau/strings) The class against which the Instance's class will be checked. Case-sensitive. #### Returns [boolean](/docs/luau/booleans) Describes whether the Instance's class matched or is a subclass of the given class. #### Code Samples Usage of IsA to test class inheritance: Instance:IsA * * * print(workspace:IsA("Instance")) --> true print(workspace:IsA("Workspace")) --> true print(game:IsA("workspace")) --> false print(game:IsA("DataModel")) --> true ### IsAncestorOf [boolean](/docs/luau/booleans) [Write Parallel](/docs/scripting/multithreading) Returns true if an [Instance](/docs/reference/engine/classes/Instance) is an ancestor of the given descendant. An [Instance](/docs/reference/engine/classes/Instance) is considered the ancestor of an object if the object's [Instance.Parent](/docs/reference/engine/classes/Instance#Parent) or one of it's parent's [Instance.Parent](/docs/reference/engine/classes/Instance#Parent) is set to the [Instance](/docs/reference/engine/classes/Instance). See also, [Instance:IsDescendantOf()](/docs/reference/engine/classes/Instance#IsDescendantOf). #### Parameters descendant: [Instance](/docs/reference/engine/classes/Instance) The descendant [Instance](/docs/reference/engine/classes/Instance). #### Returns [boolean](/docs/luau/booleans) True if the [Instance](/docs/reference/engine/classes/Instance) is an ancestor of the given descendant. #### Code Samples Instance:IsAncestorOf * * * print(workspace:IsAncestorOf(workspace.Player.HumanoidRootPart)) --> true ### IsDescendantOf [boolean](/docs/luau/booleans) [Write Parallel](/docs/scripting/multithreading) Returns true if an [Instance](/docs/reference/engine/classes/Instance) is a descendant of the given ancestor. An [Instance](/docs/reference/engine/classes/Instance) is considered the descendant of an object if the [Instance](/docs/reference/engine/classes/Instance)'s parent or one of its parent's parent is set to the object. Note, [DataModel](/docs/reference/engine/classes/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()](/docs/reference/engine/classes/Instance#IsAncestorOf). #### Parameters ancestor: [Instance](/docs/reference/engine/classes/Instance) The ancestor [Instance](/docs/reference/engine/classes/Instance). #### Returns [boolean](/docs/luau/booleans) True if the [Instance](/docs/reference/engine/classes/Instance) is a descendant of the given ancestor. #### Code Samples Instance:IsDescendantOf * * * local part = Instance.new("Part") print(part:IsDescendantOf(game)) --> false part.Parent = workspace print(part:IsDescendantOf(game)) --> true part.Parent = game print(part:IsDescendantOf(game)) --> true ### Remove void DEPRECATED DEPRECATED This item is deprecated in favor of [Instance:Destroy()](/docs/reference/engine/classes/Instance#Destroy) and [Instance:ClearAllChildren()](/docs/reference/engine/classes/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](/docs/reference/engine/classes/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. #### Returns void #### Code Samples The following code demonstrates how a part can be re-added to the DataModel after being removed: Instance:Remove * * * local part = Instance.new("Part") part.Parent = workspace print(part.Parent) --> Workspace part:Remove() print(part.Parent) --> nil part.Parent = workspace print(part.Parent) --> Workspace ### RemoveTag void This 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()](/docs/reference/engine/classes/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. #### Parameters tag: [string](/docs/luau/strings) #### Returns void ### SetAttribute void This 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)](/docs/reference/engine/datatypes/Vector3). Note that this code sample does not define [Instance](/docs/reference/engine/classes/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()](/docs/reference/engine/classes/Instance#GetAttribute), returns the attribute which has been assigned to the given name * [Instance:GetAttributes()](/docs/reference/engine/classes/Instance#GetAttributes), returns a dictionary of string → variant pairs for each of the instance's attributes * [Instance.AttributeChanged](/docs/reference/engine/classes/Instance#AttributeChanged), fires whenever an attribute is changed on the instance * [Instance:GetAttributeChangedSignal()](/docs/reference/engine/classes/Instance#GetAttributeChangedSignal), returns an event that fires when the given attribute changes #### Parameters attribute: [string](/docs/luau/strings) The name of the attribute being set. value: Variant The value that the specified attribute is being set to. #### Returns void ### WaitForChild [Instance](/docs/reference/engine/classes/Instance) Custom Lua State Can Yield Returns the child of the [Instance](/docs/reference/engine/classes/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()](/docs/reference/engine/classes/Instance#WaitForChild) is extremely important when working on code run by the client in a [LocalScript](/docs/reference/engine/classes/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](/docs/reference/engine/classes/Workspace#StreamingEnabled) set to true, [BaseParts](/docs/reference/engine/classes/BasePart) 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()](/docs/reference/engine/classes/Instance#FindFirstChild) is a more efficient alternative to [WaitForChild()](/docs/reference/engine/classes/Instance#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")' #### Parameters childName: [string](/docs/luau/strings) The [Instance.Name](/docs/reference/engine/classes/Instance#Name) to be looked for. timeOut: [number](/docs/luau/numbers) An optional time out parameter. #### Returns [Instance](/docs/reference/engine/classes/Instance) The [Instance](/docs/reference/engine/classes/Instance) found. #### Code Samples The following code waits for an instance named "Part" to be added to Workspace. Instance:WaitForChild * * * local part = workspace:WaitForChild("Part") print(part.Name .. " has been added to the Workspace") ### children [Objects](/docs/luau/tuples) DEPRECATED DEPRECATED This item has been superseded by [Instance:GetChildren()](/docs/reference/engine/classes/Instance#GetChildren) which should be used in all new work. The children function returns an array of the object's children. #### Returns [Objects](/docs/luau/tuples) Array of child objects/instances. ### clone [Instance](/docs/reference/engine/classes/Instance) DEPRECATED DEPRECATED This deprecated function is a variant of [Instance:Clone()](/docs/reference/engine/classes/Instance#Clone) which should be used instead. #### Returns [Instance](/docs/reference/engine/classes/Instance) ### destroy void DEPRECATED DEPRECATED This deprecated function is a variant of [Instance:Destroy()](/docs/reference/engine/classes/Instance#Destroy) which should be used instead. #### Returns void ### findFirstChild [Instance](/docs/reference/engine/classes/Instance) DEPRECATED DEPRECATED This deprecated function is a variant of [Instance:FindFirstChild()](/docs/reference/engine/classes/Instance#FindFirstChild) which should be used instead. #### Parameters name: [string](/docs/luau/strings) recursive: [boolean](/docs/luau/booleans) Default Value: false #### Returns [Instance](/docs/reference/engine/classes/Instance) ### getChildren [Objects](/docs/luau/tuples) DEPRECATED DEPRECATED This deprecated function is a variant of [Instance:GetChildren()](/docs/reference/engine/classes/Instance#GetChildren) which should be used instead. #### Returns [Objects](/docs/luau/tuples) ### isA [boolean](/docs/luau/booleans) DEPRECATED Custom Lua State DEPRECATED This deprecated function is a variant of [Instance:IsA()](/docs/reference/engine/classes/Instance#IsA) which should be used instead. #### Parameters className: [string](/docs/luau/strings) #### Returns [boolean](/docs/luau/booleans) ### isDescendantOf [boolean](/docs/luau/booleans) DEPRECATED DEPRECATED This deprecated function is a variant of [Instance:IsDescendantOf()](/docs/reference/engine/classes/Instance#IsDescendantOf) which should be used instead. #### Parameters ancestor: [Instance](/docs/reference/engine/classes/Instance) #### Returns [boolean](/docs/luau/booleans) ### remove void DEPRECATED DEPRECATED This deprecated function is a variant of [Instance:Remove()](/docs/reference/engine/classes/Instance#Remove) which has also been deprecated. Neither function should be used in new work. #### Returns void Events ------ Events inherited from Instance ### AncestryChanged Fires when the [Instance.Parent](/docs/reference/engine/classes/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](/docs/reference/engine/classes/Instance) whose [Instance.Parent](/docs/reference/engine/classes/Instance#Parent) was actually changed. _Parent_ refers to this [Instance](/docs/reference/engine/classes/Instance)'s new [Instance.Parent](/docs/reference/engine/classes/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()](/docs/reference/engine/classes/Instance#Destroy), use the [Instance.Destroying](/docs/reference/engine/classes/Instance#Destroying) event instead. #### Parameters child: [Instance](/docs/reference/engine/classes/Instance) The [Instance](/docs/reference/engine/classes/Instance) whose [Instance.Parent](/docs/reference/engine/classes/Instance#Parent) has been changed. parent: [Instance](/docs/reference/engine/classes/Instance) The new [Instance.Parent](/docs/reference/engine/classes/Instance#Parent) of the [Instance](/docs/reference/engine/classes/Instance) whose [Instance.Parent](/docs/reference/engine/classes/Instance#Parent) was changed. #### Code Samples The below example would print "Part is now a child of Model". Instance.AncestryChanged * * * local 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.Model ### AttributeChanged This 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](/docs/reference/engine/classes/Instance)'s attributes changes. Note that this code sample does not define [Instance](/docs/reference/engine/classes/Instance): * * * local function attributeChanged(attributeName) print(attributeName, "changed") end instance.AttributeChanged:Connect(attributeChanged) See also: * [Instance:SetAttribute()](/docs/reference/engine/classes/Instance#SetAttribute), sets the attribute with the given name to the given value * [Instance:GetAttribute()](/docs/reference/engine/classes/Instance#GetAttribute), returns the attribute which has been assigned to the given name * [Instance:GetAttributes()](/docs/reference/engine/classes/Instance#GetAttributes), returns a dictionary of string → variant pairs for each of the instance's attributes * [Instance:GetAttributeChangedSignal()](/docs/reference/engine/classes/Instance#GetAttributeChangedSignal), returns an event that fires when the given attribute changes #### Parameters attribute: [string](/docs/luau/strings) The name of the attribute that has been changed. ### Changed The 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](/docs/reference/engine/datatypes/CFrame), Velocity, RotVelocity, Position, Orientation and [CFrame](/docs/reference/engine/datatypes/CFrame) properties of a [BasePart](/docs/reference/engine/classes/BasePart) change due to gravity. To detect changes in these properties, consider using a physics-based event like [RunService.Stepped](/docs/reference/engine/classes/RunService#Stepped) or [BasePart.Touched](/docs/reference/engine/classes/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](/docs/reference/engine/classes/IntValue), [StringValue](/docs/reference/engine/classes/StringValue), etc for more information. To detect other changes in these objects, you must use GetPropertyChangedSignal instead. #### Parameters property: [string](/docs/luau/strings) The name of the property that changed. #### Code Samples This 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 Detector * * * local 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.Name ### ChildAdded Fires after an object is parented to this [Instance](/docs/reference/engine/classes/Instance). Note, when using this function on a client to detect objects created by the server it is necessary to use [Instance:WaitForChild()](/docs/reference/engine/classes/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](/docs/reference/engine/classes/Instance). For a function that captures all descendants, use [Instance.DescendantAdded](/docs/reference/engine/classes/Instance#DescendantAdded). See also, [Instance.ChildRemoved](/docs/reference/engine/classes/Instance#ChildRemoved). #### Parameters child: [Instance](/docs/reference/engine/classes/Instance) The [Instance](/docs/reference/engine/classes/Instance) that has been added. #### Code Samples This snippet prints the names of objects as they are added to the Workspace: Instance.ChildAdded * * * local 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 Workspace ### ChildRemoved Fires after a child is removed from this [Instance](/docs/reference/engine/classes/Instance). Removed refers to when an object's parent is changed from this [Instance](/docs/reference/engine/classes/Instance) to something other than this [Instance](/docs/reference/engine/classes/Instance). Note, this event will also fire when a child is destroyed (using [Instance:Destroy()](/docs/reference/engine/classes/Instance#Destroy)) as the destroy function sets an object's parent to nil. This function only works for immediate children of the [Instance](/docs/reference/engine/classes/Instance). For a function that captures all descendants, use [Instance.DescendantRemoving](/docs/reference/engine/classes/Instance#DescendantRemoving). See also [Instance.ChildAdded](/docs/reference/engine/classes/Instance#ChildAdded). #### Parameters child: [Instance](/docs/reference/engine/classes/Instance) The [Instance](/docs/reference/engine/classes/Instance) that has been removed. #### Code Samples This snippet prints the names of objects as they are removed from the Workspace: Instance.ChildRemoved * * * local 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() ### DescendantAdded The DescendantAdded event fires after a descendant is added to the [Instance](/docs/reference/engine/classes/Instance). As DescendantAdded fires for every descendant, parenting an object to the [Instance](/docs/reference/engine/classes/Instance) will fire the event for this object and all of its descendants individually. Developers only concerned with the immediate children of the [Instance](/docs/reference/engine/classes/Instance) should use [Instance.ChildAdded](/docs/reference/engine/classes/Instance#ChildAdded) instead. See also [Instance.DescendantRemoving](/docs/reference/engine/classes/Instance#DescendantRemoving). #### Parameters descendant: [Instance](/docs/reference/engine/classes/Instance) The [Instance](/docs/reference/engine/classes/Instance) that has been added. #### Code Samples This following example will print the name of any object that is added to the Workspace: Instance.DescendantAdded * * * local function onDescendantAdded(descendant) print(descendant) end workspace.DescendantAdded:Connect(onDescendantAdded) local part = Instance.new("Part") part.Parent = workspace ### DescendantRemoving DescendantRemoving fires immediately before the [Parent](/docs/reference/engine/classes/Instance#Parent) of a descendant of the [Instance](/docs/reference/engine/classes/Instance) changes such that the object is no longer a descendant of the Instance. [Destroy](/docs/reference/engine/classes/Instance#Destroy) and [Remove](/docs/reference/engine/classes/Instance#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. ![A cropped screenshot of the Explorer window. A Model contains ModelA and ModelB, which each contain a Part, PartA and PartB respectively. PartA contains a Fire object named FireA.](https://prod.docsiteassets.roblox.com/assets/legacy/DescendantRemoving2.png) * Calling [Remove](/docs/reference/engine/classes/Instance#Remove) on PartA would cause DescendantRemoving to fire on both ModelA and Model, in that order. * Setting the [Parent](/docs/reference/engine/classes/Instance#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](/docs/reference/engine/classes/Instance#Destroy) on ModelA would cause DescendantRemoving to fire multiple times on several objects: 1. On Model with ModelA, PartA then FireA. 2. On ModelA, with PartA then FireA. 3. On PartA with FireA. #### Warning This event fires with the descendant object that is being removed. Attempting to set the [Parent](/docs/reference/engine/classes/Instance#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](/docs/reference/engine/classes/Instance#DescendantAdded). #### Parameters descendant: [Instance](/docs/reference/engine/classes/Instance) The [Instance](/docs/reference/engine/classes/Instance) that is being removed. #### Code Samples The following example prints the name of any descendant as it is being removed from the Workspace: Instance.DescendantRemoving * * * workspace.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) --> nil ### Destroying The 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](/docs/reference/engine/classes/Instance#AncestryChanged). #### Code Samples This sample demonstrates how an Instance being destroyed remains in place until the connected function yields. Using the Destroying Event * * * local 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() ### childAdded DEPRECATED DEPRECATED This deprecated event is a variant of [Instance.ChildAdded](/docs/reference/engine/classes/Instance#ChildAdded) which should be used instead. #### Parameters child: [Instance](/docs/reference/engine/classes/Instance)