Перейти к основному содержимому

Instance

Методы и свойства Roblox Instance userdata, возвращаемых game.Workspace, :FindFirstChild и остальными tree-walk аксессорами. Instance userdata - это мост чита к живой Roblox DataModel: каждое чтение свойства пересекает границу адресного пространства игры, а каждый вызов метода маршрутизируется через safe-accessor слой Serotonin.

Методы18
Свойства (проверенные)38 (зависит от базового Roblox-класса)
Проверено вживуюВсе 18 методов присутствуют, поведение проверено на game.Workspace и Camera
Требуемый eventнет
Сайд-эффектыSetAttribute, SetHighlightOnTop, SetHighlightTransparency, Destroy мутируют состояние

Именование. Все методы используют PascalCase, повторяя Roblox API. Свойства case-sensitive и привязаны только перечисленные имена - обращение к instance.position (строчная буква) возвращает nil, а не значение Position.

Полиморфная таблица свойств. Разные Roblox-классы выставляют разные свойства. У Camera есть FieldOfView/Fov/LookVector; у Part - Position/Size/Color; у StringValue - Value. Чтение свойства, которого нет на базовом классе, возвращает nil без ошибки.

Краткий справочник

Обход дерева

МетодСигнатураВозвращаетСтатус
GetChildreninstance:GetChildren()table прямых потомковпроверено
GetDescendantsinstance:GetDescendants()table всех descendantsпроверено
FindFirstChildinstance:FindFirstChild(name)Instance или ничегопроверено
FindFirstChildOfClassinstance:FindFirstChildOfClass(className)Instance или ничегопроверено
FindFirstAncestorinstance:FindFirstAncestor(name)Instance или ничегопроверено
FindFirstAncestorOfClassinstance:FindFirstAncestorOfClass(className)Instance или ничегопроверено
FindFirstDescendantinstance:FindFirstDescendant(name)Instance или ничегопроверено
FindFirstDescendantOfClassinstance:FindFirstDescendantOfClass(className)Instance или ничегопроверено

Проверки типа / иерархии

МетодСигнатураВозвращаетСтатус
IsAinstance:IsA(className)boolean (равенство ClassName, не наследование)проверено
IsDescendantOfinstance:IsDescendantOf(ancestor)booleanпроверено
IsAncestorOfinstance:IsAncestorOf(descendant)booleanпроверено

Атрибуты

МетодСигнатураВозвращаетСтатус
GetAttributesinstance:GetAttributes()массив { Name, Value, TypeName }проверено
GetAttributeinstance:GetAttribute(name)any или nilпроверено
GetFirstAttributeOfTypeinstance:GetFirstAttributeOfType(typeName)anyпроверено
SetAttributeinstance:SetAttribute(name, value)ничегопроверено

Визуал / lifecycle

МетодСигнатураВозвращаетСтатус
SetHighlightOnTopinstance:SetHighlightOnTop()ничегопроверено
SetHighlightTransparencyinstance:SetHighlightTransparency(value)ничегопроверено
Destroyinstance:Destroy()ничегопроверено

GetChildren

instance:GetChildren() -> table

Возвращает массив прямых потомков instance. Пустая таблица, если потомков нет. Порядок соответствует внутреннему порядку детей в Roblox (обычно - порядок вставки).

Проверено вживую на game.Workspace: вернул таблицу из 1082 элементов на заполненном Roblox-плейсе. Каждый элемент - свежий Instance userdata.

for _, child in ipairs(game.Workspace:GetChildren()) do
print(child.Name, child.ClassName)
end

GetDescendants

instance:GetDescendants() -> table

Возвращает плоский массив всех descendants в поддереве (дети, внуки, ...). Порядок - depth-first. Используй когда нужно перечислить всё поддерево разом. Для поиска одного объекта FindFirstDescendant дешевле и рекурсивно обходит всё поддерево (проверено вживую: ws:FindFirstDescendant("Camera") возвращает Camera, хотя Camera - прямой потомок).

Стоимость

На заполненном Workspace GetDescendants возвращает десятки тысяч элементов. Кэшируй результат вместо вызова каждый frame.

local cache = {}
cheat.Register("onUpdate", function()
if #cache == 0 then
cache = game.Workspace:GetDescendants()
end
end)

FindFirstChild

instance:FindFirstChild(name: string) -> Instance

Возвращает первого прямого потомка чьё Name совпадает с name. Ищет только на один уровень.

Проверенная форма аргумента:

ВызовРезультат
ws:FindFirstChild("Camera")Instance userdata
ws:FindFirstChild("zzz_not_real")ничего (нет возвращаемого значения, nil в выражениях)
ws:FindFirstChild(nil)error: bad argument #1 (string expected, got nil)
local map = game.Workspace:FindFirstChild("Map")
if map then
print("found map with", #map:GetChildren(), "children")
end

FindFirstChildOfClass

instance:FindFirstChildOfClass(className: string) -> Instance

Возвращает первого прямого потомка чьё ClassName равно className. Как и IsA, это строгое равенство ClassName - FindFirstChildOfClass("BasePart") не найдёт Part.

Проверено вживую: ws:FindFirstChildOfClass("Camera") вернул userdata Camera из workspace.

local cam = game.Workspace:FindFirstChildOfClass("Camera")
if cam then print("FOV (rad):", cam.FieldOfView) end

FindFirstAncestor

instance:FindFirstAncestor(name: string) -> Instance

Идёт вверх по цепочке .Parent и возвращает первого предка чьё Name совпадает с name. Возвращает ничего если такого предка нет.

Полезно когда у тебя глубокий descendant (шапка, accessory модели оружия) и нужна его родительская character / model:

local rootpart = part:FindFirstAncestor("HumanoidRootPart")

FindFirstAncestorOfClass

instance:FindFirstAncestorOfClass(className: string) -> Instance

Идёт вверх по цепочке .Parent и возвращает первого предка чьё ClassName равно className.

local model = inst:FindFirstAncestorOfClass("Model")

FindFirstDescendant

instance:FindFirstDescendant(name: string) -> Instance

Возвращает первого descendant с указанным Name, рекурсивно обходя всё поддерево (проверено вживую: ws:FindFirstDescendant("Camera") возвращает Camera, part:FindFirstDescendant("Foo") возвращает ничего, когда такого descendant нет). Точный порядок обхода implementation-defined; считай это "любой descendant с этим именем".

Когда лучше использовать GetDescendants

Если скрипту нужен предсказуемый порядок или нужно матчить по нескольким критериям (Name + ClassName + значение атрибута), итерируй GetDescendants() сам.


FindFirstDescendantOfClass

instance:FindFirstDescendantOfClass(className: string) -> Instance

То же что FindFirstDescendant, но матчит по ClassName. Строгое равенство (без обхода наследования - как у IsA). Проверено вживую: ws:FindFirstDescendantOfClass("Camera") возвращает workspace Camera.


IsA

instance:IsA(className: string) -> boolean
Не учитывает наследование

IsA в этом runtime НЕ ходит по иерархии классов Roblox. Он сравнивает instance.ClassName со строкой-аргументом прямой проверкой на равенство.

Проверено вживую на game.Workspace:

ВызовРезультат
ws:IsA("Workspace")true
ws:IsA("Instance")false (Workspace наследует от Instance в реальном Roblox, но этот IsA это игнорирует)
ws:IsA("Part")false

Если нужно матчить "любой part", сверяй ClassName с известным набором конкретных классов:

local PART_CLASSES = {
Part = true, MeshPart = true, WedgePart = true,
TrussPart = true, CornerWedgePart = true,
}
for _, child in ipairs(game.Workspace:GetChildren()) do
if PART_CLASSES[child.ClassName] then
print("part:", child.Name)
end
end

IsDescendantOf

instance:IsDescendantOf(ancestor: Instance) -> boolean

Возвращает true если instance находится где-либо в поддереве ancestor.

local cam = game.Workspace:FindFirstChildOfClass("Camera")
print(cam:IsDescendantOf(game.Workspace)) -- true

IsAncestorOf

instance:IsAncestorOf(descendant: Instance) -> boolean

Обратное к IsDescendantOf. Возвращает true если descendant находится где-либо в поддереве instance.


GetAttributes / GetAttribute / SetAttribute / GetFirstAttributeOfType

instance:GetAttributes() -> table
instance:GetAttribute(name: string) -> table | nil
instance:GetFirstAttributeOfType(typeName: string) -> table | nil
instance:SetAttribute(name: string, value: any) -> nothing
Чтение работает, запись не персистится

Перепроверено вживую в билде version-390ba09e7e944154:

  • GetAttributes() и GetAttribute(name) работают для атрибутов которые уже населил Roblox-engine или place-script. Проверено: game.Workspace:GetAttribute("RbxLegacyAnimationBlending") возвращает {Value=true, Name="RbxLegacyAnimationBlending", TypeName="bool"}.
  • SetAttribute(name, value) проходит без ошибки, но не персистится. Проверено через number, string, bool, Vector3 и immediate + one-frame-deferred GetAttribute чтения - каждый Set-вызов молча терялся, каждый следующий GetAttribute возвращал nil, а GetAttributes() продолжал возвращать то же что и до.

То есть этот API эффективно read-only в этом билде. Используй его для чтения значений установленных place / engine; не полагайся на него для cross-script state. Для своего state используй cheat.Register event-scoped переменные, file IO, или ui.GetValue / ui.SetValue widget round-trip.

GetAttribute(name) возвращает record, не raw-значение

В отличие от стандартного Roblox-API, где instance:GetAttribute(name) возвращает значение напрямую, этот runtime возвращает 3-key record-таблицу с той же формой что одна запись GetAttributes():

{ Name = string, Value = any, TypeName = string }

Проверено:

ВызовРезультат
ws:GetAttribute("RbxLegacyAnimationBlending"){ Name = "RbxLegacyAnimationBlending", Value = true, TypeName = "bool" }
ws:GetAttribute("InsertPoint") (не установлен)nil
ws:GetAttribute("Retargeting") (не установлен)nil
ws:GetAttribute("AnimationWeightedBlendFix") (не установлен)nil

Читай value через .Value:

local rec = game.Workspace:GetAttribute("RbxLegacyAnimationBlending")
if rec then
print("blend mode:", rec.Value, "type:", rec.TypeName)
end

GetAttributes() возвращает массив записей

Итерируй через ipairs, не pairs - результат это массив, не name-keyed map. Каждая запись имеет ту же форму что возврат GetAttribute.

Проверено вживую: game.Workspace:GetAttributes() вернул { [1] = { Name = "RbxLegacyAnimationBlending", Value = true, TypeName = "bool" } }. TypeName следует таксономии атрибутов Roblox: "bool", "string", "number", "Vector3", "Color3", "UDim2", "BrickColor" и т.д.

for _, attr in ipairs(game.Workspace:GetAttributes()) do
print(attr.Name, attr.TypeName, attr.Value)
end

GetFirstAttributeOfType(typeName)

Возвращает первую запись атрибута чей TypeName совпадает с аргументом, или nil когда совпадений нет. Та же форма что у GetAttribute.

SetAttribute(name, value) - нерабочий в этом билде

Вызов принимает name: string плюс value любого из стандартных типов атрибутов (bool, number, string, Vector3, Color3, ...) и ничего не возвращает. Молчаливо no-op'ится: значение не сохраняется, а следующий GetAttribute(name) возвращает nil.

ВызовПроверенный результат
part:SetAttribute("Key", 42)проходит, без ошибки, значение не сохранено
part:SetAttribute("Key", "abc")проходит, не сохранено
part:SetAttribute("Key", true)проходит, не сохранено
part:SetAttribute("Key", Vector3.new(1, 2, 3))проходит, не сохранено
instance:SetAttribute("Foo", nil)error: "bad argument #3 to '?' (unsupported type for attribute value)" (нельзя очистить через nil)

SetHighlightOnTop

instance:SetHighlightOnTop() -> nothing

Для instance класса Highlight переключает highlight в режим рендеринга поверх всего (игнорируя глубину). No-op для других классов instance.

local hl = Instance.new("Highlight")
hl.Parent = part
hl:SetHighlightOnTop()

SetHighlightTransparency

instance:SetHighlightTransparency(value: number) -> nothing

Задаёт FillTransparency highlight. Диапазон значения 0..1 (0 = полностью непрозрачная заливка, 1 = полностью прозрачная заливка).


Destroy

instance:Destroy() -> nothing

Уничтожает instance (parents в nil, блокирует объект). Стандартная семантика Roblox.

Сайд-эффект на живой игре

Это реально удаляет instance из дерева Roblox-игры. Не вызывай на Workspace, Players или любом сервисе - это может крашнуть клиент.


Свойства

Чтение свойства возвращает nil если базовый класс не выставляет это поле. Чит выставляет объединение полей по всем распространённым Roblox-классам.

ИмяТипОписание
NamestringИмя instance. Проверено "Workspace" на game.Workspace.
ClassNamestringИмя класса instance. Проверено "Workspace" на game.Workspace.
ParentInstanceРодитель в иерархии (Workspace.Parent это userdata DataModel).
AddressnumberМладшие 32 бита C++ указателя instance. Проверено 488443520 на game.Workspace в одном запуске.
CharacterInstanceМодель персонажа Player.
PositionVector33D-позиция Part.
SizeVector3Размер Part.
VelocityVector3Скорость Part.
RotationVector3Поворот Part (Euler XYZ в градусах).
ColorColor3Color3 значение Part.
MaterialstringМатериал Part.
TransparencynumberПрозрачность Part (0-1).
ReflectancenumberReflectance Part (0-1).
CanCollidebooleanМожет ли Part участвовать в коллизиях.
HealthnumberТекущее здоровье Humanoid.
MaxHealthnumberМаксимальное здоровье Humanoid.
MoveDirectionVector3Направление движения Humanoid.
MeshIdstringID меш-ассета MeshPart.
TextureIdstringID текстурного ассета.
SoundIdstringID звукового ассета.
LookVectorVector3Направление взгляда Camera (forward-ось CFrame). Проверено userdata на Camera.
RightVectorVector3Right-направление Camera. Проверено userdata на Camera.
UpVectorVector3Up-направление Camera. Проверено userdata на Camera.
Fov / FieldOfViewnumberПоле зрения Camera в радианах. Проверено 1.2217305898666 (= 70°) на Camera. Оба имени - алиасы одного поля.
CameraSubjectInstanceSubject камеры.
FillColorColor3Цвет заливки Highlight.
OutlineColorColor3Цвет контура Highlight.
FillTransparencynumberПрозрачность заливки Highlight.
DepthModenumberDepth mode Highlight.
ValueanyЗначение объекта ValueBase.
StringValuestringЗначение StringValue instance.
NumberValuenumberЗначение NumberValue instance.
IntValuenumberЗначение IntValue instance.
BoolValuebooleanЗначение BoolValue instance.
ObjectValueInstanceЗначение ObjectValue instance.
TextLabelValuestringТекстовое содержимое TextLabel.
TextColor3Color3Цвет текста TextLabel.
Нет свойства CFrame

Проверено вживую: cam.CFrame вернул nil на реальном Camera. Чит выставляет компоненты CFrame (LookVector, RightVector, UpVector, Position), но не саму CFrame. Чтобы реконструировать ориентацию используй три направляющих вектора плюс Position.


Паттерны

Walk children с фильтром по классу

local PART_CLASSES = {
Part = true, MeshPart = true, WedgePart = true,
TrussPart = true, CornerWedgePart = true,
}

local function visible_parts(root)
local out = {}
for _, child in ipairs(root:GetChildren()) do
if PART_CLASSES[child.ClassName] and child.Transparency < 1 then
out[#out + 1] = child
end
end
return out
end

Прочитать все атрибуты с модели

local function dump_attributes(inst)
print(inst.Name, inst.ClassName)
for _, a in ipairs(inst:GetAttributes()) do
print(string.format(" %-24s %-10s %s",
a.Name, a.TypeName, tostring(a.Value)))
end
end

dump_attributes(game.Workspace)

Camera info HUD

cheat.Register("onPaint", function()
local cam = game.Workspace:FindFirstChildOfClass("Camera")
if not cam then return end
local fov_deg = cam.FieldOfView * 57.2957795
local lv = cam.LookVector
draw.TextOutlined(string.format("FOV %.1f deg", fov_deg),
10, 10, Color3.fromRGB(255, 255, 255), "ConsolasBold", 1)
draw.TextOutlined(string.format("Look %.2f %.2f %.2f", lv.X, lv.Y, lv.Z),
10, 26, Color3.fromRGB(200, 200, 200), "ConsolasBold", 1)
end)

Найти глубокий descendant

-- FindFirstDescendant searches the subtree but order is implementation-defined.
-- For predictable behavior, walk GetDescendants yourself.
local function find_by_name_class(root, name, cls)
for _, d in ipairs(root:GetDescendants()) do
if d.Name == name and d.ClassName == cls then return d end
end
return nil
end

local hrp = find_by_name_class(game.Workspace, "HumanoidRootPart", "Part")

Подсветить все parts в модели

local function highlight_model(model, fill_alpha)
for _, d in ipairs(model:GetDescendants()) do
if d.ClassName == "Part" or d.ClassName == "MeshPart" then
local hl = Instance.new("Highlight")
hl.FillColor = Color3.fromRGB(255, 90, 90)
hl.OutlineColor = Color3.fromRGB(255, 255, 255)
hl.Parent = d
hl:SetHighlightOnTop()
hl:SetHighlightTransparency(fill_alpha or 0.5)
end
end
end