// 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