Блог школы Роблоппа — Роблокс Студио, обучение, познавательные статьи и новости школы

Ошибка «attempt to index nil» в Роблокс Студио

Документация
Ошибка attempt to index nil — одна из самых распространённых ошибок, с которой сталкиваются начинающие разработчики в Роблокс Студио.
На первый взгляд сообщение может показаться сложным, но его смысл довольно простой: скрипт пытается обратиться к объекту или значению, которого сейчас нет.
Например, код пытается получить свойство Name, Position или Parent у переменной, которая имеет значение nil.
Разберём, почему появляется эта ошибка и как её исправить.

Что означает nil

В Lua значение nil означает, что переменная не содержит значения.
Например:
local player = nil
В этом случае переменная player существует, но внутри неё ничего нет.
Если затем написать:
print(player.Name)
скрипт пытается получить свойство Name у nil.
В Output появится ошибка, связанная с:
attempt to index nil with 'Name'
То есть Roblox сообщает:
«Невозможно получить свойство Name, потому что вместо объекта находится nil».

Простой пример ошибки

Представим такой код:
local part = workspace:FindFirstChild("MyPart")
print(part.Name)
Метод FindFirstChild() ищет объект с названием MyPart.
Если такого объекта нет в Workspace, переменная:
part
получит значение nil.
Следующая строка:
print(part.Name)
попытается обратиться к Name у nil.
В Output появится ошибка.

Как исправить ошибку

Перед использованием объекта можно проверить, найден ли он:
local part = workspace:FindFirstChild("MyPart")
if part then
print(part.Name)
else
warn("MyPart не найден")
end
Теперь скрипт сначала проверяет значение part.
Если объект существует, выполняется:
print(part.Name)
Если объекта нет, появится предупреждение:
MyPart не найден
Это намного удобнее, чем получать ошибку attempt to index nil.

Проверьте название объекта

Одна из самых частых причин ошибки — неправильное название объекта.
Например, в коде написано:
local part = workspace.MyPart
А в Explorer объект называется:
MyPart2
или:
myPart
В таком случае скрипт не сможет найти нужный объект.
Проверьте:
  • правильность написания имени;
  • заглавные и строчные буквы;
  • наличие пробелов;
  • не переименован ли объект;
  • находится ли он в нужном месте.

Проверьте расположение объекта

Иногда название правильное, но объект находится в другой части Explorer.
Например, структура выглядит так:
Workspace
└── House
└── Door
Если написать:
workspace.Door
скрипт не найдёт дверь, потому что она находится внутри House.
Правильный путь:
workspace.House.Door
Поэтому при ошибке attempt to index nil всегда полезно посмотреть структуру объектов в Explorer.

Ошибка может возникать из-за неправильного пути

Рассмотрим пример:
local house = workspace.House
local door = house.Door
print(door.Name)
Если House отсутствует, переменная house не будет содержать нужный объект.
Проблема возникнет уже при обращении к:
house.Door
Поэтому иногда нужно проверять не только последний объект, но и весь путь.
Например:
local house = workspace:FindFirstChild("House")
if house then
local door = house:FindFirstChild("Door")
if door then
print(door.Name)
end
end

Объект может ещё не существовать

Ещё одна причина — скрипт выполняется раньше, чем нужный объект появляется в игре.
Например, скрипт сразу пытается получить персонажа игрока:
local player = game.Players:GetPlayers()[1]
local character = player.Character
print(character.Name)
В некоторых ситуациях персонаж ещё может не быть готов.
Для таких случаев используются события, например CharacterAdded.
game.Players.PlayerAdded:Connect(function(player)
player.CharacterAdded:Connect(function(character)
print(character.Name)
end)
end)
Так код реагирует на появление персонажа.

Ошибка при работе с игроком

При работе с игроками также легко получить nil.
Например:
local player = game.Players:FindFirstChild("Player")
print(player.Name)
Если игрока с таким именем нет, player будет равен nil.
Лучше проверить результат:
local player = game.Players:FindFirstChild("Player")
if player then
print(player.Name)
else
warn("Игрок не найден")
end

Как быстро найти причину ошибки

Если в Output появилась:
attempt to index nil
сначала посмотрите на строку, которую указал Roblox.
Например:
Workspace.Script:10: attempt to index nil with 'Position'
Здесь:
  • Workspace.Script — скрипт;
  • 10 — номер строки;
  • Position — свойство, к которому происходит обращение;
  • nil — значение, у которого этого свойства нет.
Затем найдите строку 10 и определите, какая переменная используется перед .Position.
Например:
part.Position = Vector3.new(0, 10, 0)
Здесь нужно проверить, существует ли part.

Используйте print() для проверки

Если непонятно, какая переменная стала nil, можно временно вывести её в Output:
print("part =", part)
Если Output показывает:
part = nil
значит, проблема найдена.
Также можно проверить тип:
print(typeof(part))
Если объект найден, результатом может быть:
Part
Если значение отсутствует:
nil

Основные причины ошибки attempt to index nil

В большинстве случаев проблема связана с одной из следующих причин:
  1. Объект не существует.
  2. Неправильно написано имя объекта.
  3. Объект находится не там, где ожидает скрипт.
  4. Переменная не получила значение.
  5. Объект ещё не успел появиться.
  6. Используется неправильный путь в Explorer.
  7. Скрипт выполняется раньше нужного события.
  8. Метод поиска объекта не смог его найти.

Простая схема исправления

Если появилась ошибка attempt to index nil, действуйте по следующему алгоритму:
1. Откройте Output.
Найдите сообщение об ошибке и номер строки.
2. Откройте указанную строку.
Посмотрите, какая переменная используется перед точкой.
Например:
part.Position
3. Проверьте переменную.
Добавьте:
print(part)
4. Проверьте Explorer.
Убедитесь, что объект существует и находится в правильном месте.
5. Проверьте имя.
Даже одна неправильная буква может привести к ошибке.
6. Добавьте проверку if.
Например:
if part then
print(part.Name)
end
Такой подход помогает быстро найти причину проблемы.

Итог

Ошибка attempt to index nil означает, что скрипт пытается обратиться к свойству или методу значения, которого нет.
Если вы видите:
attempt to index nil with 'Name'
это означает, что код пытается получить Name у значения nil.
Главное — не переписывать весь скрипт. Сначала найдите строку ошибки, проверьте переменную, объект в Explorer, его название и расположение.
Со временем такие ошибки будут находиться гораздо быстрее, а Output станет одним из главных инструментов при создании игр в Роблокс Студио.

🔗 Полезные ссылки:

🚀 Хочешь научиться делать свои игры?

Переходи на roblo.ru и запишись на обучение Роблокс Студио!
И не забудь заглянуть в наш Telegram 👉 t.me/robloppo
Made on
Tilda