UI系统优化
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using BaseGames.Core;
|
||||
@@ -25,9 +26,8 @@ namespace BaseGames.UI
|
||||
|
||||
private void OnDeviceChanged(InputDeviceType _)
|
||||
{
|
||||
// 通知场景内所有 InputIconImage 刷新(含非本对象子节点的其他 Canvas 区域)
|
||||
foreach (var img in FindObjectsByType<InputIconImage>(FindObjectsInactive.Include, FindObjectsSortMode.None))
|
||||
img.Refresh();
|
||||
// 通过静态注册表刷新,O(n) 遍历已启用实例,无需全场景搜索
|
||||
InputIconImage.RefreshAll();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,6 +57,19 @@ namespace BaseGames.UI
|
||||
private Image _image;
|
||||
private IInputIconService _iconService;
|
||||
|
||||
// ── 静态注册表:替换 FindObjectsByType,O(1) 注册/注销,O(n) 广播 ────────
|
||||
private static readonly List<InputIconImage> _registry = new();
|
||||
|
||||
/// <summary>通知注册表内所有已启用实例刷新图标(设备切换时调用)。</summary>
|
||||
internal static void RefreshAll()
|
||||
{
|
||||
for (int i = _registry.Count - 1; i >= 0; i--)
|
||||
{
|
||||
if (_registry[i] != null) _registry[i].Refresh();
|
||||
else _registry.RemoveAt(i); // 清理已销毁的残留引用
|
||||
}
|
||||
}
|
||||
|
||||
private void Awake() => _image = GetComponent<Image>();
|
||||
|
||||
private void OnEnable()
|
||||
@@ -64,6 +77,7 @@ namespace BaseGames.UI
|
||||
_iconService = ServiceLocator.GetOrDefault<IInputIconService>();
|
||||
if (_iconService != null)
|
||||
_iconService.OnIconSetChanged += Refresh;
|
||||
_registry.Add(this);
|
||||
Refresh();
|
||||
}
|
||||
|
||||
@@ -71,6 +85,7 @@ namespace BaseGames.UI
|
||||
{
|
||||
if (_iconService != null)
|
||||
_iconService.OnIconSetChanged -= Refresh;
|
||||
_registry.Remove(this);
|
||||
}
|
||||
|
||||
/// <summary>刷新图标显示。设备切换或改键后由 InputDeviceIconSwitcher / InputIconService 调用。</summary>
|
||||
@@ -86,9 +101,8 @@ namespace BaseGames.UI
|
||||
}
|
||||
else if (_mode == LookupMode.ByBindingPath && !string.IsNullOrEmpty(_bindingPath))
|
||||
{
|
||||
// 使用固定路径直接在当前图标集上查找(不考虑改键)
|
||||
// 此分支通常用于装饰性按键说明,不依赖服务
|
||||
sprite = null; // 图标集访问须通过 InputIconService,ByBindingPath 模式已列入低优先级
|
||||
// 使用固定路径在当前图标集查找(不随改键变化),适合装饰性按键说明
|
||||
sprite = _iconService?.GetPathIcon(_bindingPath);
|
||||
}
|
||||
|
||||
if (sprite != null)
|
||||
|
||||
Reference in New Issue
Block a user