docs: 更新文档中的代码示例和链接引用

- 修复 IEventHandler 接口中的参数关键字冲突
- 修正场景管理器接口中的泛型约束拼写错误
- 本地化核心抽象文档链接为中文标题
- 更新事件系统文档中的接口链接路径
- 修复扩展方法文档中的上下文感知链接
- 调整日志系统文档中的接口链接路径
- 重构架构概述中的代码示例和设计原则
- 统一 Godot 设置模块中的代码块格式
- 优化音频和图形设置的代码示例
This commit is contained in:
GeWuYou 2026-02-11 14:49:34 +08:00
parent d1cdac8082
commit 6cc0ddf7f9
7 changed files with 80 additions and 68 deletions

View File

@ -97,7 +97,7 @@ public interface IEvent
```csharp
public interface IEventHandler<TEvent> where TEvent : IEvent
{
void Handle(TEvent event);
void Handle(TEvent @event);
}
```

View File

@ -65,7 +65,7 @@ public interface IGameSettings
public interface ISceneManager
{
void SwitchScene<TScene>() where TScene : IScene;
Task SwitchSceneAsync<TScene>() where TScnee : IScene;
Task SwitchSceneAsync<TScene>() where TScene : IScene;
void PushScene<TScene>() where TScene : IScene;
void PopScene();
@ -108,6 +108,6 @@ public interface IAssetManager
**相关文档**
- [Game 概述](../game)
- [Core Abstractions](./core-abstractions)
- [核心抽象](./core-abstractions)
- [存档系统](../game/storage)
- [场景管理](../game/scene-management)

View File

@ -6,7 +6,7 @@ Events 包提供了一套完整的事件系统实现了观察者模式Obse
## 核心接口
### 1. [`IEvent`](./events.md)
### 1. [IEvent](../GFramework.Core.Abstractions/events/IEvent.cs)
基础事件接口,定义了事件注册的基本功能。
@ -16,7 +16,7 @@ Events 包提供了一套完整的事件系统实现了观察者模式Obse
IUnRegister Register(Action onEvent); // 注册事件处理函数
```
### 2. [`IUnRegister`](./events.md)
### 2. [IUnRegister](../GFramework.Core.Abstractions/events/IUnRegister.cs)
注销接口,用于取消事件注册。
@ -26,7 +26,7 @@ IUnRegister Register(Action onEvent); // 注册事件处理函数
void UnRegister(); // 执行注销操作
```
### 3. [`IUnRegisterList`](./events.md)
### 3. [IUnRegisterList](../GFramework.Core.Abstractions/events/IUnRegisterList.cs)
注销列表接口,用于批量管理注销对象。
@ -36,7 +36,7 @@ void UnRegister(); // 执行注销操作
IList<IUnRegister> UnregisterList { get; } // 获取注销列表
```
### 4. [`IEventBus`](./events.md)
### 4. [IEventBus](../GFramework.Core.Abstractions/events/IEventBus.cs)
事件总线接口,提供基于类型的事件发送和注册。
@ -50,7 +50,7 @@ void Send<T>() where T : new(); // 发送事件(自动创建实例
## 核心类
### 1. [`EasyEvent`](./events.md)
### 1. [EasyEvent](EasyEvent.cs)
无参事件类,支持注册、注销和触发无参事件。
@ -73,7 +73,7 @@ onClicked.Trigger();
unregister.UnRegister();
```
### 2. [`Event<T>`](./events.md)
### 2. [Event<T>](EasyEvent.cs)
单参数泛型事件类,支持一个参数的事件。
@ -93,13 +93,13 @@ onScoreChanged.Register(newScore =>
onScoreChanged.Trigger(100);
```
### 3. [`Event<T, TK>`](./events.md)
### 3. [Event<T, TK>](EasyEvent.cs)
双参数泛型事件类。
**使用示例:**
```csharp
```
// 伤害事件:攻击者、伤害值
var onDamageDealt = new Event<string, int>();
@ -117,7 +117,7 @@ onDamageDealt.Trigger("Player", 50);
**使用示例:**
```csharp
``csharp
// 注册全局事件类型
EasyEvents.Register<GameStartEvent>();
@ -140,7 +140,7 @@ gameStartEvent.Trigger();
**使用示例:**
```csharp
``csharp
// 使用全局事件系统
var eventBus = new EventBus();
@ -166,7 +166,7 @@ eventBus.Send<PlayerDiedEvent>();
**使用示例:**
```csharp
``csharp
Action onUnregister = () => GD.Print("Unregistered");
var unregister = new DefaultUnRegister(onUnregister);
@ -180,7 +180,7 @@ unregister.UnRegister();
**使用示例:**
```csharp
``csharp
var onAnyInput = new OrEvent()
.Or(onKeyPressed)
.Or(onMouseClicked)
@ -199,7 +199,7 @@ onAnyInput.Register(() =>
**使用示例:**
```csharp
``csharp
var unregisterList = new UnRegisterList();
// 添加到列表

View File

@ -6,10 +6,10 @@ Extensions 包提供了一系列扩展方法,简化了框架各个接口的使
## 扩展方法类别
### 1. ContextAware 扩展 ([`ContextAwareExtensions.cs`](./extensions.md))
### 1. ContextAware 扩展 ([ContextAwareExtensions.cs](ContextAwareExtensions.cs))
为 [`IContextAware`](./rule.md)
提供扩展方法,允许直接从实现了 [IContextAware](./rule.md)
为 [IContextAware](../GFramework.Core.Abstractions/rule/IContextAware.cs)
提供扩展方法,允许直接从实现了 [IContextAware](../GFramework.Core.Abstractions/rule/IContextAware.cs)
的对象获取架构组件。
#### GetSystem 扩展方法
@ -91,7 +91,7 @@ public static TResult SendCommand<TResult>(this IContextAware contextAware, ICom
**使用示例:**
```csharp
```
public class GameController : IController
{
public void OnStartButtonClicked()

View File

@ -6,7 +6,7 @@ Logging 包提供了灵活的日志系统,支持多级别日志记录。默认
## 核心接口
### [ILogger](./logging.md)
### [ILogger](../GFramework.Core.Abstractions/logging/ILogger.cs)
日志记录器接口,定义了日志记录的基本功能。
@ -62,7 +62,7 @@ void Fatal(string msg, Exception t);
string Name();
```
### [ILoggerFactory](./logging.md)
### [ILoggerFactory](../GFramework.Core.Abstractions/logging/ILoggerFactory.cs)
日志工厂接口,用于创建日志记录器实例。
@ -72,7 +72,7 @@ string Name();
ILogger GetLogger(string name, LogLevel minLevel = LogLevel.Info);
```
### [ILoggerFactoryProvider](./logging.md)
### [ILoggerFactoryProvider](../GFramework.Core.Abstractions/logging/ILoggerFactoryProvider.cs)
日志工厂提供程序接口,用于获取日志工厂。
@ -83,7 +83,7 @@ ILoggerFactory GetLoggerFactory();
ILogger CreateLogger(string name);
```
### [LogLevel](./logging.md)
### [LogLevel](../GFramework.Core.Abstractions/logging/LogLevel.cs)
日志级别枚举。

View File

@ -95,36 +95,48 @@ public class PlayerModel : AbstractModel
应用的业务逻辑处理层。
```csharp
``csharp
public class CombatSystem : AbstractSystem
{
protected override void OnInit()
{
// 监听战斗相关事件
this.RegisterEvent<EnemyAttackEvent>(OnEnemyAttack);
this.RegisterEvent<PlayerAttackEvent>(OnPlayerAttack);
// 订阅相关事件
this.GetEvent<AttackEvent>().Register(OnAttack);
}
private void OnAttack(AttackEvent e)
{
var attacker = e.Attacker;
var target = e.Target;
// 计算伤害
var damage = CalculateDamage(attacker, target);
// 更新目标生命值
target.Health.Value -= damage;
// 发送伤害事件
this.SendEvent(new DamageEvent(target, damage));
}
private void OnEnemyAttack(EnemyAttackEvent e)
private int CalculateDamage(Entity attacker, Entity target)
{
var playerModel = this.GetModel<PlayerModel>();
playerModel.Health.Value -= e.Damage;
this.SendEvent(new PlayerTookDamageEvent { Damage = e.Damage });
return Mathf.Max(1, attacker.Attack.Value - target.Defense.Value);
}
}
```
**职责范围:**
**设计原则**
- 处理具体的业务逻辑
- 响应事件并修改模型数据
- 发送新的事件通知其他组件
- 处理业务逻辑,不直接存储数据
- 通过事件与其他组件通信
- 从 Model 获取数据,向 Model 发送
### 4. Controller控制器
连接 UI 和业务逻辑的桥梁。
```csharp
``csharp
public class PlayerController : IController
{
private IArchitecture _architecture;
@ -164,7 +176,7 @@ public class PlayerController : IController
提供无状态的辅助功能。
```csharp
``csharp
public class StorageUtility : IUtility
{
public void SaveData<T>(string key, T data)
@ -193,7 +205,7 @@ public class StorageUtility : IUtility
用于修改应用状态的操作:
```csharp
``csharp
public class MovePlayerCommand : AbstractCommand
{
public Vector2 Direction { get; set; }
@ -208,9 +220,9 @@ public class MovePlayerCommand : AbstractCommand
### 2. Query查询
用于查询应用状态:
用于查询应用状态:`
```csharp
``csharp
public class GetPlayerHealthQuery : AbstractQuery<int>
{
protected override int OnDo()
@ -223,9 +235,9 @@ public class GetPlayerHealthQuery : AbstractQuery<int>
### 3. Event事件
组件间通信的主要机制:
组件间通信的主要机制:`
```csharp
```
// 发送事件
this.SendEvent(new PlayerDiedEvent());
@ -237,7 +249,7 @@ this.RegisterEvent<PlayerDiedEvent>(OnPlayerDied);
### BindableProperty
```csharp
``csharp
public class PlayerModel : AbstractModel
{
public BindableProperty<int> Health { get; } = new(100);
@ -262,7 +274,7 @@ playerModel.Health.Register(newValue => {
### 1. 分层职责明确
```csharp
``csharp
// ✅ 正确Model 只存储数据
public class PlayerModel : AbstractModel
{
@ -281,7 +293,7 @@ public class PlayerModel : AbstractModel
### 2. 事件驱动设计
```csharp
``csharp
// ✅ 正确:使用事件解耦
public class CombatSystem : AbstractSystem
{
@ -305,7 +317,7 @@ public class CombatSystem : AbstractSystem
### 3. 命令查询分离
```csharp
``csharp
// ✅ 正确:明确区分命令和查询
public class MovePlayerCommand : AbstractCommand { } // 修改状态
public class GetPlayerPositionQuery : AbstractQuery<Vector2> { } // 查询状态

View File

@ -86,7 +86,7 @@ graph TD
#### 基本音频设置
```csharp
``csharp
// 创建音频配置数据
var settings = new AudioSettings
{
@ -99,12 +99,12 @@ var settings = new AudioSettings
var audioSettings = new GodotAudioSettings(settings, new AudioBusMap());
// 应用设置
await audioSettings.Apply();
audioSettings.Apply();
```
#### 自定义音频总线映射
```csharp
``csharp
// 自定义音频总线映射
var customBusMap = new AudioBusMap
{
@ -128,7 +128,7 @@ await audioSettings.Apply();
#### 通过设置系统使用
```csharp
``csharp
// 注册音频设置到设置模型
var settingsModel = this.GetModel<ISettingsModel>();
var audioSettingsData = settingsModel.Get<AudioSettings>();
@ -145,7 +145,7 @@ await godotAudioSettings.Apply();
#### 基本图形设置
```csharp
``csharp
// 创建图形设置
var graphicsSettings = new GodotGraphicsSettings
{
@ -160,7 +160,7 @@ await graphicsSettings.Apply();
#### 窗口模式切换
```csharp
``csharp
public class DisplayManager : Node
{
private GodotGraphicsSettings _graphicsSettings;
@ -188,7 +188,7 @@ public class DisplayManager : Node
#### 预设分辨率配置
```csharp
``csharp
public class ResolutionPresets
{
public static readonly (int width, int height)[] CommonResolutions =
@ -214,7 +214,7 @@ public class ResolutionPresets
### AudioBusMap
```csharp
``csharp
public sealed class AudioBusMap
{
public string Master { get; init; } = "Master";
@ -231,7 +231,7 @@ public sealed class AudioBusMap
### GodotAudioSettings
```csharp
``csharp
public class GodotAudioSettings(AudioSettings settings, AudioBusMap busMap) : IApplyAbleSettings
{
public Task Apply();
@ -245,7 +245,7 @@ public class GodotAudioSettings(AudioSettings settings, AudioBusMap busMap) : IA
**Apply 方法实现:**
```csharp
``csharp
public Task Apply()
{
SetBus(busMap.Master, settings.MasterVolume);
@ -257,7 +257,7 @@ public Task Apply()
### GodotGraphicsSettings
```csharp
``csharp
public class GodotGraphicsSettings : GraphicsSettings, IApplyAbleSettings
{
public Task Apply();
@ -277,7 +277,7 @@ public class GodotGraphicsSettings : GraphicsSettings, IApplyAbleSettings
Godot 音频系统使用分贝dB作为音量单位而我们通常使用线性值0-1
```csharp
``csharp
// 线性值到分贝转换
float linearVolume = 0.5f; // 50% 音量
float dbVolume = Mathf.LinearToDb(linearVolume); // 转换为分贝
@ -290,7 +290,7 @@ AudioServer.SetBusVolumeDb(busIndex, dbVolume);
为避免完全静音(-inf dB应用了最小音量限制
```csharp
``csharp
float clampedVolume = Mathf.Clamp(linear, 0.0001f, 1f);
float dbVolume = Mathf.LinearToDb(clampedVolume);
```
@ -299,7 +299,7 @@ float dbVolume = Mathf.LinearToDb(clampedVolume);
#### 全屏模式
```csharp
``csharp
// 设置全屏
DisplayServer.WindowSetMode(DisplayServer.WindowMode.ExclusiveFullscreen);
DisplayServer.WindowSetFlag(DisplayServer.WindowFlags.Borderless, true);
@ -307,7 +307,7 @@ DisplayServer.WindowSetFlag(DisplayServer.WindowFlags.Borderless, true);
#### 窗口化模式
```csharp
``csharp
// 设置窗口化
DisplayServer.WindowSetMode(DisplayServer.WindowMode.Windowed);
DisplayServer.WindowSetSize(newSize);
@ -325,7 +325,7 @@ DisplayServer.WindowSetPosition(position);
#### 音量变化平滑过渡
```csharp
``csharp
public class AudioManager : Node
{
private Tween _volumeTween;
@ -398,7 +398,7 @@ public class CustomAudioManager : Node
#### 音频设置验证
```csharp
``csharp
public static class AudioSettingsValidator
{
public static bool ValidateBusNames(AudioBusMap busMap)
@ -428,7 +428,7 @@ public static class AudioSettingsValidator
#### 分辨率变更安全检查
```csharp
``csharp
public static class DisplayValidator
{
public static bool IsResolutionSupported(int width, int height)
@ -451,7 +451,7 @@ public static class DisplayValidator
#### 图形设置持久化
```csharp
``csharp
public class GraphicsSettingsManager : Node
{
private const string SettingsKey = "graphics_settings";
@ -545,7 +545,7 @@ public class GraphicsSettingsManager : Node
#### 音频调试
```csharp
``csharp
// 打印所有音频总线信息
for (int i = 0; i < AudioServer.GetBusCount(); i++)
{
@ -557,7 +557,7 @@ for (int i = 0; i < AudioServer.GetBusCount(); i++)
#### 图形调试
```csharp
``csharp
// 打印当前显示信息
var screen = DisplayServer.GetPrimaryScreen();
var screenSize = DisplayServer.ScreenGetSize(screen);