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)