From 629c0a70a9df29b9bcb845bdb3805935e673b084 Mon Sep 17 00:00:00 2001
From: GeWuYou <95328647+GeWuYou@users.noreply.github.com>
Date: Sun, 15 Feb 2026 15:17:55 +0800
Subject: [PATCH] =?UTF-8?q?refactor(scene):=20=E7=AE=80=E5=8C=96=20ISceneR?=
=?UTF-8?q?oot=20=E6=8E=A5=E5=8F=A3=E5=B9=B6=E9=87=8D=E6=9E=84=E5=9C=BA?=
=?UTF-8?q?=E6=99=AF=E8=B7=AF=E7=94=B1=E7=B3=BB=E7=BB=9F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 简化 ISceneRoot 接口,移除路由逻辑和状态管理职责
- 移除路由方法:ReplaceAsync, PushAsync, PopAsync, ClearAsync
- 移除场景加载方法:LoadAsync, UnloadAsync
- 移除状态属性:Current, Stack, IsTransitioning
- 添加容器管理方法:AddScene, RemoveScene
- 重构 SceneRouterBase 实现
- PushInternalAsync:使用 ISceneFactory.Create() 创建场景实例,通过 Root.AddScene() 添加到场景树
- PopInternalAsync:使用 Root.RemoveScene() 从场景树移除场景
- 保持正确的生命周期调用顺序
- 职责分离更清晰
- ISceneRoot:仅负责场景树容器管理
- ISceneFactory:负责场景实例创建
- SceneRouterBase:负责路由逻辑和生命周期协调
- 与 UI 路由系统设计保持一致
---
.../scene/ISceneRoot.cs | 72 +++----------------
GFramework.Game/scene/SceneRouterBase.cs | 15 ++--
2 files changed, 19 insertions(+), 68 deletions(-)
diff --git a/GFramework.Game.Abstractions/scene/ISceneRoot.cs b/GFramework.Game.Abstractions/scene/ISceneRoot.cs
index 22673b1..2cfd1d8 100644
--- a/GFramework.Game.Abstractions/scene/ISceneRoot.cs
+++ b/GFramework.Game.Abstractions/scene/ISceneRoot.cs
@@ -14,74 +14,22 @@
namespace GFramework.Game.Abstractions.scene;
///
-/// 场景根接口,定义了场景管理系统的核心功能。
-/// 负责管理场景的生命周期、场景栈操作以及场景间的切换控制。
+/// 场景根接口,定义了场景树容器的基本操作。
+/// 职责单一:管理场景节点的添加和移除。
///
public interface ISceneRoot
{
///
- /// 获取当前活动的场景行为对象。
- /// 返回null表示当前没有活动场景。
+ /// 向场景树添加场景节点。
+ /// 此方法仅负责将场景添加到场景树中,不涉及场景的加载逻辑。
///
- ISceneBehavior? Current { get; }
+ /// 要添加的场景行为实例。
+ void AddScene(ISceneBehavior scene);
///
- /// 获取所有已加载场景的行为对象列表。
- /// 列表采用栈式结构,索引0为栈底场景,最后一个元素为当前活动场景。
+ /// 从场景树移除场景节点。
+ /// 此方法仅负责从场景树中移除场景,不涉及场景的卸载逻辑。
///
- IReadOnlyList Stack { get; }
-
- ///
- /// 获取场景系统是否正在进行切换操作。
- /// true表示正在执行场景加载、卸载或切换,false表示系统空闲。
- ///
- bool IsTransitioning { get; }
-
- ///
- /// 异步替换当前场景,清空整个场景栈并加载新场景。
- /// 此操作会卸载所有现有场景,然后加载指定的新场景。
- ///
- /// 要加载的场景唯一标识符。
- /// 可选的场景进入参数,用于传递初始化数据。
- /// 表示替换操作完成的ValueTask。
- ValueTask ReplaceAsync(string key, ISceneEnterParam? param = null);
-
- ///
- /// 异步压入新场景到场景栈顶部。
- /// 当前场景会被暂停,新场景成为活动场景。
- ///
- /// 要加载的场景唯一标识符。
- /// 可选的场景进入参数,用于传递初始化数据。
- /// 表示压入操作完成的ValueTask。
- ValueTask PushAsync(string key, ISceneEnterParam? param = null);
-
- ///
- /// 异步弹出当前场景并恢复下一个场景。
- /// 当前场景会被卸载,栈中的下一个场景变为活动场景。
- ///
- /// 表示弹出操作完成的ValueTask。
- ValueTask PopAsync();
-
- ///
- /// 异步清空所有已加载的场景。
- /// 卸载场景栈中的所有场景,使系统回到无场景状态。
- ///
- /// 表示清空操作完成的ValueTask。
- ValueTask ClearAsync();
-
- ///
- /// 异步加载指定场景并返回场景行为实例。
- /// 此方法仅加载场景资源但不激活场景,通常用于预加载或后台加载场景。
- ///
- /// 要加载的场景唯一标识符。
- /// 表示加载操作完成的ValueTask,包含加载成功的场景行为对象。
- ValueTask LoadAsync(string sceneKey);
-
- ///
- /// 异步卸载指定的场景行为实例。
- /// 释放场景占用的资源并从系统中移除该场景实例。
- ///
- /// 要卸载的场景行为实例。
- /// 表示卸载操作完成的ValueTask。
- ValueTask UnloadAsync(ISceneBehavior scene);
+ /// 要移除的场景行为实例。
+ void RemoveScene(ISceneBehavior scene);
}
\ No newline at end of file
diff --git a/GFramework.Game/scene/SceneRouterBase.cs b/GFramework.Game/scene/SceneRouterBase.cs
index 04052a2..a557845 100644
--- a/GFramework.Game/scene/SceneRouterBase.cs
+++ b/GFramework.Game/scene/SceneRouterBase.cs
@@ -222,7 +222,7 @@ public abstract class SceneRouterBase
///
/// 内部推送场景实现方法。
- /// 执行守卫检查、场景加载、暂停当前场景、压入栈等操作。
+ /// 执行守卫检查、场景创建、添加到场景树、加载资源、暂停当前场景、压入栈等操作。
///
/// 场景键名。
/// 场景进入参数。
@@ -244,8 +244,11 @@ public abstract class SceneRouterBase
return;
}
- // 通过 Root 加载场景(Root.LoadAsync 返回 ISceneBehavior)
- var scene = await Root!.LoadAsync(sceneKey);
+ // 通过 Factory 创建场景实例
+ var scene = _factory.Create(sceneKey);
+
+ // 添加到场景树
+ Root!.AddScene(scene);
// 加载资源
await scene.OnLoadAsync(param);
@@ -297,7 +300,7 @@ public abstract class SceneRouterBase
///
/// 内部弹出场景实现方法。
- /// 执行守卫检查、退出场景、卸载资源、恢复下一个场景等操作。
+ /// 执行守卫检查、退出场景、卸载资源、从场景树移除、恢复下一个场景等操作。
///
/// 异步任务。
private async ValueTask PopInternalAsync()
@@ -322,8 +325,8 @@ public abstract class SceneRouterBase
// 卸载资源
await top.OnUnloadAsync();
- // 从场景树卸载
- await Root!.UnloadAsync(top);
+ // 从场景树移除
+ Root!.RemoveScene(top);
// 恢复下一个场景
if (_stack.Count > 0)