C#: получить нужный тип и проверить время жизни
GetEntity, GetEntityOrNull, nullable и удалённая Entity на полном компоненте.
Выбрать поведение при отсутствии
| Вызов | Назначение |
|---|---|
| GetEntity<T>(path) | Обязательный объект; неверный существующий тип приводит к InvalidCastException |
| GetEntityOrNull<T>(path) | Необязательный объект; отсутствующий путь или несовместимый тип дают null |
| value is T typed | Проверка C#-типа уже полученного значения |
| ReckfellObject.IsInstanceValid(value) | Проверка, что нативный объект ещё существует |
Не заменяйте обязательную зависимость молчаливым null везде: ошибка структуры уровня должна быть видна. Для необязательного Status ниже отказ ожидаем и возвращается через bool.
ScriptBoundary.cs
using Reckfell;
public partial class ScriptBoundary : Entity
{
public int Count { get; private set; }
public bool Add(int amount)
{
if (amount <= 0 || Count > int.MaxValue - amount) return false;
Count += amount;
return true;
}
public bool ShowOnChild(string text)
{
Label? label = GetEntityOrNull<Label>("Status");
if (!ReckfellObject.IsInstanceValid(label)) return false;
label!.Text = text;
return true;
}
}Создайте Entity, прикрепите ScriptBoundary, добавьте дочерний Label с именем Status. ShowOnChild("Ready") меняет его текст. Без Status или с обычной Entity на его месте метод возвращает false. В стенде также проверен неверный обязательный cast: он выбрасывает InvalidCastException.
Nullable не проверяет native-объект
После label.Free() управляемая ссылка label может оставаться ненулевой. Проверка label != null и оператор ?. не подтверждают существование нативной Label. Для сохранённых ссылок проверяйте IsInstanceValid перед использованием. QueueFree откладывает удаление; не считайте, что после него объект уже освобождён.
Не храните результаты поиска дольше нужного без правил жизненного цикла. При внешних подписках снимайте обработчик в _ExitTree; повторный вход и _Ready имеют свои правила. Путь относителен текущей Entity; типизация не исправляет неверный путь или пространство дерева.
Где использовать async
Ожидание сигнала через ToSignal и обработчики показаны в руководстве по сигналам. async сам по себе не переводит код в рабочий поток и не гарантирует, что Entity переживёт ожидание. Не переносите работу с активным деревом в Task.Run по аналогии с чистым вычислением .NET.