---
title: AutoScene 生成器
description: 介绍 AutoScene 生成器如何生成场景包装入口与统一场景键声明。
---

# AutoScene 生成器

> 为场景根节点生成 `GetScene()` 样板，统一场景键声明与行为包装。

## 概述

`AutoScene` 面向 GFramework 的场景路由与场景行为包装场景。
对于一个可切换、可识别的场景根节点，开发者通常需要重复声明：

- 场景 Key
- 场景行为缓存字段
- `GetScene()` 包装方法

`AutoScene` 会在编译期生成这些固定样板。
该特性当前位于 `GFramework.Godot.SourceGenerators.Abstractions.UI` 命名空间。

## 基础使用

```csharp
using GFramework.Godot.SourceGenerators.Abstractions.UI;
using GFramework.Game.Abstractions.Enums;
using Godot;

[AutoScene(nameof(SceneKey.Gameplay))]
public partial class GameplayRoot : Node2D
{
    public override void _Ready()
    {
        _ = GetScene();
    }
}
```

## 生成的代码

```csharp
// <auto-generated />
#nullable enable

partial class GameplayRoot
{
    private global::GFramework.Game.Abstractions.Scene.ISceneBehavior? __autoSceneBehavior_Generated;

    public static string SceneKeyStr => "Gameplay";

    public global::GFramework.Game.Abstractions.Scene.ISceneBehavior GetScene()
    {
        return __autoSceneBehavior_Generated
            ??= global::GFramework.Godot.Scene.SceneBehaviorFactory.Create(this, SceneKeyStr);
    }
}
```

## 参数说明

`[AutoScene]` 只接收一个字符串参数：

| 参数    | 类型       | 说明                     |
|-------|----------|------------------------|
| `key` | `string` | 场景 Key，例如 `"Gameplay"` |

推荐使用 `nameof(SceneKey.Gameplay)` 而不是裸字符串。

## 适用场景

推荐用于：

- 主玩法根场景
- 主菜单根场景
- 局内关卡根节点
- 使用 GFramework 场景路由管理的切换目标

不推荐用于：

- 普通子节点或容器节点
- 只会被父节点内部消费、没有独立场景语义的脚本
- 行为创建需要额外动态参数的场景包装

## 使用约束

- 目标类型必须是 `partial class`
- 不支持嵌套类
- 目标类型必须继承 `Godot.Node`
- 不要自行声明 `GetScene()`
- 不要自行声明同名保留成员，例如 `SceneKeyStr`

## 生命周期边界

`AutoScene` 不会自动改写或生成：

- `_Ready()`
- `_EnterTree()`
- `_ExitTree()`
- 场景切换调用链

它只负责提供稳定的场景行为访问入口。何时调用 `GetScene()`，仍由你的节点生命周期和场景系统决定。

## 诊断信息

| 诊断 ID                 | 含义                                  |
|-----------------------|-------------------------------------|
| `GF_Common_Class_001` | 目标类型不是 `partial`，生成被跳过              |
| `GF_Common_Class_002` | 宿主类型已声明 `GetScene()` 或保留成员名，和生成代码冲突 |
| `GF_AutoBehavior_001` | `AutoScene` 不支持嵌套类                  |
| `GF_AutoBehavior_002` | 目标类型没有继承 `Godot.Node`               |
| `GF_AutoBehavior_004` | `AutoSceneAttribute` 参数数量或类型不符合要求   |

如果你自己声明了 `SceneKeyStr`、`__autoSceneBehavior_Generated` 或 `GetScene()`，编译阶段还会出现成员冲突错误或对应的冲突诊断。

## 与页面生成器的区别

- `AutoUiPage` 生成的是 `IUiPageBehavior` 与 `UiLayer`
- `AutoScene` 生成的是 `ISceneBehavior` 与场景 Key

一个类型通常只应承担一种路由语义。不要把纯页面节点和纯场景根节点混为一体。

## 相关文档

- [源码生成器总览](./index.md)
- [AutoUiPage 生成器](./auto-ui-page-generator.md)
