2025-12-25 20:26:05 +08:00
|
|
|
|
using Cysharp.Threading.Tasks;
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// UI返回键策略接口
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public interface IUIBackStrategy
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 处理返回键
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="window">触发返回的窗口</param>
|
|
|
|
|
|
/// <returns>是否成功处理</returns>
|
|
|
|
|
|
UniTask<bool> HandleBack(UIWindow window);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 策略1:不响应返回键
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class UIBackStrategy_None : IUIBackStrategy
|
|
|
|
|
|
{
|
|
|
|
|
|
public async UniTask<bool> HandleBack(UIWindow window)
|
|
|
|
|
|
{
|
|
|
|
|
|
// 不响应,返回false让下一个窗口处理
|
|
|
|
|
|
await UniTask.CompletedTask;
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 策略2:关闭自己
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class UIBackStrategy_CloseSelf : IUIBackStrategy
|
|
|
|
|
|
{
|
|
|
|
|
|
public async UniTask<bool> HandleBack(UIWindow window)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (window != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
window.CloseWindow(destroy: true);
|
|
|
|
|
|
DebugUtil.Log($"[BackStrategy] Close window: {window.WindowName}");
|
|
|
|
|
|
await UniTask.CompletedTask;
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 策略3:什么都不做(拦截返回键但不执行任何操作)
|
|
|
|
|
|
/// 适用场景:剧情播放中、加载中等不希望用户中断的场景
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class UIBackStrategy_DoNothing : IUIBackStrategy
|
|
|
|
|
|
{
|
|
|
|
|
|
public async UniTask<bool> HandleBack(UIWindow window)
|
|
|
|
|
|
{
|
|
|
|
|
|
// 拦截返回键,但什么都不做
|
|
|
|
|
|
DebugUtil.Log($"[BackStrategy] Back blocked by: {window?.WindowName}");
|
|
|
|
|
|
await UniTask.CompletedTask;
|
|
|
|
|
|
return true; // 返回true表示已处理,阻止继续传递
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 策略4:弹出退出游戏确认界面
|
|
|
|
|
|
/// 适用场景:主界面、登录界面等根界面
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class UIBackStrategy_ShowExitConfirm : IUIBackStrategy
|
|
|
|
|
|
{
|
|
|
|
|
|
public async UniTask<bool> HandleBack(UIWindow window)
|
|
|
|
|
|
{
|
|
|
|
|
|
// 检查退出确认界面是否已经打开
|
|
|
|
|
|
if (!UIManager.Instance.CheckWindowCreated(UINameConst.UIBackReturn))
|
|
|
|
|
|
{
|
|
|
|
|
|
await UIManager.Instance.CreateAndOpenWindow(UINameConst.UIBackReturn);
|
|
|
|
|
|
DebugUtil.Log($"[BackStrategy] Show exit confirm from: {window?.WindowName}");
|
|
|
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 返回策略工厂
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public static class UIBackStrategyFactory
|
|
|
|
|
|
{
|
|
|
|
|
|
private static UIBackStrategy_None _noneStrategy;
|
|
|
|
|
|
private static UIBackStrategy_CloseSelf _closeSelfStrategy;
|
|
|
|
|
|
private static UIBackStrategy_DoNothing _doNothingStrategy;
|
|
|
|
|
|
private static UIBackStrategy_ShowExitConfirm _showExitConfirmStrategy;
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 根据策略类型创建策略实例
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public static IUIBackStrategy CreateStrategy(UIBackStrategyType strategyType)
|
|
|
|
|
|
{
|
|
|
|
|
|
switch (strategyType)
|
|
|
|
|
|
{
|
2025-12-26 12:16:37 +08:00
|
|
|
|
case UIBackStrategyType.PassThrough:
|
2025-12-25 20:26:05 +08:00
|
|
|
|
return GetNoneStrategy();
|
|
|
|
|
|
case UIBackStrategyType.CloseSelf:
|
|
|
|
|
|
return GetCloseSelfStrategy();
|
2025-12-26 12:16:37 +08:00
|
|
|
|
case UIBackStrategyType.Intercept:
|
2025-12-25 20:26:05 +08:00
|
|
|
|
return GetDoNothingStrategy();
|
|
|
|
|
|
case UIBackStrategyType.ShowExitConfirm:
|
|
|
|
|
|
return GetShowExitConfirmStrategy();
|
|
|
|
|
|
default:
|
|
|
|
|
|
return GetCloseSelfStrategy(); // 默认关闭自己
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 获取"不响应"策略实例(单例)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public static IUIBackStrategy GetNoneStrategy()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_noneStrategy == null)
|
|
|
|
|
|
_noneStrategy = new UIBackStrategy_None();
|
|
|
|
|
|
return _noneStrategy;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 获取"关闭自己"策略实例(单例)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public static IUIBackStrategy GetCloseSelfStrategy()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_closeSelfStrategy == null)
|
|
|
|
|
|
_closeSelfStrategy = new UIBackStrategy_CloseSelf();
|
|
|
|
|
|
return _closeSelfStrategy;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 获取"什么都不做"策略实例(单例)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public static IUIBackStrategy GetDoNothingStrategy()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_doNothingStrategy == null)
|
|
|
|
|
|
_doNothingStrategy = new UIBackStrategy_DoNothing();
|
|
|
|
|
|
return _doNothingStrategy;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 获取"弹出退出确认"策略实例(单例)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public static IUIBackStrategy GetShowExitConfirmStrategy()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_showExitConfirmStrategy == null)
|
|
|
|
|
|
_showExitConfirmStrategy = new UIBackStrategy_ShowExitConfirm();
|
|
|
|
|
|
return _showExitConfirmStrategy;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|