mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-05-07 00:39:00 +08:00
docs(game): 添加游戏内容配置系统文档
- 介绍面向静态游戏内容的 AI-First 配表方案 - 详细说明 YAML 配置源文件和 JSON Schema 结构描述功能 - 提供推荐的目录结构和完整的 Schema 与 YAML 示例 - 包含配置系统的接入模板和运行时读取方法 - 说明开发期热重载功能和 VS Code 工具集成 - 记录当前限制和独立 Config Studio 评估结论 - 提供 Architecture 推荐接入模板和热重载配置方法
This commit is contained in:
parent
cd32a006c6
commit
d99af1cfac
@ -92,7 +92,7 @@ dropItems:
|
|||||||
GameProject/
|
GameProject/
|
||||||
├─ GameProject.csproj
|
├─ GameProject.csproj
|
||||||
├─ Config/
|
├─ Config/
|
||||||
│ ├─ GameConfigBootstrap.cs
|
│ ├─ GameConfigHost.cs
|
||||||
│ └─ GameConfigRuntime.cs
|
│ └─ GameConfigRuntime.cs
|
||||||
├─ config/
|
├─ config/
|
||||||
│ ├─ monster/
|
│ ├─ monster/
|
||||||
@ -197,7 +197,12 @@ var slime = monsterTable.Get(1);
|
|||||||
bootstrap.Dispose();
|
bootstrap.Dispose();
|
||||||
```
|
```
|
||||||
|
|
||||||
如果你希望把它继续包装进自己的进程级入口,也建议只包一层生命周期壳,而不是重新拼装底层加载器:
|
如果你希望把它继续包装进自己的进程级入口,也建议只包一层生命周期壳,而不是重新拼装底层加载器。为了避免和后面的“运行时读取模板”冲突,推荐明确拆成两类文件:
|
||||||
|
|
||||||
|
- `GameConfigHost.cs` 负责生命周期管理、初始化和热重载
|
||||||
|
- `GameConfigRuntime.cs` 负责把已初始化的 `IConfigRegistry` 封装成业务层读取入口
|
||||||
|
|
||||||
|
如果你采用这套双层模板,建议把上面的生命周期壳文件命名为 `GameConfigHost.cs`,并把类型名同步改成 `GameConfigHost`:
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
using GFramework.Game.Abstractions.Config;
|
using GFramework.Game.Abstractions.Config;
|
||||||
@ -209,7 +214,7 @@ namespace GameProject.Config;
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 封装当前游戏进程的配置启动生命周期。
|
/// 封装当前游戏进程的配置启动生命周期。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public sealed class GameConfigRuntime : IDisposable
|
public sealed class GameConfigHost : IDisposable
|
||||||
{
|
{
|
||||||
private readonly GameConfigBootstrap _bootstrap;
|
private readonly GameConfigBootstrap _bootstrap;
|
||||||
|
|
||||||
@ -217,7 +222,7 @@ public sealed class GameConfigRuntime : IDisposable
|
|||||||
/// 使用指定配置根目录创建运行时入口。
|
/// 使用指定配置根目录创建运行时入口。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="configRootPath">配置根目录。</param>
|
/// <param name="configRootPath">配置根目录。</param>
|
||||||
public GameConfigRuntime(string configRootPath)
|
public GameConfigHost(string configRootPath)
|
||||||
{
|
{
|
||||||
_bootstrap = new GameConfigBootstrap(
|
_bootstrap = new GameConfigBootstrap(
|
||||||
new GameConfigBootstrapOptions
|
new GameConfigBootstrapOptions
|
||||||
@ -240,6 +245,15 @@ public sealed class GameConfigRuntime : IDisposable
|
|||||||
return _bootstrap.InitializeAsync();
|
return _bootstrap.InitializeAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 创建业务层使用的只读配置入口。
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>封装强类型表访问的读取入口。</returns>
|
||||||
|
public GameConfigRuntime CreateRuntime()
|
||||||
|
{
|
||||||
|
return new GameConfigRuntime(_bootstrap.Registry);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 释放底层热重载句柄等资源。
|
/// 释放底层热重载句柄等资源。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -262,6 +276,7 @@ public sealed class GameConfigRuntime : IDisposable
|
|||||||
推荐不要在业务代码里直接散落字符串表名查询,而是统一依赖生成的强类型入口:
|
推荐不要在业务代码里直接散落字符串表名查询,而是统一依赖生成的强类型入口:
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
|
using GFramework.Game.Abstractions.Config;
|
||||||
using GFramework.Game.Config.Generated;
|
using GFramework.Game.Config.Generated;
|
||||||
|
|
||||||
namespace GameProject.Config;
|
namespace GameProject.Config;
|
||||||
@ -303,6 +318,16 @@ public sealed class GameConfigRuntime
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
它通常与上面的 `GameConfigHost` 配合使用:
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
var configHost = new GameConfigHost("config-root");
|
||||||
|
await configHost.InitializeAsync();
|
||||||
|
|
||||||
|
var runtime = configHost.CreateRuntime();
|
||||||
|
var slime = runtime.GetMonster(1);
|
||||||
|
```
|
||||||
|
|
||||||
这样做的收益:
|
这样做的收益:
|
||||||
|
|
||||||
- 配置系统对业务层暴露的是强类型表,而不是 `"monster"` 这类 magic string
|
- 配置系统对业务层暴露的是强类型表,而不是 `"monster"` 这类 magic string
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user