(client) feat:状态UI
This commit is contained in:
@ -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>
|
||||
|
Reference in New Issue
Block a user