// Copyright (c) 2025 EFramework Innovation. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. using System; using EFramework.Unity.Utility; namespace EFramework.Unity.MVVM { /// /// XScene 提供了业务开发的基础场景,支持业务场景的切换及其生命周期管理。 /// /// /// /// 功能特性 /// - 业务场景切换:通过状态机模式实现业务场景的切换功能 /// - 生命周期管理:提供了 Start、Update、Stop 等状态控制 /// /// 使用手册 /// 1. 定义场景 /// /// // 基础场景 /// public class MyScene : XScene.Base /// { /// public override string Name => "MyScene"; /// } /// /// // 单例场景 /// public class MySingletonScene : XScene.Base<MySingletonScene> /// { /// public override string Name => "MySingletonScene"; /// } /// /// 2. 场景管理 /// /// 2.1 场景切换 /// /// // 切换业务场景 /// XScene.Goto(scene, args); /// /// // 设置代理实例 /// XScene.OnProxy = proxy => new MyScene(proxy); /// /// 2.2 场景状态 /// /// // 获取当前场景 /// var current = XScene.Current; /// /// // 获取上一场景 /// var last = XScene.Last; /// /// // 获取下一场景 /// var next = XScene.Next; /// /// // 监听场景切换 /// XScene.OnSwap += () => { /// // 场景切换完成后的处理逻辑 /// }; /// /// /// 更多信息请参考场景文档。 /// #region 基础场景 public partial class XScene { /// /// 定义了场景的基础接口,包含场景的基本属性和生命周期方法。 /// public interface IBase { /// /// 获取场景名称。 /// string Name { get; } /// /// 场景初始化时调用。 /// void Awake(); /// /// 场景启动时调用。 /// /// 启动参数 void Start(params object[] args); /// /// 场景每帧更新时调用。 /// void Update(); /// /// 重置场景状态。 /// void Reset(); /// /// 停止场景运行。 /// void Stop(); } /// /// 提供了场景的基础实现,继承自模块系统并实现场景接口。 /// public class Base : XModule.Base, IBase { /// /// 场景每帧更新时的默认实现。 /// public virtual void Update() { } } /// /// 提供了场景的单例模式支持,自动管理场景实例的生命周期。 /// /// 场景类型 public class Base : Base where TScene : IBase, new() { internal static TScene instance; /// /// 获取场景的单例实例,如果未创建则自动创建并初始化。 /// public static TScene Instance { get { if (instance == null) { instance = new TScene(); instance.Awake(); } return instance; } } } } #endregion #region 场景管理 public partial class XScene { /// /// 场景切换完成时触发的事件。 /// public static event Action OnSwap; /// /// 场景代理函数,用于将场景对象转换为场景接口。 /// public static Func OnProxy; /// /// 获取上一场景。 /// public static IBase Last { get; internal set; } /// /// 获取当前场景。 /// public static IBase Current { get; internal set; } /// /// 获取下一场景。 /// public static IBase Next { get; internal set; } internal static object[] Args; internal static bool Inited; /// /// 更新场景状态,处理场景切换逻辑。 /// internal static void Update() { Current?.Update(); if (Next != null) { Current?.Reset(); Current?.Stop(); Last = Current; Current = Next; Next = null; var args = Args; Args = null; Current?.Start(args); OnSwap?.Invoke(); } } /// /// 切换到指定场景,使用场景代理进行转换。 /// /// 目标场景对象 /// 场景启动参数 /// 当场景代理未设置时抛出异常 public static void Goto(object scene, params object[] args) { if (OnProxy == null) throw new Exception("OnProxy is null"); Goto(OnProxy.Invoke(scene), args); } /// /// 切换到指定场景。 /// /// 目标场景 /// 场景启动参数 public static void Goto(IBase scene, params object[] args) { Next = scene; Args = args; if (!Inited) { Inited = true; XLoom.SetInterval(Update, 0); } } } #endregion }