Instance
Instance : InstanceBase
Overview
Instance는 Workspace, ReplicatedStorage, ServerStorage 등 DataModel 트리에 속할 수 있는 모든 객체의 최상위 기본 클래스입니다.
Instance.new() 생성자를 사용하면 Part, ParticleEmitter 등 지정한 객체를 런타임에서 동적으로 생성할 수 있습니다. 단, 최상위 Instance 객체는 직접 생성할 수 없습니다.
Properties
Parent
Instance
Parent 속성은 현재 인스턴스가 계층 구조상 어느 위치에 속하는지를 결정하는 핵심 속성입니다.
이 속성은 GetChildren(), FindFirstChild() 등과 같은 구조 탐색 메서드의 기반이 됩니다.
부모 객체에 Destroy()를 호출하면 해당 부모와 그 하위 모든 객체의 Parent가 nil로 설정되고, 이후 Parent 속성을 변경할 수 없게 됩니다.
Clone()이나 Instance.new()로 새로 생성된 객체는 기본적으로 Parent가 nil인 상태로 만들어집니다. 이 상태에서는 화면에 표시되지 않거나 동작하지 않으며, Parent가 지정된 이후에야 기능하거나 보이게 됩니다.
서버에서 생성된 객체는 복제(Replication) 가능한 계층에 Parent로 연결되기 전까지 클라이언트로 전송되지 않습니다. 객체를 만들고 여러 속성을 설정하는 경우, Parent 속성을 마지막에 지정하는 것이 권장됩니다.
Code Samples
local Part = Instance.new("Part")
local Workspace = game:GetService("Workspace")
Part.Parent = Workspace
print(Part.Parent)
Archivable
bool
현재 지원되지 않습니다.
Code Samples
ClassName
string
현재 인스턴스가 속한 클래스를 문자열로 나타내는 읽기 전용 속성입니다.
해당 객체의 클래스를 직접 확인하는 데 유용하며, 상속 관계를 포함한 타입 판별이 필요할 경우에는 IsA() 메서드를 사용하는 것이 좋습니다.
Code Samples
local Part = script.Parent
print(Part.ClassName)
Name
string
인스턴스의 이름을 지정하는 속성입니다.
이 이름은 계층 구조 내에서 인스턴스를 구별하고 정리하는 데 사용되며, 스크립트를 통해 해당 객체를 참조할 때도 활용됩니다.
스크립트에서 점(.) 연산자로 객체에 접근하려면 이름이 반드시 문자 또는 밑줄(_)로 시작해야 하며, 이후에는 문자, 숫자, 밑줄만 사용할 수 있습니다. 이 규칙을 따르지 않으면 점 표기법으로 접근할 수 없습니다.
같은 계층에 동일한 이름의 객체가 존재하면, 해당 이름으로 접근 시 하나의 객체만 반환되며, 이는 원하는 대상이 아닐 수 있습니다. 따라서 특정 객체를 정확히 참조하려면 고유한 이름을 지정하고 중복을 피하는 것이 안전합니다.
Code Samples
local Part = script.Parent
Part.Name = "NewPart"
ClientOnlyAttributes
InstanceAttributeArray
{Description Slot}
Code Samples
PendingAttributes
InstanceAttributeArray
{Description Slot}
Code Samples
EnabledMobility
bool
{Description Slot}
Code Samples
Methods
Clone
지정된 인스턴스와 그 하위 모든 요소를 복제하여, 최상위 복제본 인스턴스를 반환합니다.
반환된 인스턴스의 Parent 속성은 nil로 설정됩니다.
Parameters
Return
Instance
복제된 인스턴스입니다.
Code Samples
local Workspace = game:GetService("Workspace")
local Part = Workspace.Part
local NewPart = Part:Clone()
NewPart.Position = Part.Position + Vector3.new(300, 0, 0)
NewPart.Parent = Workspace
Destroy
지정된 인스턴스와 그 하위 모든 객체에 Destroy()를 호출하여 완전히 제거합니다.
Destroy()가 실행된 인스턴스는 Parent 속성이 잠겨 재사용할 수 없으므로, 객체를 완전히 삭제하지 않고 임시로 제거하려면 Parent를 nil로 설정하면 됩니다.
이 메서드는 불필요한 객체를 정리하는 데 사용하는 핵심 방법으로, 모든 이벤트 연결을 해제하고 사용하지 않는 객체를 제거하여 메모리 누수와 장기적인 성능 저하를 효과적으로 방지합니다.
Destroy() 호출 후에는 해당 객체 또는 하위 요소를 참조하는 변수를 반드시 nil로 초기화하여, 코드에서 이미 삭제된 객체에 접근하는 상황을 예방하는 것이 좋습니다.
Parameters
Return
void
Code Samples
local Workspace = game:GetService("Workspace")
local Part = Workspace.Part
Part:Destroy()
FindFirstAncestor
지정된 인스턴스의 상위 계층을 따라 올라가면서, 지정한 이름과 동일한 이름을 가진 가진 첫 번째 상위 인스턴스를 반환합니다.
탐색은 현재 인스턴스의 Parent부터 시작해 DataModel까지 진행되며, 조건에 맞는 객체가 없으면 nil이 반환됩니다.
Parameters
string
InName
탐색할 상위 인스턴스의 이름입니다.
Return
Instance
탐색된 인스턴스입니다.
Code Samples
local Part = script.Parent
local Ancestor = Part:FindFirstAncestor("ParentPart")
print(Ancestor)
FindFirstAncestorOfClass
지정된 인스턴스의 상위 계층을 따라 올라가면서, 지정한 클래스 이름과 동일한 이름을 가진 가진 첫 번째 상위 인스턴스를 반환합니다.
탐색은 현재 인스턴스의 Parent부터 시작해 DataModel까지 진행되며, 조건에 맞는 객체가 없으면 nil이 반환됩니다.
주로 BasePart가 포함된 Model을 찾을 때 유용하게 쓰입니다.
Parameters
string
InClassName
탐색할 상위 인스턴스의 클래스 이름입니다.
Return
Instance
탐색된 인스턴스입니다.
Code Samples
local Part = script.Parent
local AncestorOfClass = Part:FindFirstAncestorOfClass("Model")
print(AncestorOfClass)
FindFirstAncestorWhichIsA
지정된 인스턴스의 상위 계층을 따라 올라가면서, 지정한 클래스 이름에 대해 Object:IsA()의 검사 결과가 true인 첫 번째 상위 인스턴스를 반환합니다.
Instance:FindFirstAncestorOfClass()가 클래스 이름을 정확히 비교하는 반면, 이 메서드는 상속 관계를 고려하므로 MeshPart, Part처럼 BasePart를 상속한 객체라면 모두 탐색 대상이 됩니다.
탐색은 현재 인스턴스의 Parent부터 시작해 DataModel까지 진행되며, 조건에 맞는 객체가 없으면 nil이 반환됩니다.
Parameters
string
InClassName
탐색할 상위 인스턴스의 클래스 이름입니다.
Return
Instance
탐색된 인스턴스입니다.
Code Samples
local Part = script.Parent
local AncestorWhichIsA = Part:FindFirstAncestorWhichIsA("BasePart")
print(AncestorWhichIsA)
FindFirstChild
지정한 이름의 첫 번째 자식 인스턴스를 반환하며, 해당 이름의 자식이 없으면 nil을 반환합니다.
recursive 값을 true로 설정하면 직접적인 자식뿐 아니라 모든 하위 계층까지 검색할 수 있습니다.
점(.) 표기법으로 자식을 참조할 때 해당 객체가 존재하지 않으면 오류가 발생하지만, FindFirstChild()를 사용하면 오류 없이 안전하게 존재 여부를 확인할 수 있습니다. 이를 활용하면 특정 Part를 찾기 전에 FindFirstChild()로 존재 여부를 먼저 검사하고, if 조건문을 통해 필요한 코드를 실행할 수 있어 보다 안전합니다.
다만 FindFirstChild()는 점(.) 표기법보다 속도가 느리므로, 성능이 중요한 반복문이나 RunService 이벤트에 연결된 함수에서는 직접 호출을 피하고 결과를 변수에 저장하여 사용하는 것이 권장됩니다.
Parameters
string
InName
탐색할 하위 인스턴스의 이름입니다.
bool
recursive
하위 모든 자식까지 검색할지 여부를 지정하는 옵션입니다. (기본값: false)
Return
Instance
탐색된 인스턴스입니다.
Code Samples
local Workspace = game:GetService("Workspace")
local Part = Workspace:FindFirstChild("Part")
print(Part)
FindFirstChildOfClass
지정된 인스턴스의 자식 중 클래스 이름이 지정한 값과 정확히 일치하는 첫 번째 객체를 반환하며, 조건을 만족하는 자식이 없으면 nil을 반환합니다.
Parameters
string
InClassName
탐색할 하위 인스턴스의 클래스 이름입니다.
bool
recursive
하위 모든 자식까지 검색할지 여부를 지정하는 옵션입니다. (기본값: false)
Return
Instance
탐색된 인스턴스입니다.
Code Samples
local Workspace = game:GetService("Workspace")
local Part = Workspace:FindFirstChildOfClass("Part")
print(Part)
GetAttribute
인스턴스에서 지정한 속성 이름에 해당하는 값을 반환하며, 해당 속성이 없으면 nil을 반환합니다.
SetAttribute()를 사용하면 속성 이름과 값을 지정하여 설정할 수 있고, GetAttributes()를 사용하면 인스턴스의 모든 속성과 값을 딕셔너리 형태로 가져올 수 있습니다.
Parameters
string
attribute
확인할 속성 이름입니다.
Return
Value
해당 속성에 할당된 값입니다.
Code Samples
local AttributeName = "Number"
local SetValue = 1
Part:SetAttribute(AttributeName, SetValue)
local GetValue = Part:GetAttribute(AttributeName)
print(GetValue)
GetAttributes
인스턴스에 설정된 모든 속성을 키-값 쌍 형태의 딕셔너리로 반환합니다.
이 메서드를 사용하면 인스턴스가 가진 모든 속성과 그 값을 한 번에 확인할 수 있습니다.
Parameters
Return
Dictionary
속성의 이름과 값으로 구성된 딕셔너리입니다.
Code Samples
Part:SetAttribute("Number", 1)
Part:SetAttribute("Text", "Hello")
local AttributeList = Part:GetAttributes()
for attributeName, attributeValue in pairs(AttributeList) do
print(attributeName, " : ", attributeValue)
end
GetAttributeChangedSignal
모든 속성 변화를 감지하는 AttributeChanged 이벤트와 달리, 이 메서드는 지정한 속성이 변경될 때만 동작하는 이벤트를 반환합니다.
Parameters
string
InAttributeName
값 변화를 감지할 속성의 이름입니다.
Return
ScriptSignal
실행된 이벤트입니다.
Code Samples
local Object = script.Parent
Object:GetAttributeChangedSignal("SomeEvent"):Connect(function()
print("Attribute Changed!")
end)
Object:SetAttribute("SomeEvent","test")
GetChildren
지정된 객체를 부모로 가지는 모든 직접 자식을 배열 형태로 반환합니다.
반환된 배열은 숫자 인덱스를 가지며, 일반 for 루프나 숫자 for 루프를 사용해 순회할 수 있고 배열 내 자식들의 순서는 Parent 속성이 이 객체로 설정된 순서에 따라 정해집니다.
모든 하위 요소를 가져오려면 GetDescendants() 메서드를 사용하면 됩니다.
Parameters
Return
Array
자식 인스턴스로 구성된 배열입니다.
Code Samples
local Workspace = game:GetService("Workspace")
local Children = Workspace:GetChildren()
for _, child in ipairs(Children) do
print(child.Name)
end
GetChildrenNum
지정된 객체를 부모로 가지는 모든 직접 자식의 수를 반환합니다.
Parameters
Return
number
자식 인스턴스의 수입니다.
Code Samples
local Object = script.Parent
print(Object:GetChildrenNum())
GetDescendants
지정된 객체의 모든 하위 계층을 배열 형태로 반환합니다.
GetChildren()이 하위에 있는 직접적인 자식만 가져오는 것과 달리, 이 메서드는 자식뿐 아니라 그 하위 요소까지 모두 검색하여 포함합니다.
Parameters
Return
array
자식 인스턴스의 하위 항목을 모두 포함한 배열입니다.
Code Samples
local Workspace = game:GetService("Workspace")
local Descendants = Workspace:GetDescendants()
for _, descendant in ipairs(Descendants) do
print(descendant.Name)
end
IsDescendantOf
현재 인스턴스가 지정된 상위 객체의 하위 계층에 포함되어 있으면 true를 반환합니다.
Parameters
Instance
InAncestor
확인할 조상 인스턴스입니다.
Return
bool
조상의 하위 계층에 포함되어 있는지 여부입니다.
Code Samples
local Workspace = script.Parent.Parent
local Part = script.Parent
local IsDescendantOf = script:IsDescendantOf(Workspace)
print(IsDescendantOf)
IsA
현재 인스턴스가 지정된 클래스이거나 해당 클래스를 상속받은 경우 true를 반환합니다.
이 메서드는 특히 객체가 특정 파트 계열에 속하는지 판별할 때 유용합니다. 예를 들어, Part나 MeshPart처럼 BasePart를 상속받은 객체인지 확인하려면 GetChildren()으로 모든 자식을 가져온 뒤 IsA()로 검사할 수 있습니다.
상속 관계를 포함한 타입 판별에 적합하며, 상속 관계를 무시하려면 ClassName 속성으로 직접 비교하는 것이 좋습니다.
또한 number나 string과 같은 Luau 기본 데이터 타입은 type() 또는 typeof() 함수를 사용해 확인해야합니다.
Parameters
string
InClassName
탐색할 클래스 이름입니다.
Return
bool
포함 여부입니다.
Code Samples
local Part = script.Parent
print("Instance : ", Part:IsA("Instance")) -- true
print("Part : ", Part:IsA("BasePart")) -- true
print("BasePart : ", Part:IsA("BasePart")) -- true
print("MeshPart : ", Part:IsA("MeshPart")) -- false
if Part:IsA("Part") then
print("Part")
else
end
SetAttribute
현재 인스턴스에 지정한 이름의 속성 값을 설정합니다.
속성 이름에는 영문자, 숫자, 밑줄(_)만 사용할 수 있으며, 공백이나 특수문자는 허용되지 않고, 값이 nil로 주어지면 해당 속성은 삭제됩니다.
string, number, boolean 같은 Luau의 기본 데이터 타입뿐 아니라 Instance, CFrame 등 다양한 타입을 지원하지만, 지원되지 않는 타입으로 속성을 설정하면 오류가 발생합니다.
서버에서 설정한 값은 클라이언트로 자동 복제되며, 이를 활용하면 RemoteEvent를 사용하지 않고도 스크립트 간 통신이 가능합니다.
Attribute는 Value 오브젝트처럼 별도의 인스턴스를 생성하거나 파괴하지 않으므로 Instance.new()나 Destroy()에 비해 훨씬 빠르게 처리되며, 특히 다수의 오브젝트에 값을 동적으로 생성하거나 제거해야 하는 상황과 같이 고빈도 처리, 대량 오브젝트 제어, 반복적인 동기화가 필요한 경우에 유리합니다.
특정 이름의 속성을 가져오려면 GetAttribute()를, 모든 속성을 가져오려면 GetAttributes()를 사용하면 됩니다.
Parameters
string
attribute
설정할 속성의 이름입니다.
Value
value
할당할 값입니다.
Return
void
Code Samples
local AttributeName = "Number"
local SetValue = 1
Part:SetAttribute(AttributeName, SetValue)
WaitForChild
지정한 이름의 자식 인스턴스를 반환하며, 존재하지 않으면 해당 객체가 생성될 때까지 실행을 일시 중단합니다.
timeOut 값을 지정하면 설정된 시간(초)만 대기한 후, 여전히 해당 자식이 없으면 nil을 반환합니다. timeOut 없이 5초 이상 대기하면 무한 대기 가능성을 알리는 경고 메시지가 출력됩니다.
서버에서 클라이언트로 객체가 전송되는 시점과 순서는 보장되지 않으므로, 로드 순서로 인한 참조 실패를 방지하기 위해 LocalScript에서 클라이언트 측 객체를 다룰 때 필수적으로 사용됩니다.
Parameters
string
InChildName
탐색할 하위 인스턴스의 이름입니다.
number
InTimeOut
대기할 최대 시간(초)입니다. 생략하면 해당 객체가 존재할 때까지 계속 대기합니다.
Return
Instance
탐색된 인스턴스입니다.
Code Samples
local Workspace = game:GetService("Workspace")
local Part = Workspace:WaitForChild("Part")
print(Part)
AddTag
현재 인스턴스에 지정한 이름의 태그를 추가합니다.
Parameters
FName
tag
지정할 태그의 이름입니다.
Return
void
Code Samples
Part:AddTag("SomeTag")
RemoveTag
현재 인스턴스에 지정한 이름의 태그를 삭제하며, 해당 태그가 존재하지 않아도 오류 없이 동작합니다.
Parameters
FName
tag
삭제할 태그의 이름입니다.
Return
void
Code Samples
Part:RemoveTag("SomeTag")
HasTag
현재 인스턴스에 지정한 이름의 태그가 추가되어 있으면 true를 반환합니다.
Parameters
FName
tag
확인할 태그의 이름입니다.
Return
bool
태그의 존재 여부입니다.
Code Samples
if Part:HasTag("SomeTag") then
else
end
GetTags
현재 인스턴스에 적용된 태그 목록을 문자열 배열로 반환합니다.
특정 태그만 확인하는 HasTag()와 달리, 인스턴스에 적용된 모든 태그를 조회할 때 적합합니다.
Parameters
Return
Array
문자열로 구성된 배열입니다.
Code Samples
Part:AddTag("SomeTag")
local Tags = Part:GetTags()
for i = 1, #Tags do
print(Tags[i])
end
Events
AncestryChanged
현재 인스턴스 또는 상위 인스턴스의 Parent 속성이 변경될 때 실행되는 이벤트입니다.
하위 인스턴스의 Parent 속성이 변경될 때는 실행되지 않습니다.
Parameters
Instance
child
Parent 속성이 변경된 인스턴스입니다.
Instance
parent
변경된 Parent 값입니다.
Code Samples
local Part = Instance.new("Part")
local function OnAncestryChanged(child, parent)
print(child, "Ancestry Changed:", parent)
end
Part.AncestryChanged:Connect(OnAncestryChanged)
wait(2)
Part.Parent = game.Workspace
AttributeChanged
현재 인스턴스에서 속성이 변경될 때마다 실행되는 이벤트로, 속성이 nil로 설정되는 경우도 감지합니다.
지정한 속성만 감지하는 GetAttributeChangedSignal()와 달리 모든 속성 변화를 감지하며, 이벤트가 실행되면 변경된 속성의 이름이 연결된 함수로 전달됩니다.
Parameters
string
attribute
변경된 속성의 이름입니다.
Code Samples
local Part = script.Parent
local function OnAttributeChanged(attribute)
print(attribute, "Changed:", Part:GetAttribute(attribute))
end
Part.AttributeChanged:Connect(OnAttributeChanged)
wait(2)
Part:SetAttribute("Color", "Blue")
Changed
현재 인스턴스에서 프로퍼티가 변경될 때마다 실행되는 이벤트입니다.
변경된 값은 object[property] 형태로 직접 조회할 수 있습니다.
주로 스크립트에 의한 프로퍼티 변화를 감지하는 데 사용되며, 물리 엔진에 의해 CFrame이나 Position 등이 변경되는 경우에는 실행되지 않습니다.
또한 변경 주기가 매우 짧은 속성은 일부 변경을 감지하지 못하거나 이벤트가 발생하지 않을 수 있으므로, 게임 로직에서 중요한 속성인 경우, 직접 조회를 통해 동작을 충분히 검증하는 것이 좋습니다.
Parameters
string
property
변경된 프로퍼티의 이름입니다.
Code Samples
local Part = script.Parent
local function OnChanged(property)
print(property, "Changed:", Part[property])
end
Part.Changed:Connect(OnChanged)
wait(2)
Part.Name = "MyPart"
ChildAdded
해당 인스턴스에 자식 인스턴스가 추가될 때 실행되는 이벤트입니다.
이 이벤트는 직접적인 자식만 감지하며, 전체 하위 계층의 추가를 감지하려면 DescendantAdded 이벤트를 사용해야 합니다.
또한 서버에서 생성된 객체를 클라이언트에서 감지하는 경우, 해당 객체의 하위 요소를 다룰 때는 반드시 WaitForChild()를 사용해야 합니다. 이는 서버와 클라이언트 간 동기화 시 객체와 그 하위 요소가 동시에 전송된다는 보장이 없기 때문입니다.
Parameters
Instance
child
추가된 자식 인스턴스의 이름입니다.
Code Samples
local Part = script.Parent
local function OnChildAdded(child)
print("Child Added:", child)
end
Part.ChildAdded:Connect(OnChildAdded)
wait(2)
local ChildPart = Instance.new("Part")
ChildPart.Name = "ChildPart"
ChildPart.Parent = Part
ChildRemoved
해당 인스턴스의 자식 인스턴스가 제거될 때 실행되는 이벤트입니다.
자식의 Parent 속성이 다른 인스턴스로 변경되거나, Destroy() 메서드를 호출해 삭제된 경우에도 실행됩니다.
이 이벤트는 직접적인 자식만 감지하며, 전체 하위 계층의 제거를 감지하려면 DescendantRemoving 이벤트를 사용해야 합니다.
Parameters
Instance
child
제거된 자식 인스턴스의 이름입니다.
Code Samples
DescendantAdded
해당 인스턴스에 자손 인스턴스가 추가될 때 실행되는 이벤트입니다.
이 이벤트는 모든 자손 객체에 대해 실행되므로, 어떤 객체를 인스턴스의 자식으로 배치하면 그 객체뿐 아니라 그 객체가 포함하는 모든 하위 객체에 대해 개별적으로 이벤트가 발생합니다.
직접적인 자식만 감지하려면 ChildAdded 이벤트를 사용하세요.
Parameters
Instance
descendant
추가된 자손 인스턴스의 이름입니다.
Code Samples
local Part = script.Parent
local function OnDescendantAdded(descendant)
print("Descendant Added:", descendant)
end
Part.DescendantAdded:Connect(OnDescendantAdded)
wait(2)
local ChildPart = Instance.new("Part")
ChildPart.Name = "ChildPart"
ChildPart.Parent = Part
DescendantRemoving
해당 인스턴스의 자손 인스턴스가 제거되기 직전에 실행되는 이벤트입니다.
자손의 Parent 속성이 다른 인스턴스로 변경되거나, Destroy() 메서드를 호출해 삭제된 경우에도 실행됩니다.
이 이벤트는 모든 하위 계층에 대해 개별적으로 실행되므로, 어떤 객체가 제거될 때 그 객체뿐 아니라 그 객체의 모든 하위 객체에 대해서도 순차적으로 호출됩니다. 만약 제거되는 객체가 직속 자식이라면, 이 이벤트는 ChildRemoved 이벤트보다 먼저 실행됩니다.
이 시점에서는 자손의 부모 속성이 아직 변경되지 않은 상태이며, Parent를 다른 인스턴스로 변경하는 것은 불가능합니다.
직접적인 자식만 감지하려면 ChildRemoved 이벤트를 사용하세요.
Parameters
Instance
descendant
제거된 자손 인스턴스의 이름입니다.
Code Samples
Destroying
해당 인스턴스가 Destroy() 메서드에 의해 삭제될 때 실행되는 이벤트입니다.
이벤트에 연결된 콜백 함수가 인스턴스를 참조하고 있는 동안에는 해당 인스턴스가 메모리에서 해제되지 않으므로, 안전하게 객체에 접근할 수 있습니다.
Parameters
Code Samples
local Part = script.Parent
local function OnDestroying()
print(Part, "is being destroyed.")
end
Part.Destroying:Connect(OnDestroying)
wait(2)
Part:Destroy()
Last updated