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)