(client) feat:状态UI

This commit is contained in:
m0_75251201
2025-09-02 11:08:15 +08:00
parent 49d32a99b6
commit ce04c8cec8
54 changed files with 7224 additions and 835 deletions

View File

@ -19,11 +19,13 @@ namespace Base
public float globalVolume = 1.0f;
public WindowMode currentWindowMode = WindowMode.Fullscreen;
public Vector2Int windowResolution = new(1920, 1080);
public string[] loadOrder;
}
// 当前游戏设置
public GameSettings CurrentSettings = new();
// 窗口模式枚举
public enum WindowMode { Fullscreen, Windowed, Borderless }

View File

@ -1,3 +1,4 @@
using System; // Added for Action
using System.Collections.Generic;
using System.Linq;
using UI;
@ -19,6 +20,13 @@ namespace Base
private bool needUpdate = false;
/// <summary>
/// 当UI窗口的可见性状态发生改变时触发的事件。
/// 参数1: 发生改变的UIBase实例。
/// 参数2: 窗口的新可见状态 (true为显示false为隐藏)。
/// </summary>
public event Action<UIBase, bool> OnWindowVisibilityChanged; // <--- 新增
/// <summary>
/// 获取所有已注册的UI窗口的总数量。
/// </summary>
@ -93,7 +101,7 @@ namespace Base
// 确保窗口不为空且其GameObject未被销毁
if (window != null && window.gameObject != null)
{
window.Hide();
window.Hide(); // 隐藏操作会触发 OnWindowVisibilityChanged 事件
}
}
@ -173,6 +181,9 @@ namespace Base
if (itick != null)
Base.Clock.AddTickUI(itick);
// 触发事件通知窗口可见性已改变
OnWindowVisibilityChanged?.Invoke(windowToShow, true); // <--- 修改点 2
needUpdate = true;
}
@ -208,6 +219,9 @@ namespace Base
// 这防止了隐藏窗口继续被Tick避免性能开销和潜在的NullReferenceException。
if (windowToHide is ITickUI iTick)
Base.Clock.RemoveTickUI(iTick);
// 触发事件通知窗口可见性已改变
OnWindowVisibilityChanged?.Invoke(windowToHide, false); // <--- 修改点 3
needUpdate = true;
}
@ -241,7 +255,7 @@ namespace Base
// 再次检查窗口是否仍然可见,因为其他操作可能已经隐藏了它
if (visibleWindow != null && visibleWindow.IsVisible)
{
Hide(visibleWindow);
Hide(visibleWindow); // Hide() 方法会触发 OnWindowVisibilityChanged 事件
}
}
}
@ -281,6 +295,10 @@ namespace Base
private void OnDestroy()
{
SceneManager.sceneLoaded -= OnSceneLoaded;
// 在销毁时清空所有订阅者防止因MonoSingleton持久化导致下一场景重新加载时出现旧的订阅者如果单例不销毁事件本身也不会自动清空订阅
// 如果 UIInputControl 是一个会随场景销毁的普通 MonoBehaviour 而不是持久化的 MonoSingleton, 某些情况下清除订阅者可以防止跨场景的引用问题。
// 但对于 MonoSingleton它通常是持久化的所以事件在重新加载场景后仍然保留。明确清空可以避免不必要的资源占用虽然在应用程序关闭时会自动释放。
// OnWindowVisibilityChanged = null; // 谨慎使用如果外部有长期订阅的需求清空可能导致问题。通常更推荐外部在OnDestroy中取消订阅。
}
/// <summary>