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

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.

Формат возврата перепроверен на version-460909c4fe904aae

Changelog клиента Serotonin перечисляет корректировку формата для LookVector / RightVector / UpVector. Перепроверено вживую на этом билде: все три возвращают стандартный Vector3 userdata, идентичный любому другому vector-свойству. tostring даёт "%.6f, %.6f, %.6f" (камера, смотрящая вперёд, печатает "-0.000000, -0.000000, -1.000000"); .X / .Y / .Z, lowercase-алиасы .x / .y / .z, .Magnitude и .Unit все резолвятся; числовая индексация (v[1]) возвращает nil. cam.CFrame по-прежнему nil.


Паттерны​

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