reckfellENGINE

Автозагрузка: состояние между уровнями

SessionState, настройка проекта и C#-доступ к экземпляру; подписка, повторный вход и сброс забега.

На этой странице

Подключить SessionState

Добавьте SessionState.cs и SessionHud.cs в корень C#-проекта Reckfell 1.0.0, соберите. В Project → Project Settings → Globals → Autoload укажите asset://SessionState.cs и имя SessionState. Эквивалентная секция настроек приведена ниже: добавьте её в существующий project.reckfell, не заменяя весь файл и не создавая второй раздел autoload.

project.reckfell — раздел autoload
Конфигурация
[autoload]
SessionState="*asset://SessionState.cs"
SessionState.cs
C#
using Reckfell;

public partial class SessionState : Entity
{
    [Signal]
    public delegate void CoinsChangedEventHandler(int total);
    public int Coins { get; private set; }

    public bool AddCoins(int amount)
    {
        if (amount <= 0 || Coins > int.MaxValue - amount) return false;
        Coins += amount;
        EmitSignal(SignalName.CoinsChanged, Coins);
        return true;
    }

    public void ResetRun()
    {
        if (Coins == 0) return;
        Coins = 0;
        EmitSignal(SignalName.CoinsChanged, Coins);
    }
}
SessionHud.cs
C#
using Reckfell;

public partial class SessionHud : Label
{
    private SessionState? _session;

    public override void _EnterTree()
    {
        _session = GetEntityOrNull<SessionState>("/root/SessionState");
        if (_session is null)
        {
            Text = TranslationServer.GetLocale().StartsWith("ru") ? "Нет /root/SessionState" : "Missing /root/SessionState";
            return;
        }
        _session.CoinsChanged += Refresh;
        Refresh(_session.Coins);
    }

    public override void _ExitTree()
    {
        if (_session is not null && ReckfellObject.IsInstanceValid(_session)) _session.CoinsChanged -= Refresh;
        _session = null;
    }

    private void Refresh(int value) => Text = TranslationServer.GetLocale().StartsWith("ru")
        ? "Монеты: " + value + " · C: +1 · R: новый забег"
        : "Coins: " + value + " · C: +1 · R: new run";

    public override void _UnhandledKeyInput(InputEvent @event)
    {
        if (_session is null || @event is not InputEventKey { Pressed: true, Echo: false } key) return;
        if (key.Keycode == Key.C) _session.AddCoins(1);
        else if (key.Keycode == Key.R) _session.ResetRun();
        else return;
        GetViewport().SetInputAsHandled();
    }
}

В тестовом уровне создайте Label, разместите в видимой области и прикрепите SessionHud. Запустите F6: C добавляет монету, R явно начинает новый забег. При переходе через EntityTree состояние SessionState сохраняется, а новый HUD читает текущий снимок и подписывается на изменения.

Что создаёт автозагрузка

Настройка запуска создаёт Entity из скрипта или PackedEntity и добавляет под главный Root до стартового уровня. /root/SessionState — имя экземпляра в активном дереве. В C# класс SessionState не становится статическим объектом: получите экземпляр, как это делает HUD. Не вызывайте нестатический AddCoins через имя типа.

Автозагрузка не запрещает new SessionState или второй экземпляр того же префаба. Она не является автоматической защитой Singleton. Не создавайте вторую копию своей службы внутри каждого уровня, если намерены пользоваться общим экземпляром под Root.

Порядок зависимостей автозагрузок нужно проектировать явно. Не считайте, что любой сосед уже закончил _Ready во время раннего _EnterTree другого сервиса. Для взаимозависимой инициализации используйте отдельную точку сборки после создания служб, а не циклические обращения из конструкторов.

Подписка и сброс

HUD обновляется сразу из Coins, затем получает CoinsChanged. Он снимает обработчик в _ExitTree и при повторном входе читает свежий снимок. Это не теряет состояние, изменившееся, пока HUD был отсоединён. SessionState не знает путь до HUD и не удерживает его после корректной отписки.

ResetRun вызывается явно. Смена уровня сама по себе не означает новую игру и не очищает общую сессию. Данные в памяти не переживают закрытие процесса: для сохранения на диск нужна отдельная схема. Автозагрузка также не означает, что её методы автоматически защищены от паузы, потоков или сетевых запросов.

Настройка проверяется настоящим запуском движка с секцией autoload; сохранение Coins — нативной сменой уровня. Мышиные действия в окне Project Settings и готовый экспорт в этой проверке не выполнялись.

Документация Reckfell EngineНаверх ↑
БЫСТРЫЙ ПЕРЕХОДНачало работыEntity и иерархияC# & .NET 10Сцены и префабы
Руководства и полный API Reckfell K
reckfellENGINE
RECKFELL ACCOUNT

Вход в аккаунт

Войдите в аккаунт Reckfell.

Один аккаунт для всей платформы Reckfell.