Все статьи
7 августа 2026 г.·4 мин чтения

Accessed None Trying to Read Property: почему падает Blueprint

Что означает Blueprint Runtime Error «Accessed None trying to read property», как прочитать имя переменной и узла из текста ошибки и чем IsValid отличается от Validated Get.

Blueprint Runtime Error: "Accessed None trying to read property CallFunc_GetActorOfClass_ReturnValue".
Node: Set Health  Graph: EventGraph  Function: Execute Ubergraph  Blueprint: BP_PlayerCharacter

Если ты видел такое в логе, у тебя не сломался движок. Это самая частая ошибка в Blueprint, и означает она ровно одно: ты обратился к объекту, которого нет.

Русских статей под этот запрос практически нет — только англоязычные форумные ветки разной степени свежести. Поэтому разберём подробно, включая ту часть, которую обычно пропускают: как прочитать саму ошибку.

Что произошло

В Blueprint переменная-ссылка на объект может быть пустой. Пустая ссылка называется None — это аналог null.

Когда ты тянешь провод от такой переменной к чему-нибудь вроде Get Health или Set Location, движок пытается прочитать свойство у объекта, которого не существует. Выполнение узла обрывается, в лог падает Accessed None, и дальше по цепочке начинается странное: значения не те, события не срабатывают.

Важно: игра при этом обычно не крашится. Blueprint переживает такую ошибку и идёт дальше, поэтому её легко не заметить, пока не начнёшь искать причину непонятного поведения.

Как прочитать текст ошибки

Это главный навык, и он экономит больше времени, чем любые советы по исправлению. Сообщение устроено так:

Accessed None trying to read property X — X это имя пустой переменной. Если оно выглядит как CallFunc_GetActorOfClass_ReturnValue, значит переменной у тебя нет: пустым оказался результат вызова функции. В примере выше — Get Actor Of Class ничего не нашёл. Префикс CallFunc_ всегда указывает на возвращаемое значение узла, а не на твою переменную. Похожий префикс K2Node_DynamicCast_AsBP_... означает, что пустым оказался результат каста.

Node: — конкретный узел, на котором всё оборвалось. Именно его надо искать в графе.

Graph: и Function: — где этот узел лежит. Execute Ubergraph означает EventGraph.

Blueprint: — в каком ассете. Если ошибка приходит из чужого Blueprint, а ты правишь свой, дело не в твоём.

Двойной клик по строке ошибки в логе открывает нужный узел в графе. Не ищи его глазами — Unreal умеет привести тебя прямо к месту.

Четыре типичные причины

Каст не удался. Ты кастуешь к BP_MyCharacter, а объект другого класса. Каст возвращает None, и всё, что подключено дальше, работает с пустотой. Отличить легко: у Cast To есть выход Cast Failed, и если он не обработан, проблема обычно тут.

Объект ещё не создан. Классика на BeginPlay. Ты обращаешься к виджету, контроллеру или другому актору раньше, чем он появился. Порядок инициализации в Unreal не гарантирован так, как хочется.

Функция ничего не нашла. Get Actor Of Class, Get Player Pawn, Find Component честно возвращают None, если объекта нет. Это не ошибка функции, это ответ.

Объект уничтожен. Ссылка была валидной, но актор успел умереть — например, между событием и его обработкой. Частый случай на таймерах и задержках.

Как чинить

Правильный способ один: проверять ссылку перед использованием.

Узел IsValid принимает ссылку на объект и даёт два выхода: Is Valid и Is Not Valid. Полезная его особенность — он ловит не только пустые ссылки, но и объекты, помеченные на уничтожение. Обычное сравнение с None второй случай пропустит.

Есть и более короткий вариант: у переменной-ссылки в контекстном меню есть Convert to Validated Get. Обычный Get превращается в узел с двумя выходами, и ветка «пусто» появляется прямо на месте, без отдельного узла в графе.

Что использовать: Validated Get удобнее, когда проверка нужна в одном месте. IsValid понятнее, когда от результата зависит целая ветка логики.

И отдельно: не заглушай ошибку, а пойми, почему объект пустой. Обернуть всё в IsValid — это способ убрать сообщение из лога, но если объект должен был существовать, ты просто спрятал настоящий баг. Ошибка исчезнет, неправильное поведение останется.

Когда виноват не тот, кого видно

Неприятный сценарий: ошибка приходит из Blueprint, который ты не трогал, а причина в другом месте — там, где переменную должны были заполнить и не заполнили.

Тогда помогает обратный ход: найти все места, где эта переменная присваивается. В Unreal для этого есть поиск по всем Blueprint (Ctrl+Shift+F) — ищешь имя переменной и смотришь, какие Set есть в проекте и при каких условиях они выполняются.

На большом проекте это муторно: десятки совпадений, часть в неиспользуемых ветках. Здесь удобен агент с доступом к файлам проекта — ассеты Blueprint бинарные, но логи, конфиги и C++-часть текстовые, и по ним можно быстро сузить круг: когда ошибка появилась впервые, что менялось рядом, какие подсистемы затронуты.

Дока работает с проектом и терминалом напрямую и умеет разбирать логи целыми папками, а модель при этом может быть локальной — для проекта под NDA это принципиально. Для UE 5.8 есть и второй путь: подключить агента к редактору через встроенный MCP-сервер.

Короткий чеклист

Увидел Accessed None — не ищи в графе наугад.

  1. Прочитай имя свойства: CallFunc_ значит функция, K2Node_DynamicCast_ значит каст.
  2. Двойным кликом открой узел из строки лога.
  3. Пойми, почему объект пустой: не тот класс, ещё не создан, не найден, уже уничтожен.
  4. Поставь IsValid или Validated Get — и обработай ветку «пусто» осмысленно.
  5. Убедись, что ошибка исчезла не только из лога, но и по сути.

Если разбираешь чужой проект и таких ошибок сотни, скачай Доку и начни с логов: частотность по типам ошибок обычно быстро показывает, какие три места чинить первыми.